Skip to content

Commit

Permalink
#7 Refactor budgeting number of new vertices for triangulation refine…
Browse files Browse the repository at this point in the history
…ment
  • Loading branch information
artem-ogre committed Oct 6, 2023
1 parent f820cb5 commit 461f34d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 48 deletions.
28 changes: 12 additions & 16 deletions CDT/include/Triangulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,8 @@ class CDT_EXPORT Triangulation
{
public:
typedef std::vector<V2d<T> > V2dVec; ///< Vertices vector
typedef std::vector<bool> boolVec; ///< Steiner Vertices flag
V2dVec vertices; ///< triangulation's vertices
boolVec isSteinerVertex; ///< triangulation's vertices Steiner point flag
IndexSizeType
maxSteinerPoints; ///< triangulation's maximum number of Steiner
IndexSizeType numOfSteinerPoints; ///< triangulation's maximum number of
///< Steiner points to be added
std::vector<bool> isSteinerVertex; ///< triangulation's vertices Steiner point flag
TriangleVec triangles; ///< triangulation's triangles
EdgeUSet fixedEdges; ///< triangulation's constraints (fixed edges)

Expand Down Expand Up @@ -302,12 +297,13 @@ class CDT_EXPORT Triangulation
* @note bad triangles don't fulfill constraints defined by the user
* @param refinement_constrain refinement strategy that is used to identify
* bad triangles
* @param threshold threshold value for refinement
* @param refinementThreshold threshold value for refinement
*/
void refineTriangles(
RefinementCriterion::Enum refinementConstrain =
VertInd maxVerticesToInsert,
RefinementCriterion::Enum refinementCriterion =
RefinementCriterion::SmallestAngle,
T threshold = 20 / 180.0 * M_PI);
T refinementThreshold = 20 / 180.0 * M_PI);
/**
* Erase triangles adjacent to super triangle
*
Expand Down Expand Up @@ -527,14 +523,14 @@ class CDT_EXPORT Triangulation
/// Returns queue of encroached edges
EdgeQue detectEncroachedEdges(const V2d<T>& v);
/// Recursively split encroached edges
/// returns vector of badly shaped triangles and number of splits
std::pair<TriIndVec, IndexSizeType> resolveEncroachedEdges(
/// @return vector of badly shaped triangles
TriIndVec resolveEncroachedEdges(
EdgeQue encroachedEdges,
const V2d<T>& v = {},
bool validV = false,
bool fillBadTriangles = false,
RefinementCriterion::Enum refinementConstrain = {},
T badTriangleThreshold = {});
VertInd& newVertBudget,
const V2d<T>* const circumcenterOrNull = NULL,
RefinementCriterion::Enum refinementCriterion =
RefinementCriterion::SmallestAngle,
T badTriangleThreshold = T(0));
VertInd splitEncroachedEdge(Edge e, TriInd iT, TriInd iTopo);
void changeNeighbor(TriInd iT, TriInd oldNeighbor, TriInd newNeighbor);
void changeNeighbor(
Expand Down
59 changes: 30 additions & 29 deletions CDT/include/Triangulation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1253,7 +1253,7 @@ TriInd Triangulation<T, TNearPointLocator>::edgeTriangle(const Edge edge) const
template <typename T, typename TNearPointLocator>
bool Triangulation<T, TNearPointLocator>::isRefinementNeeded(
const Triangle& tri,
RefinementCriterion::Enum refinementCriterion,
const RefinementCriterion::Enum refinementCriterion,
const T refinementThreshold) const
{
const V2d<T>& a = vertices[tri.vertices[0]];
Expand Down Expand Up @@ -1321,19 +1321,17 @@ Triangulation<T, TNearPointLocator>::detectEncroachedEdges(const V2d<T>& v)
}

template <typename T, typename TNearPointLocator>
std::pair<TriIndVec, IndexSizeType>
Triangulation<T, TNearPointLocator>::resolveEncroachedEdges(
TriIndVec Triangulation<T, TNearPointLocator>::resolveEncroachedEdges(
EdgeQue encroachedEdges,
const V2d<T>& v,
const bool validV,
const bool fillBadTriangles,
const RefinementCriterion::Enum refinementConstrain,
VertInd& newVertBudget,
const V2d<T>* const circumcenterOrNull,
const RefinementCriterion::Enum refinementCriterion,
const T badTriangleThreshold)
{
IndexSizeType numOfSplits = 0;
std::vector<TriInd> badTriangles;

while(!encroachedEdges.empty() && numOfSteinerPoints < maxSteinerPoints)
while(!encroachedEdges.empty() && newVertBudget > 0)
{
Edge edge = encroachedEdges.front();
encroachedEdges.pop();
Expand All @@ -1345,15 +1343,15 @@ Triangulation<T, TNearPointLocator>::resolveEncroachedEdges(
const Triangle& t = triangles[iT];
VertInd i = splitEncroachedEdge(
edge, iT, edgeNeighbor(triangles[iT], edge.v1(), edge.v2()));
++numOfSplits;
--newVertBudget;

TriInd start = m_vertTris[i];
TriInd currTri = start;
do
{
const Triangle& t = triangles[currTri];
if(fillBadTriangles &&
isRefinementNeeded(t, refinementConstrain, badTriangleThreshold))
if(circumcenterOrNull &&
isRefinementNeeded(t, refinementCriterion, badTriangleThreshold))
{
badTriangles.push_back(currTri);
}
Expand All @@ -1372,15 +1370,17 @@ Triangulation<T, TNearPointLocator>::resolveEncroachedEdges(
const V2d<T>& edgeEnd = vertices[edge.v2()];
if(isEncroachingOnEdge(vertices[v1], edgeStart, edgeEnd) ||
isEncroachingOnEdge(vertices[v2], edgeStart, edgeEnd) ||
(validV && isEncroachingOnEdge(v, edgeStart, edgeEnd)))
(circumcenterOrNull &&
isEncroachingOnEdge(
*circumcenterOrNull, edgeStart, edgeEnd)))
{
encroachedEdges.push(edge);
}
}
currTri = t.next(i).first;
} while(currTri != start);
}
return std::make_pair(badTriangles, numOfSplits);
return badTriangles;
}

template <typename T, typename TNearPointLocator>
Expand Down Expand Up @@ -1446,7 +1446,6 @@ VertInd Triangulation<T, TNearPointLocator>::splitEncroachedEdge(
std::stack<TriInd> triStack = insertVertexOnEdge(iMid, iT, iTopo);
tryAddVertexToLocator(iMid);
ensureDelaunayByEdgeFlips(mid, iMid, triStack);
++numOfSteinerPoints;
return iMid;
}

Expand Down Expand Up @@ -2251,16 +2250,19 @@ void Triangulation<T, TNearPointLocator>::tryInitNearestPointLocator()

template <typename T, typename TNearPointLocator>
void Triangulation<T, TNearPointLocator>::refineTriangles(
RefinementCriterion::Enum refinementConstrain,
T threshold)
const VertInd maxVerticesToInsert,
const RefinementCriterion::Enum refinementCriterion,
const T refinementThreshold)
{
if(isFinalized())
{
throw std::runtime_error("Triangulation was finalized with 'erase...' "
"method. Refinement is not possible");
}
tryInitNearestPointLocator();
resolveEncroachedEdges(detectEncroachedEdges());

VertInd newVertBudget = maxVerticesToInsert;
resolveEncroachedEdges(detectEncroachedEdges(), newVertBudget);

std::queue<TriInd> badTriangles;
for(TriInd iT(0), n = triangles.size(); iT < n; ++iT)
Expand All @@ -2269,7 +2271,7 @@ void Triangulation<T, TNearPointLocator>::refineTriangles(
if(t.vertices[0] < 3 || t.vertices[1] < 3 || t.vertices[2] < 3)
continue;

if(isRefinementNeeded(t, refinementConstrain, threshold))
if(isRefinementNeeded(t, refinementCriterion, refinementThreshold))
{
const V2d<T> vert = circumcenter(
vertices[t.vertices[0]],
Expand All @@ -2289,8 +2291,8 @@ void Triangulation<T, TNearPointLocator>::refineTriangles(
TriInd iT = badTriangles.front();
const Triangle& t = triangles[iT];
badTriangles.pop();
if(!isRefinementNeeded(t, refinementConstrain, threshold) ||
numOfSteinerPoints >= maxSteinerPoints)
if(!isRefinementNeeded(t, refinementCriterion, refinementThreshold) ||
newVertBudget == 0)
{
continue;
}
Expand All @@ -2304,20 +2306,18 @@ void Triangulation<T, TNearPointLocator>::refineTriangles(
continue;
}
TriIndVec badTris = resolveEncroachedEdges(
detectEncroachedEdges(vert),
vert,
true,
true,
refinementConstrain,
threshold)
.first;
detectEncroachedEdges(vert),
newVertBudget,
&vert,
refinementCriterion,
refinementThreshold);

for(IndexSizeType i(0); i < TriInd(badTris.size()); ++i)
{
badTriangles.push(badTris[i]);
}

if(badTris.empty() && numOfSteinerPoints < maxSteinerPoints)
if(badTris.empty() && newVertBudget > 0)
{
const VertInd iVert = static_cast<VertInd>(vertices.size());
addNewVertex(vert, noNeighbor, true);
Expand All @@ -2327,7 +2327,8 @@ void Triangulation<T, TNearPointLocator>::refineTriangles(
do
{
const Triangle& t = triangles[currTri];
if(isRefinementNeeded(t, refinementConstrain, threshold))
if(isRefinementNeeded(
t, refinementCriterion, refinementThreshold))
{
badTriangles.push(currTri);
}
Expand Down
9 changes: 6 additions & 3 deletions visualizer/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,6 @@ public slots:
CDT::VertexInsertionOrder::Auto,
CDT::IntersectingConstraintEdges::Resolve,
1e-3);
m_cdt.maxSteinerPoints = 1000U;
if(!m_points.empty())
{
std::vector<V2d> pts =
Expand Down Expand Up @@ -224,15 +223,19 @@ public slots:
if(m_isRemoveOuterAndHoles)
{
m_cdt.refineTriangles(
CDT::RefinementCriterion::SmallestAngle, 20 / 180.0 * M_PI);
1000,
CDT::RefinementCriterion::SmallestAngle,
20 / 180.0 * M_PI);
m_cdt.eraseOuterTrianglesAndHoles();
}
else if(m_isRemoveOuter)
m_cdt.eraseOuterTriangles();
else if(m_isHideSuperTri)
{
m_cdt.refineTriangles(
CDT::RefinementCriterion::SmallestAngle, 20 / 180.0 * M_PI);
1000,
CDT::RefinementCriterion::SmallestAngle,
20 / 180.0 * M_PI);
m_cdt.eraseSuperTriangle();
}
const CDT::unordered_map<Edge, CDT::EdgeVec> tmp =
Expand Down

0 comments on commit 461f34d

Please sign in to comment.