xmsgeom  1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
TrTriangulatorPoints.cpp
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
7 //------------------------------------------------------------------------------
8 
9 //----- Included files ---------------------------------------------------------
10 
11 // 1. Precompiled header
12 
13 // 2. My own header
15 
16 // 3. Standard library headers
17 
18 // 4. External library headers
19 
20 // 5. Shared code headers
21 #include <xmscore/stl/vector.h>
22 #include <xmscore/misc/XmError.h>
23 #include <xmsgeom/geometry/geoms.h>
24 #include <xmscore/misc/Observer.h>
26 
27 // 6. Non-shared code headers
28 
29 //----- Forward declarations ---------------------------------------------------
30 
31 //----- External globals -------------------------------------------------------
32 
33 //----- Namespace declaration --------------------------------------------------
34 
35 namespace xms
36 {
37 //----- Constants / Enumerations -----------------------------------------------
38 
39 //----- Classes / Structs ------------------------------------------------------
40 
41 //----- Internal functions -----------------------------------------------------
42 
43 //----- Class / Function definitions -------------------------------------------
44 
49 //------------------------------------------------------------------------------
87 //------------------------------------------------------------------------------
89  VecInt& a_tris,
90  VecInt2d* a_trisAdjToPts)
91 : m_pts(a_pts)
92 , m_idx(0)
93 , m_tris(a_tris)
94 , m_trisAdjToPts(a_trisAdjToPts)
95 , m_areaTol(-1)
96 , m_observer()
97 {
99 }
100 //------------------------------------------------------------------------------
102 //------------------------------------------------------------------------------
103 TrTriangulatorPoints::~TrTriangulatorPoints()
104 {
105 }
106 //------------------------------------------------------------------------------
109 //------------------------------------------------------------------------------
110 void TrTriangulatorPoints::SetObserver(BSHP<Observer> a_)
111 {
112  m_observer = a_;
113 } // TrTriangulatorPoints::SetObserver
114 //------------------------------------------------------------------------------
117 //------------------------------------------------------------------------------
119 {
120  return m_idx;
121 }
122 //------------------------------------------------------------------------------
125 //------------------------------------------------------------------------------
127 {
128  return m_pts[m_idx];
129 }
130 //------------------------------------------------------------------------------
133 //------------------------------------------------------------------------------
135 {
136  return (int)m_pts.size();
137 }
138 //------------------------------------------------------------------------------
140 //------------------------------------------------------------------------------
142 {
143  ++m_idx;
144 }
145 //------------------------------------------------------------------------------
147 //------------------------------------------------------------------------------
149 {
150  if (m_observer)
151  m_observer->BeginOperationString("Triangulating Points");
152  if (m_trisAdjToPts)
153  {
154  m_trisAdjToPts->resize(m_pts.size(), VecInt());
155  }
156 } // TrTriangulatorPoints::PrepareToReceiveTriangles
157 //------------------------------------------------------------------------------
159 //------------------------------------------------------------------------------
161 {
162  if (m_observer)
163  m_observer->EndOperation();
165  if (m_trisAdjToPts)
166  {
168  }
169 } // TrTriangulatorPoints::FinalizeTriangulation
170 //------------------------------------------------------------------------------
175 //------------------------------------------------------------------------------
176 void TrTriangulatorPoints::ReceiveTriangle(int a_id1, int a_id2, int a_id3)
177 {
178  // make sure the triangle has positive area
179  double area = trArea(m_pts[a_id1 - 1], m_pts[a_id2 - 1], m_pts[a_id3 - 1]);
180  if (area < m_areaTol)
181  {
182  return;
183  }
184 
185  m_tris.push_back(a_id1 - 1);
186  m_tris.push_back(a_id2 - 1);
187  m_tris.push_back(a_id3 - 1);
188 
189  if (m_trisAdjToPts)
190  {
191  int triIdx = ((int)m_tris.size() / 3) - 1;
192  (*m_trisAdjToPts)[a_id1 - 1].push_back(triIdx);
193  (*m_trisAdjToPts)[a_id2 - 1].push_back(triIdx);
194  (*m_trisAdjToPts)[a_id3 - 1].push_back(triIdx);
195  }
196  if (m_observer)
197  {
198  double prog = std::min(m_tris.size() / (double)(m_pts.size() * 2), 1.0);
199  m_observer->ProgressStatus(prog);
200  }
201 } // TrTriangulatorPoints::ReceiveTriangle
202 //------------------------------------------------------------------------------
204 //------------------------------------------------------------------------------
206 {
207  if (m_pts.empty())
208  return;
209 
210  Pt3d ptMin(m_pts[0]), ptMax(m_pts[0]);
211  for (const auto& p : m_pts)
212  gmAddToExtents(p, ptMin, ptMax);
213  m_areaTol = gmComputeXyTol(ptMin, ptMax);
214  m_areaTol *= m_areaTol;
215  m_areaTol *= 100;
216 } // TrTriangulatorPoints::UpdateAreaTolerance
217 
218 } // namespace xms
219 
220 #if CXX_TEST
221 // UNIT TESTS
224 
226 
229 
230 //----- Namespace declaration --------------------------------------------------
231 
232 // namespace xms {
233 using namespace xms;
234 
239 //------------------------------------------------------------------------------
241 //------------------------------------------------------------------------------
243 {
244  // 10- 3-----------4
245  // | / \ / \
246  // | / \ 2 / \
247  // | / \ / \
248  // | / 0 \ / 1 \
249  // | / \ / \
250  // 0- 0-----------1-----------2
251  //
252  // |-----|-----|-----|-----|
253  // 0 5 10 15 20
254  //
255  // m_tris = 3,0,1, 1,2,4, 1,4,3
256  // m_trisAdjToPts = [0][0,1,2][1][0,2][1,2]
257 
258  VecPt3d pts = {{0, 0, 0}, {10, 0, 0}, {20, 0, 0}, {5, 10, 0}, {15, 10, 0}};
259  VecInt tris;
260  VecInt2d trisAdjToPts;
261  TrTriangulatorPoints client(pts, tris, &trisAdjToPts);
262  trTriangulateIt(client);
263 
264  TS_ASSERT_EQUALS(tris.size(), 9);
265  TS_ASSERT_EQUALS(tris[0], 3);
266  TS_ASSERT_EQUALS(tris[1], 0);
267  TS_ASSERT_EQUALS(tris[2], 1);
268  TS_ASSERT_EQUALS(tris[3], 1);
269  TS_ASSERT_EQUALS(tris[4], 2);
270  TS_ASSERT_EQUALS(tris[5], 4);
271  TS_ASSERT_EQUALS(tris[6], 1);
272  TS_ASSERT_EQUALS(tris[7], 4);
273  TS_ASSERT_EQUALS(tris[8], 3);
274 
275  TS_ASSERT_EQUALS(trisAdjToPts.size(), pts.size());
276  TS_ASSERT_EQUALS((VecInt{0}), trisAdjToPts[0]);
277  TS_ASSERT_EQUALS((VecInt{0, 1, 2}), trisAdjToPts[1]);
278  TS_ASSERT_EQUALS((VecInt{1}), trisAdjToPts[2]);
279  TS_ASSERT_EQUALS((VecInt{0, 2}), trisAdjToPts[3]);
280  TS_ASSERT_EQUALS((VecInt{1, 2}), trisAdjToPts[4]);
281 
282 } // TrTriangulatorPointsUnitTests::test1
283 
284  //} // namespace xms
285 
286 #endif // CXX_TEST
Code that creates a Delauney triangulation from points.
virtual int GetID() const override
Return the current point index (0-based).
double m_areaTol
tolerance for area to be greater than 0.0
Functions dealing with triangles.
virtual void ReceiveTriangle(int a_id1, int a_id2, int a_id3) override
Receive a triangle consisting of the 3 points.
virtual void PrepareToReceiveTriangles() override
Called just before triangles are created.
void stShrinkCapacity(std::vector< T > &v)
VecInt2d * m_trisAdjToPts
Triangles adjacent to points.
TrTriangulatorPoints(const VecPt3d &a_pts, VecInt &a_tris, VecInt2d *a_trisAdjToPts=nullptr)
Triangulate Pt3ds returning triangles in a single 1D vector.
int m_idx
Current point index.
std::vector< int > VecInt
virtual Pt3d GetLocation() const override
Get location of current point.
const VecPt3d & m_pts
The points.
virtual void FinalizeTriangulation() override
Called after all triangles have been received.
void UpdateAreaTolerance()
calculates the area tolerance
Functions dealing with geometry.
virtual void SetObserver(BSHP< Observer > a_)
Set the observer to use for feedback while processing.
std::vector< Pt3d > VecPt3d
void test1()
tests triangulating points
VecInt & m_tris
The triangles as 0-based indices into m_pts.
virtual int GetNPoints() const override
Return the number of points to be triangulated.
virtual void IncrementPoint() override
Increment the current point index by 1.
std::vector< VecInt > VecInt2d
Class to triangulate simple points.
BSHP< Observer > m_observer
Observer.