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