60 virtual void Delete(
const VecInt2d& a_polys, BSHP<TrTin> a_tin)
override;
96 TrOuterTriangleDeleterImpl::~TrOuterTriangleDeleterImpl()
114 for (
int i = 0; i < (int)
m_polys.size(); ++i)
125 for (
size_t i = 0; i <
m_polys.size(); ++i)
139 for (
size_t i = 0; i < flags.size(); ++i)
141 if (flags[i] & BE_OUTSIDE)
143 trisToDelete.insert((
int)i);
147 m_tin->DeleteTriangles(trisToDelete);
158 VecInt::const_iterator it0 = a_poly.begin();
159 VecInt::const_iterator it1 = it0;
162 for (; it1 != a_poly.end(); ++it0, ++it1)
166 inTri =
m_tin->TriangleAdjacentToEdge(*it0, *it1);
167 outTri =
m_tin->TriangleAdjacentToEdge(*it1, *it0);
172 if (!(a_flags[outTri] & BE_INSIDE))
173 a_flags[outTri] = BE_OUTSIDE | BE_ONBOUNDARY;
177 a_flags[inTri] = BE_INSIDE | BE_ONBOUNDARY;
193 int numTri =
m_tin->NumTriangles();
203 while (tri < numTri && tri != -1 && !found)
205 if (a_flags[tri] & BE_ONBOUNDARY && !(a_flags[tri] & BE_VISITED))
207 for (
int id = 0;
id < 3 && !found; ++id)
209 int adjTri =
m_tin->AdjacentTriangle(tri,
id);
210 if (adjTri != -1 && a_flags[adjTri] == BE_UNVISITED)
228 for (
size_t i = 0; i < a_flags.size(); ++i)
230 if (a_flags[i] == BE_UNVISITED)
232 a_flags[i] = BE_OUTSIDE;
241 for (
int i = 0; i < size; i++)
243 int currTri = stack[i];
244 a_flags[currTri] |= BE_VISITED;
249 int adjTri =
m_tin->AdjacentTriangle(currTri,
id);
250 if (adjTri != -1 && a_flags[adjTri] == BE_UNVISITED)
253 stack[size++] = adjTri;
254 if (a_flags[currTri] & BE_INSIDE)
255 a_flags[adjTri] = BE_INSIDE;
257 a_flags[adjTri] = BE_OUTSIDE;
259 id = trIncrementIndex(
id);
283 TrOuterTriangleDeleter::TrOuterTriangleDeleter()
289 TrOuterTriangleDeleter::~TrOuterTriangleDeleter()
364 int outPoly[] = {0, 9, 17, 18, 19, 20, 21, 16, 8, 4, 3, 2, 1, 0};
365 int inPoly1[] = {10, 5, 6, 14, 10};
366 int inPoly2[] = {11, 7, 12, 15, 11};
372 deleter->Delete(polys, tin);
375 int trisA[] = {0, 5, 9, 5, 0, 1, 1, 2, 6, 14, 6, 11, 1, 6, 5, 9, 13, 17, 13,
376 9, 10, 17, 13, 18, 10, 14, 18, 18, 14, 19, 10, 18, 13, 9, 5, 10, 6, 2,
377 7, 7, 11, 6, 3, 4, 8, 3, 8, 7, 7, 2, 3, 12, 7, 8, 19, 15, 20,
378 15, 19, 11, 15, 12, 16, 20, 16, 21, 16, 20, 15, 12, 8, 16, 11, 19, 14};
void FlagTrianglesAlongPolygon(const VecInt &a_poly, VecInt &a_flags)
Flag triangles along polygon as inside or outside the polygon.
BSHP< Observer > m_observer
Observer.
Functions dealing with triangles.
std::vector< int > VecInt
#define XM_ENSURE_TRUE_VOID_NO_ASSERT(...)
BoundaryEnum
Flags used triangles.
static boost::shared_ptr< TrOuterTriangleDeleter > New()
Creates a TrOuterTriangleDeleterImpl object.
TrOuterTriangleDeleterImpl()
constructor
virtual void Delete(const VecInt2d &a_polys, BSHP< TrTin > a_tin) override
Deletes triangles in a_tin that are outside a_polys or inside if the poly is a hole.
#define XM_COUNTOF(array)
BSHP< TrTin > trBuildTestTin7()
Builds a simple TIN for testing.
void test1()
Tests TrOuterTriangleDeleter.
Used to delete tin triangles that are outside given polygons. The polygons may include holes - polygo...
std::vector< VecInt > VecInt2d
virtual void SetObserver(BSHP< Observer > a_) override
Set the observer to use for feedback while processing.
VecInt2d m_polys
Polygons (boundary and holes) of tin.
void MarkNeighbors(VecInt &a_flags)
Flag all triangles as inside or outside the polygon, starting with those already flagged and working ...