core/vcsl/vcsl_composition.cxx
Go to the documentation of this file.
00001 // This is core/vcsl/vcsl_composition.cxx
00002 #include "vcsl_composition.h"
00003 #include <vcl_cassert.h>
00004 
00005 //---------------------------------------------------------------------------
00006 // Is `this' invertible at time `time'?
00007 // REQUIRE: valid_time(time)
00008 //---------------------------------------------------------------------------
00009 bool vcsl_composition::is_invertible(double time) const
00010 {
00011   // require
00012   assert(valid_time(time));
00013 
00014   vcl_vector<vcsl_spatial_transformation_sptr>::const_iterator i;
00015 
00016   bool result=true;
00017   for (i=transformations_.begin();result&&i!=transformations_.end();++i)
00018     result=(*i)->is_invertible(time);
00019 
00020   return result;
00021 }
00022 
00023 //---------------------------------------------------------------------------
00024 // Is `this' correctly set ?
00025 //---------------------------------------------------------------------------
00026 bool vcsl_composition::is_valid() const
00027 {
00028   vcl_vector<vcsl_spatial_transformation_sptr>::const_iterator i;
00029   for (i=transformations_.begin(); i!=transformations_.end(); ++i)
00030     if (!(*i)->is_valid()) return false;
00031 
00032   return true;
00033 }
00034 
00035 //---------------------------------------------------------------------------
00036 // Image of `v' by `this'
00037 // REQUIRE: is_valid()
00038 //---------------------------------------------------------------------------
00039 vnl_vector<double> vcsl_composition::execute(const vnl_vector<double> &v,
00040                                              double time) const
00041 {
00042   // require
00043   assert(is_valid());
00044 
00045   vnl_vector<double> result = v;
00046 
00047   vcl_vector<vcsl_spatial_transformation_sptr>::const_iterator i;
00048   for (i=transformations_.begin();i!=transformations_.end();++i)
00049     result=(*i)->execute(result,time);
00050   return result;
00051 }
00052 
00053 //---------------------------------------------------------------------------
00054 // Image of `v' by the inverse of `this'
00055 // REQUIRE: is_valid()
00056 // REQUIRE: is_invertible(time)
00057 //---------------------------------------------------------------------------
00058 vnl_vector<double> vcsl_composition::inverse(const vnl_vector<double> &v,
00059                                              double time) const
00060 {
00061   // require
00062   assert(is_valid());
00063   assert(is_invertible(time));
00064 
00065   vnl_vector<double> result = v;
00066 
00067   vcl_vector<vcsl_spatial_transformation_sptr>::const_reverse_iterator i;
00068   for (i=transformations_.rbegin();!(i==transformations_.rend());++i)
00069     result=(*i)->inverse(result,time);
00070   return result;
00071 }
00072