00001
00002 #include "rsdl_point.h"
00003
00004
00005
00006 #include <vcl_cassert.h>
00007 #include <vcl_iostream.h>
00008 #include <vnl/vnl_vector.h>
00009
00010 rsdl_point::rsdl_point( )
00011 : Nc_(0), Na_(0), data_(0)
00012 {
00013 }
00014
00015 rsdl_point::rsdl_point( unsigned int Nc, unsigned int Na )
00016 : Nc_(Nc), Na_(Na), data_( new double[ Nc_ + Na_ ] )
00017 {
00018 }
00019
00020 rsdl_point::rsdl_point( const_iterator c_begin, const_iterator c_end,
00021 const_iterator a_begin, const_iterator a_end )
00022 : Nc_( unsigned(c_end - c_begin) ),
00023 Na_( unsigned(a_end - a_begin) ),
00024 data_( new double[ Nc_ + Na_ ] )
00025 {
00026 for ( unsigned int i=0; i<Nc_; ++i ) data_[ i ] = * ( c_begin + i );
00027 for ( unsigned int j=0; j<Na_; ++j ) data_[ Nc_ +j ]= * ( a_begin + j );
00028 }
00029
00030
00031 rsdl_point::rsdl_point( const vnl_vector<double>& c, const vnl_vector<double>& a )
00032 : Nc_( c.size() ), Na_( a.size() ), data_( new double[ Nc_ + Na_ ] )
00033 {
00034 for ( unsigned int i=0; i<Nc_; ++i ) data_[ i ] = c[i];
00035 for ( unsigned int j=0; j<Na_; ++j ) data_[ Nc_ + j ]= a[j];
00036 }
00037
00038
00039 rsdl_point::rsdl_point( const rsdl_point& old )
00040 : Nc_( old.Nc_ ), Na_( old.Na_ ), data_( new double[ Nc_ + Na_ ] )
00041 {
00042 for ( unsigned int i=0; i< Nc_ + Na_ ; ++i ) data_[i] = old.data_[i];
00043 }
00044
00045
00046 rsdl_point::rsdl_point( const vnl_vector<double>& all, unsigned int Na )
00047 : Nc_( all.size() - Na ), Na_( Na )
00048 {
00049 assert( all.size() >= Na );
00050 data_ = new double[ Nc_ + Na_ ];
00051 for ( unsigned int i=0; i< Nc_ + Na_; ++i )
00052 data_[i] = all[i];
00053 }
00054
00055 rsdl_point::~rsdl_point()
00056 {
00057 delete [] data_;
00058 }
00059
00060
00061 void
00062 rsdl_point::set_cartesian( const vnl_vector<double>& c )
00063 {
00064 assert ( c.size() == Nc_ );
00065 for ( unsigned int i=0; i<Nc_; ++i )
00066 data_[i] = c[i];
00067 }
00068
00069
00070 void
00071 rsdl_point::set_cartesian( const_iterator c )
00072 {
00073 for ( unsigned int i=0; i<Nc_; ++i, ++c )
00074 data_[i] = *c;
00075 }
00076
00077
00078 void
00079 rsdl_point::set_angular( const vnl_vector<double>& a )
00080 {
00081 assert ( a.size() == Na_ );
00082 for ( unsigned int i=0; i<Na_; ++i )
00083 data_[ Nc_ + i ] = a[i];
00084 }
00085
00086
00087 void
00088 rsdl_point::set_all( const vnl_vector<double>& all )
00089 {
00090 assert ( all.size() == Nc_ + Na_ );
00091 for ( unsigned int i=0; i < Nc_ + Na_; ++i )
00092 data_[i] = all[i];
00093 }
00094
00095
00096 void
00097 rsdl_point::set_angular( const_iterator a )
00098 {
00099 for ( unsigned int i=0; i<Na_; ++i, ++a )
00100 data_[Nc_+i] = *a;
00101 }
00102
00103
00104 rsdl_point &
00105 rsdl_point::operator= ( const rsdl_point& old )
00106 {
00107 if ( this != &old ) {
00108 if ( Nc_ + Na_ != old.Nc_ + old.Na_ ) {
00109 delete [] data_;
00110 data_ = new double[ old.Nc_ + old.Na_ ];
00111 }
00112 Nc_ = old.Nc_;
00113 Na_ = old.Na_;
00114 for ( unsigned int i=0; i < Nc_ + Na_; ++i ) data_[i] = old.data_[i];
00115 }
00116 return *this;
00117 }
00118
00119 void
00120 rsdl_point::resize( unsigned int Nc, unsigned int Na )
00121 {
00122 if ( Nc_ != Nc || Na_ != Na ) {
00123 double* buf = new double[ Nc + Na ];
00124 unsigned int min_c = ( Nc < Nc_ ? Nc : Nc_ );
00125 unsigned int min_a = ( Na < Na_ ? Na : Na_ );
00126 for ( unsigned int i=0; i < min_c; ++i ) buf[i] = data_[i];
00127 for ( unsigned int i=0; i < min_a; ++i ) buf[Nc+i] = data_[Nc_+i];
00128 delete[] data_;
00129 data_ = buf;
00130 Nc_ = Nc;
00131 Na_ = Na;
00132 }
00133 }
00134
00135 vcl_ostream& operator<< ( vcl_ostream& ostr, const rsdl_point& pt )
00136 {
00137 int Nc = pt.num_cartesian();
00138 int Na = pt.num_angular();
00139 int i;
00140 vcl_cout << "Cartesian: [";
00141 for ( i=0; i<Nc; ++i ) {
00142 vcl_cout << pt.cartesian(i);
00143 if ( i<Nc-1 ) vcl_cout << ",";
00144 }
00145 vcl_cout << "]; Angular: [";
00146 for ( i=0; i<Na; ++i ) {
00147 vcl_cout << pt.angular(i);
00148 if ( i<Na-1 ) vcl_cout << ",";
00149 }
00150 vcl_cout << "]";
00151 return ostr;
00152 }