Skip to content

Commit

Permalink
#148 Fix bug: vertex with no adjacent triangle when resolving interse…
Browse files Browse the repository at this point in the history
…ctions
  • Loading branch information
artem-ogre committed Oct 12, 2023
1 parent ebbe76b commit a705885
Show file tree
Hide file tree
Showing 5 changed files with 42,555 additions and 10 deletions.
3 changes: 2 additions & 1 deletion CDT/include/Triangulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,8 @@ class CDT_EXPORT Triangulation

/// Access internal vertex adjacent triangles
TriIndVec& VertTrisInternal();
/// Access internal vertex adjacent triangles
const TriIndVec& VertTrisInternal() const;
/// @}

private:
Expand Down Expand Up @@ -586,7 +588,6 @@ class CDT_EXPORT Triangulation
bool hasEdge(VertInd a, VertInd b) const;
void setAdjacentTriangle(const VertInd v, const TriInd t);
void pivotVertexTriangleCW(VertInd v);
void removeAdjacentTriangle(VertInd v);
/// Add vertex to nearest-point locator if locator is initialized
void tryAddVertexToLocator(const VertInd v);
/// Perform lazy initialization of nearest-point locator after the Kd-tree
Expand Down
16 changes: 7 additions & 9 deletions CDT/include/Triangulation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,12 +208,19 @@ void Triangulation<T, TNearPointLocator>::removeTriangles(
}
}
}

template <typename T, typename TNearPointLocator>
TriIndVec& Triangulation<T, TNearPointLocator>::VertTrisInternal()
{
return m_vertTris;
}

template <typename T, typename TNearPointLocator>
const TriIndVec& Triangulation<T, TNearPointLocator>::VertTrisInternal() const
{
return m_vertTris;
}

template <typename T, typename TNearPointLocator>
void Triangulation<T, TNearPointLocator>::finalizeTriangulation(
const TriIndUSet& removedTriangles)
Expand Down Expand Up @@ -605,7 +612,6 @@ void Triangulation<T, TNearPointLocator>::insertEdgeIteration(
outerTrisL.push_back(edgeNeighbor(tOpo, polyL.back(), iVopo));
}
polyL.push_back(iVopo);
removeAdjacentTriangle(iVopo);
iV = iVL;
iVL = iVopo;
}
Expand All @@ -627,7 +633,6 @@ void Triangulation<T, TNearPointLocator>::insertEdgeIteration(
outerTrisR.push_back(edgeNeighbor(tOpo, polyR.back(), iVopo));
}
polyR.push_back(iVopo);
removeAdjacentTriangle(iVopo);
iV = iVR;
iVR = iVopo;
}
Expand Down Expand Up @@ -2005,13 +2010,6 @@ void Triangulation<T, TNearPointLocator>::pivotVertexTriangleCW(const VertInd v)
triangles[m_vertTris[v]].vertices[2] == v);
}

template <typename T, typename TNearPointLocator>
void Triangulation<T, TNearPointLocator>::removeAdjacentTriangle(
const VertInd v)
{
m_vertTris[v] = noNeighbor;
}

template <typename T, typename TNearPointLocator>
void Triangulation<T, TNearPointLocator>::tryAddVertexToLocator(const VertInd v)
{
Expand Down
35 changes: 35 additions & 0 deletions CDT/tests/cdt.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,9 @@ TEMPLATE_LIST_TEST_CASE(
cdt.insertVertices(vv);
cdt.insertEdges(ee);
REQUIRE(CDT::verifyTopology(cdt));
// Check that each vertex has a neighbor triangle
for(const auto& vt : cdt.VertTrisInternal())
REQUIRE(vt != noNeighbor);

// make true to update expected files (development purposes only)
const auto outputFileBase = "expected/" +
Expand Down Expand Up @@ -847,3 +850,35 @@ TEST_CASE("Regression: multiple hanging edges", "")
REQUIRE(topologyString(cdt) == topologyString(outFile));
}
}

TEST_CASE(
"Regression #148: vertex with no adjacant triangle after resolving "
"intersection ",
"")
{
const auto inputFile = std::string("issue-148.txt");
const auto order = VertexInsertionOrder::Auto;
const auto intersectingEdgesStrategy = IntersectingConstraintEdges::Resolve;
const auto minDistToConstraintEdge = 1e-6;
const auto outFile = "expected/" +
inputFile.substr(0, inputFile.size() - 4) + "__f64_" +
to_string(order) + "_" +
to_string(intersectingEdgesStrategy) + "_all.txt";

const auto [vv, ee] = readInputFromFile<double>("inputs/" + inputFile);
auto cdt = Triangulation<double>(
order, intersectingEdgesStrategy, minDistToConstraintEdge);
cdt.insertVertices(vv);
cdt.insertEdges(ee);
REQUIRE(CDT::verifyTopology(cdt));
// Check that each vertex has a neighbor triangle
for(const auto& vt : cdt.VertTrisInternal())
REQUIRE(vt != noNeighbor);

if(updateFiles)
topologyToFile(outFile, cdt);
else
{
REQUIRE(topologyString(cdt) == topologyString(outFile));
}
}
Loading

0 comments on commit a705885

Please sign in to comment.