contrib/mul/vil3d/vil3d_chord.h
Go to the documentation of this file.
00001 // This is mul/vil3d/vil3d_chord.h
00002 #ifndef vil3d_chord_h_
00003 #define vil3d_chord_h_
00004 //:
00005 // \file
00006 // \author Tim Cootes
00007 // \brief Horizontal line used in 3D images, with integer co-ordinates
00008 
00009 #include <vsl/vsl_binary_io.h>
00010 #include <vcl_vector.h>
00011 
00012 //: Horizontal line used in 3D images, with integer co-ordinates
00013 class vil3d_chord
00014 {
00015 private:
00016   int start_x_;
00017   int end_x_;
00018   int y_;
00019   int z_;
00020 public:
00021     //: Constructor
00022   vil3d_chord() : start_x_(0),end_x_(-1),y_(0),z_(0) {}
00023 
00024     //: Constructor
00025   vil3d_chord(int start_x, int end_x, int y, int z)
00026     : start_x_(start_x), end_x_(end_x), y_(y), z_(z) {}
00027 
00028     //: X-ordinate of start
00029   int start_x() const { return start_x_; }
00030 
00031     //: X-ordinate of end
00032   int end_x() const { return end_x_; }
00033 
00034     //: y-ordinate
00035   int y() const { return y_; }
00036 
00037     //: z-ordinate
00038   int z() const { return z_; }
00039 
00040     //: Length
00041   int length() const { return 1+end_x_-start_x_; }
00042 
00043     //: Write to binary stream
00044   inline void b_write(vsl_b_ostream& bfs) const;
00045 
00046     //: Read from binary stream
00047   inline void b_read(vsl_b_istream& bfs);
00048 
00049     //: Comparison
00050   bool operator==(const vil3d_chord& c) const;
00051 };
00052 
00053 //: Computes number of voxels in region 
00054 //  Assumes chords do not overlap
00055 inline unsigned vil3d_volume(const vcl_vector<vil3d_chord>& chords)
00056 {
00057   if (chords.size()==0) return 0;
00058   unsigned n=0;
00059   vcl_vector<vil3d_chord>::const_iterator c = chords.begin();
00060   for (;c!=chords.end();++c) n+=c->length();
00061   return n;
00062 }
00063 
00064 
00065     //: Write to binary stream
00066 inline void vil3d_chord::b_write(vsl_b_ostream& bfs) const
00067 {
00068   vsl_b_write(bfs,start_x_);
00069   vsl_b_write(bfs,end_x_);
00070   vsl_b_write(bfs,y_);
00071   vsl_b_write(bfs,z_);
00072 }
00073 
00074 //: Read from binary stream
00075 inline void vil3d_chord::b_read(vsl_b_istream& bfs)
00076 {
00077   vsl_b_read(bfs,start_x_);
00078   vsl_b_read(bfs,end_x_);
00079   vsl_b_read(bfs,y_);
00080   vsl_b_read(bfs,z_);
00081 }
00082 
00083 inline bool vil3d_chord::operator==(const vil3d_chord& c) const
00084 {
00085   return start_x_ ==c.start_x_ && end_x_==c.end_x_ && y_==c.y_ && z_==c.z_;
00086 }
00087 
00088 //: Print
00089 inline vcl_ostream& operator<<(vcl_ostream& os, const vil3d_chord& c)
00090 {
00091   return os<<"(["<<c.start_x()<<","<<c.end_x()<<"],"<<c.y()<<","<<c.z()<<")";
00092 }
00093 
00094 //: Save
00095 inline void vsl_b_write(vsl_b_ostream& bfs, const vil3d_chord& t)
00096 {
00097   t.b_write(bfs);
00098 }
00099 
00100 //: Save
00101 inline void vsl_b_write(vsl_b_ostream& bfs, 
00102                         const vcl_vector<vil3d_chord>& t)
00103 {
00104   vsl_b_write(bfs,unsigned(t.size()));
00105   for (unsigned i=0;i<t.size();++i) t[i].b_write(bfs);
00106 }
00107 
00108 //: Load
00109 inline void vsl_b_read(vsl_b_istream& bfs, vil3d_chord& t)
00110 {
00111   t.b_read(bfs);
00112 }
00113 
00114 //: Load
00115 inline void vsl_b_read(vsl_b_istream& bfs,
00116                        vcl_vector<vil3d_chord>& t)
00117 {
00118   unsigned n;
00119   vsl_b_read(bfs,n);
00120   t.resize(n);
00121   for (unsigned i=0;i<n;++i) t[i].b_read(bfs);
00122 }
00123 
00124 //: Print
00125 inline void vsl_print_summary(vcl_ostream& os, const vil3d_chord& t)
00126 {
00127   os<<t;
00128 }
00129 
00130 #endif // vil3d_chord_h_