contrib/rpl/rsdl/rsdl_point.cxx

Go to the documentation of this file.
00001 // This is rpl/rsdl/rsdl_point.cxx
00002 #include "rsdl_point.h"
00003 //:
00004 //  \file
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 ); // Nc_ is always >= 0  :-)
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 //: \brief  Establish the cartesian and angular values from a vnl_vector.  Size is checked.
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 }

Generated on Mon Mar 8 05:26:58 2010 for contrib/rpl/rsdl by  doxygen 1.5.1