Go to the documentation of this file.00001
00002 #include "vtol_vertex_2d.h"
00003
00004
00005
00006 #include <vsol/vsol_point_2d.h>
00007 #include <vtol/vtol_edge_2d.h>
00008 #include <vtol/vtol_edge.h>
00009 #include <vcl_cassert.h>
00010
00011
00012
00013
00014
00015
00016
00017
00018 vtol_vertex_2d::vtol_vertex_2d()
00019 {
00020 point_=new vsol_point_2d(0,0);
00021 }
00022
00023
00024
00025
00026 vtol_vertex_2d::vtol_vertex_2d(vsol_point_2d &new_point)
00027 {
00028
00029 point_=new vsol_point_2d(new_point);
00030 }
00031
00032
00033
00034
00035 vtol_vertex_2d::vtol_vertex_2d(const vnl_double_2 &v)
00036 {
00037 point_=new vsol_point_2d(v[0],v[1]);
00038 }
00039
00040
00041
00042
00043 vtol_vertex_2d::vtol_vertex_2d(const double new_x,
00044 const double new_y)
00045 {
00046 point_=new vsol_point_2d(new_x,new_y);
00047 }
00048
00049
00050
00051
00052 vtol_vertex_2d::vtol_vertex_2d(vtol_vertex_2d_sptr const& other)
00053 : point_(new vsol_point_2d(*other->point_))
00054 {
00055 }
00056
00057
00058
00059
00060
00061 vsol_spatial_object_2d* vtol_vertex_2d::clone() const
00062 {
00063 return new vtol_vertex_2d(vtol_vertex_2d_sptr(const_cast<vtol_vertex_2d*>(this)));
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073 vsol_point_2d_sptr vtol_vertex_2d::point() const
00074 {
00075 return point_;
00076 }
00077
00078
00079
00080
00081
00082 void vtol_vertex_2d::set_point(vsol_point_2d_sptr const& new_point)
00083 {
00084 point_=new_point;
00085 }
00086
00087
00088
00089
00090 double vtol_vertex_2d::x() const
00091 {
00092 return point_->x();
00093 }
00094
00095
00096
00097
00098 double vtol_vertex_2d::y() const
00099 {
00100 return point_->y();
00101 }
00102
00103
00104
00105
00106 void vtol_vertex_2d::set_x(const double new_x)
00107 {
00108
00109 #if 0
00110 point_=new vsol_point_2d(new_x,point_->y());
00111 #endif
00112 point_->set_x(new_x);
00113 this->touch();
00114 }
00115
00116
00117
00118
00119 void vtol_vertex_2d::set_y(const double new_y)
00120 {
00121
00122 #if 0
00123 point_=new vsol_point_2d(point_->x(),new_y);
00124 #endif
00125 point_->set_y(new_y);
00126 this->touch();
00127 }
00128
00129
00130
00131
00132
00133
00134 void vtol_vertex_2d::print(vcl_ostream &strm) const
00135 {
00136 strm<<"<vtol_vertex_2d "<<x()<<','<<y()<<','<<(void const *)this<<"> with id "
00137 <<get_id()<<vcl_endl;
00138 }
00139
00140
00141
00142 void vtol_vertex_2d::describe(vcl_ostream &strm,
00143 int blanking) const
00144 {
00145 for (int i=0; i<blanking; ++i)
00146 strm << ' ';
00147 print(strm);
00148 describe_inferiors(strm, blanking);
00149 describe_superiors(strm, blanking);
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 vtol_edge_sptr vtol_vertex_2d::new_edge(vtol_vertex_2d_sptr const& other)
00163 {
00164
00165 assert(other);
00166 #if 0 //temporarily disabled
00167 assert(*other != *this);
00168 #endif // 0
00169
00170
00171 vtol_edge_sptr result = 0;
00172
00173
00174 bool found = false;
00175 vtol_vertex_sptr v = other->cast_to_vertex();
00176 vcl_list<vtol_topology_object*>::const_iterator zp;
00177 for (zp=superiors_.begin();zp!=superiors_.end()&&!found;++zp)
00178 {
00179
00180 const vcl_list<vtol_topology_object*> *sups=(*zp)->superiors_list();
00181 vcl_list<vtol_topology_object*>::const_iterator ep;
00182 for (ep=sups->begin();ep!=sups->end()&&!found;++ep)
00183 {
00184 vtol_edge_sptr e=(*ep)->cast_to_edge();
00185 if (e->v1()==v||e->v2()==v)
00186 { result=e; found = true; }
00187 }
00188 }
00189 if (!result)
00190 result= new vtol_edge_2d(this,other);
00191
00192 return result;
00193 }
00194
00195 vtol_edge_sptr vtol_vertex_2d::new_edge(vtol_vertex_sptr const& other)
00196 {
00197 return new_edge(vtol_vertex_2d_sptr(other->cast_to_vertex_2d()));
00198 }
00199
00200
00201 double vtol_vertex_2d::distance_from(const vnl_double_2 &v)
00202 {
00203 vsol_point_2d point(v(0),v(1));
00204 return point_->distance(point);
00205 }
00206
00207
00208 double vtol_vertex_2d::euclidean_distance(vtol_vertex_2d& v)
00209 {
00210 return point_->distance(*v.point());
00211 }
00212
00213
00214
00215
00216
00217 vtol_vertex_2d &vtol_vertex_2d::operator=(const vtol_vertex_2d &other)
00218 {
00219 if (this!=&other)
00220 {
00221 this->touch();
00222
00223 point_=new vsol_point_2d(*(other.point_));
00224 }
00225 return *this;
00226 }
00227
00228 vtol_vertex_2d& vtol_vertex_2d::operator=(const vtol_vertex &other)
00229 {
00230 if (this!=&other)
00231 {
00232 this->touch();
00233
00234 point_=new vsol_point_2d(*(other.cast_to_vertex_2d()->point_));
00235 }
00236 return *this;
00237 }
00238
00239
00240
00241
00242
00243 bool vtol_vertex_2d::operator==(const vsol_spatial_object_2d& obj) const
00244 {
00245 return
00246 obj.cast_to_topology_object() &&
00247 obj.cast_to_topology_object()->cast_to_vertex() &&
00248 *this == *obj.cast_to_topology_object()->cast_to_vertex();
00249 }
00250
00251
00252
00253
00254 bool vtol_vertex_2d::operator== (const vtol_vertex &other) const
00255 {
00256 return other.cast_to_vertex_2d() && other.cast_to_vertex_2d()->operator==(*this);
00257 }
00258
00259
00260
00261
00262 bool vtol_vertex_2d::operator== (const vtol_vertex_2d &other) const
00263 {
00264 return this==&other || *point_==*(other.point_);
00265 }
00266
00267
00268
00269
00270
00271
00272
00273 void vtol_vertex_2d::copy_geometry(const vtol_vertex &other)
00274 {
00275 if (other.cast_to_vertex_2d()){
00276 point_ = new vsol_point_2d(*(other.cast_to_vertex_2d()->point()));
00277 }
00278 }
00279
00280
00281
00282
00283
00284 bool vtol_vertex_2d::compare_geometry(const vtol_vertex &other) const
00285 {
00286 return other.cast_to_vertex_2d() && (*point_)==(*(other.cast_to_vertex_2d()->point()));
00287 }
00288
00289 void vtol_vertex_2d::compute_bounding_box() const
00290 {
00291 set_bounding_box(this->x(), this->y());
00292 }