1 // This is brl/bbas/bmsh3d/bmsh3d_pt_set.h 2 //--------------------------------------------------------------------- 3 #ifndef bmsh3d_pt_set_h_ 4 #define bmsh3d_pt_set_h_ 5 //: 6 // \file 7 // \brief 3d point set 8 // 9 // \author 10 // MingChing Chang Feb 10, 2005 11 // 12 // \verbatim 13 // Modifications 14 // <none> 15 // \endverbatim 16 // 17 //------------------------------------------------------------------------- 18 19 #include <iostream> 20 #include <map> 21 #include <utility> 22 #ifdef _MSC_VER 23 # include <vcl_msvc_warnings.h> 24 #endif 25 #include <vgl/vgl_fwd.h> 26 27 #include "bmsh3d_vertex.h" 28 29 class bmsh3d_pt_set 30 { 31 protected: 32 //: The modified-halfedge mesh vertex data structure. 33 std::map<int, bmsh3d_vertex*> vertexmap_; 34 35 //: traversal position of next vertex 36 std::map<int, bmsh3d_vertex* >::iterator vertex_traversal_pos_; 37 38 int vertex_id_counter_; 39 40 bool b_free_objects_in_destructor_; 41 42 public: 43 //###### Constructor/Destructor ###### bmsh3d_pt_set()44 bmsh3d_pt_set () { 45 b_free_objects_in_destructor_ = true; 46 vertex_id_counter_ = 0; 47 } bmsh3d_pt_set(bool b_free_objects)48 bmsh3d_pt_set (bool b_free_objects) { 49 b_free_objects_in_destructor_ = b_free_objects; 50 vertex_id_counter_ = 0; 51 } 52 53 //: 54 // if you get free memory error, check if use 55 // pointset->_new_vertex() instead of using 'new bmsh3d_vertex' in the code 56 // for each object clear()57 virtual void clear () { 58 vertex_id_counter_ = 0; 59 if (b_free_objects_in_destructor_) { //Skip already released objects. 60 std::map<int, bmsh3d_vertex*>::iterator it = vertexmap_.begin(); 61 for (; it != vertexmap_.end(); it++) 62 _del_vertex ((*it).second); 63 vertexmap_.clear(); 64 } 65 } 66 ~bmsh3d_pt_set()67 virtual ~bmsh3d_pt_set() { 68 clear (); 69 } 70 71 //###### Data access functions ###### 72 num_vertices()73 unsigned int num_vertices() const { 74 return this->vertexmap_.size(); 75 } 76 vertexmap()77 std::map<int, bmsh3d_vertex*>& vertexmap() { 78 return vertexmap_; 79 } vertexmap(const int i)80 bmsh3d_vertex* vertexmap (const int i) { 81 std::map<int, bmsh3d_vertex*>::iterator it = vertexmap_.find (i); 82 if (it == vertexmap_.end()) 83 return nullptr; 84 return (*it).second; 85 } 86 vertex_id_counter()87 int vertex_id_counter() const { 88 return vertex_id_counter_; 89 } set_vertex_id_counter(const int counter)90 void set_vertex_id_counter (const int counter) { 91 vertex_id_counter_ = counter; 92 } b_free_objects_in_destructor()93 bool b_free_objects_in_destructor() const { 94 return b_free_objects_in_destructor_; 95 } set_free_objects_in_destructor(const bool b)96 void set_free_objects_in_destructor (const bool b) { 97 b_free_objects_in_destructor_ = b; 98 } 99 contains_V(const int vid)100 bool contains_V (const int vid) { 101 std::map<int, bmsh3d_vertex*>::iterator it = vertexmap_.find (vid); 102 return it != vertexmap_.end(); 103 } 104 105 //###### Connectivity Modification Functions ###### 106 107 //: new/delete function of the class hierarchy _new_vertex()108 virtual bmsh3d_vertex* _new_vertex () { 109 return new bmsh3d_vertex (vertex_id_counter_++); 110 } _new_vertex(const int id)111 virtual bmsh3d_vertex* _new_vertex (const int id) { 112 if (vertex_id_counter_ <= id) 113 vertex_id_counter_ = id+1; 114 return new bmsh3d_vertex (id); 115 } _del_vertex(bmsh3d_vertex * v)116 virtual void _del_vertex (bmsh3d_vertex* v) { 117 delete v; 118 } 119 _add_vertex(bmsh3d_vertex * V)120 void _add_vertex (bmsh3d_vertex* V) { 121 vertexmap_.insert (std::pair<int, bmsh3d_vertex*>(V->id(), V)); 122 } 123 124 void reset_vertices_ids (); 125 126 //###### Vertex traversal functions ###### 127 128 //: initialize vertex traversal reset_vertex_traversal()129 void reset_vertex_traversal() { 130 this->vertex_traversal_pos_ = this->vertexmap_.begin(); 131 } 132 133 //: get the next vertex. Return false if no more vertex left on the list next_vertex(bmsh3d_vertex * & v)134 bool next_vertex(bmsh3d_vertex* &v) { 135 if (this->vertex_traversal_pos_ == this->vertexmap_.end()) return false; 136 v = this->vertex_traversal_pos_->second; 137 ++ this->vertex_traversal_pos_; 138 return true; 139 } 140 141 //: Reset all vertices' i_value_ to 0. 142 void reset_vertices_i_value (const int i_value); 143 144 //###### High-Level Connectivity Modification Functions ###### 145 146 //: delete vertex from the map and release its memory remove_vertex(bmsh3d_vertex * V)147 virtual void remove_vertex (bmsh3d_vertex* V) { 148 remove_vertex (V->id()); 149 } remove_vertex(int id)150 virtual void remove_vertex (int id) { 151 bmsh3d_vertex* vertex = vertexmap (id); 152 vertexmap_.erase (id); 153 _del_vertex (vertex); 154 } 155 }; 156 157 void clone_ptset (bmsh3d_pt_set* targetPS, bmsh3d_pt_set* inputPS); 158 159 bool detect_bounding_box (bmsh3d_pt_set* pt_set, vgl_box_3d<double>& bounding_box); 160 161 bool detect_geom_center (bmsh3d_pt_set* pt_set, vgl_point_3d<double>& C); 162 163 bmsh3d_pt_set* clone_pt_set_3d (bmsh3d_pt_set* PS); 164 165 void remove_duplicate_points (bmsh3d_pt_set* pt_set); 166 167 //: Other processing functions 168 void translate_points (bmsh3d_pt_set* pt_set, 169 const float tx, const float ty, const float tz); 170 171 void rotate_points (bmsh3d_pt_set* pt_set, 172 const float rx, const float ry, const float rz); 173 174 void scale_points (bmsh3d_pt_set* pt_set, const float scale); 175 176 void perturb_points (bmsh3d_pt_set* pt_set, const float pert); 177 178 void crop_points (bmsh3d_pt_set* pt_set, 179 const float minX, const float minY, const float minZ, 180 const float maxX, const float maxY, const float maxZ); 181 182 void shift_points_to_first_octant (bmsh3d_pt_set* pt_set); 183 184 void subsample_points (bmsh3d_pt_set* pt_set, const unsigned int subsam_pts); 185 186 #endif 187