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