10#ifndef CDT_lNrmUayWQaIR5fxnsg9B
11#define CDT_lNrmUayWQaIR5fxnsg9B
16#include "remove_at.hpp"
89 typename TGetVertexCoordX,
90 typename TGetVertexCoordY>
94 TGetVertexCoordX getX,
95 TGetVertexCoordY getY);
104template <
typename TVertex,
typename TAllocator>
106 std::vector<TVertex, TAllocator>& vertices,
107 const std::vector<std::size_t>& duplicates);
138 typename TGetEdgeVertexStart,
139 typename TGetEdgeVertexEnd,
140 typename TMakeEdgeFromStartAndEnd>
144 const std::vector<std::size_t>& mapping,
145 TGetEdgeVertexStart getStart,
146 TGetEdgeVertexEnd getEnd,
147 TMakeEdgeFromStartAndEnd makeEdge);
157RemapEdges(std::vector<Edge>& edges,
const std::vector<std::size_t>& mapping);
192 typename TGetVertexCoordX,
193 typename TGetVertexCoordY,
194 typename TVertexAllocator,
196 typename TGetEdgeVertexStart,
197 typename TGetEdgeVertexEnd,
198 typename TMakeEdgeFromStartAndEnd>
200 std::vector<TVertex, TVertexAllocator>& vertices,
201 TGetVertexCoordX getX,
202 TGetVertexCoordY getY,
203 TEdgeIter edgesFirst,
205 TGetEdgeVertexStart getStart,
206 TGetEdgeVertexEnd getEnd,
207 TMakeEdgeFromStartAndEnd makeEdge);
218 std::vector<
V2d<T> >& vertices,
219 std::vector<Edge>& edges);
234CDT_EXPORT unordered_map<Edge, EdgeVec>
247 const unordered_map<Edge, EdgeVec>& edgeToPieces,
248 const std::vector<
V2d<T> >& vertices);
260#ifdef CDT_CXX11_IS_SUPPORTED
271#ifdef CDT_CXX11_IS_SUPPORTED
272 typedef std::hash<T> Hasher;
274 typedef boost::hash<T> Hasher;
276 return Hasher()(xy.
x) ^ Hasher()(xy.
y);
289 typename TVertexIter,
290 typename TGetVertexCoordX,
291 typename TGetVertexCoordY>
295 TGetVertexCoordX getX,
296 TGetVertexCoordY getY)
298 typedef unordered_map<V2d<T>, std::size_t> PosToIndex;
299 PosToIndex uniqueVerts;
300 const std::size_t verticesSize = std::distance(first, last);
302 std::vector<std::size_t>(verticesSize), std::vector<std::size_t>()};
303 for(std::size_t iIn = 0, iOut = iIn; iIn < verticesSize; ++iIn, ++first)
305 typename PosToIndex::const_iterator it;
307 tie(it, isUnique) = uniqueVerts.insert(
308 std::make_pair(
V2d<T>(getX(*first), getY(*first)), iOut));
320template <
typename TVertex,
typename TAllocator>
322 std::vector<TVertex, TAllocator>& vertices,
323 const std::vector<std::size_t>& duplicates)
336 typename TGetEdgeVertexStart,
337 typename TGetEdgeVertexEnd,
338 typename TMakeEdgeFromStartAndEnd>
341 const TEdgeIter last,
342 const std::vector<std::size_t>& mapping,
343 TGetEdgeVertexStart getStart,
344 TGetEdgeVertexEnd getEnd,
345 TMakeEdgeFromStartAndEnd makeEdge)
347 for(; first != last; ++first)
350 static_cast<VertInd>(mapping[getStart(*first)]),
351 static_cast<VertInd>(mapping[getEnd(*first)]));
358 typename TGetVertexCoordX,
359 typename TGetVertexCoordY,
360 typename TVertexAllocator,
362 typename TGetEdgeVertexStart,
363 typename TGetEdgeVertexEnd,
364 typename TMakeEdgeFromStartAndEnd>
366 std::vector<TVertex, TVertexAllocator>& vertices,
367 TGetVertexCoordX getX,
368 TGetVertexCoordY getY,
369 const TEdgeIter edgesFirst,
370 const TEdgeIter edgesLast,
371 TGetEdgeVertexStart getStart,
372 TGetEdgeVertexEnd getEnd,
373 TMakeEdgeFromStartAndEnd makeEdge)
384 const unordered_map<Edge, EdgeVec>& edgeToPieces,
385 const std::vector<
V2d<T> >& vertices)
387 typedef std::pair<VertInd, T> VertCoordPair;
390 bool operator()(
const VertCoordPair& a,
const VertCoordPair& b)
const
392 return a.second < b.second;
396 unordered_map<Edge, std::vector<VertInd> > edgeToSplitVerts;
397 typedef unordered_map<Edge, EdgeVec>::const_iterator It;
398 for(It e2pIt = edgeToPieces.begin(); e2pIt != edgeToPieces.end(); ++e2pIt)
400 const Edge& e = e2pIt->first;
401 const T dX = vertices[e.
v2()].x - vertices[e.
v1()].x;
402 const T dY = vertices[e.
v2()].y - vertices[e.
v1()].y;
403 const bool isX = std::abs(dX) >= std::abs(dY);
404 const bool isAscending =
405 isX ? dX >= 0 : dY >= 0;
406 const EdgeVec& pieces = e2pIt->second;
407 std::vector<VertCoordPair> splitVerts;
409 splitVerts.reserve(pieces.size() + 1);
410 typedef EdgeVec::const_iterator EIt;
411 for(EIt pieceIt = pieces.begin(); pieceIt != pieces.end(); ++pieceIt)
413 const array<VertInd, 2> vv = {pieceIt->v1(), pieceIt->v2()};
414 typedef array<VertInd, 2>::const_iterator VIt;
415 for(VIt v = vv.begin(); v != vv.end(); ++v)
417 const T c = isX ? vertices[*v].x : vertices[*v].y;
418 splitVerts.push_back(std::make_pair(*v, isAscending ? c : -c));
422 std::sort(splitVerts.begin(), splitVerts.end(), comparePred);
425 std::unique(splitVerts.begin(), splitVerts.end()),
427 assert(splitVerts.size() > 2);
428 std::pair<Edge, std::vector<VertInd> > val =
429 std::make_pair(e, std::vector<VertInd>());
430 val.second.reserve(splitVerts.size());
431 typedef typename std::vector<VertCoordPair>::const_iterator SEIt;
432 for(SEIt it = splitVerts.begin() + 1; it != splitVerts.end() - 1; ++it)
434 val.second.push_back(it->first);
436 edgeToSplitVerts.insert(val);
438 return edgeToSplitVerts;
443#ifndef CDT_USE_AS_COMPILED_LIBRARY
Public API - implementation.
unsigned short LayerDepth
Type used for storing layer depths for triangles.
std::vector< TriIndVec > VerticesTriangles
Triangles by vertex index.
CDT_EXPORT VerticesTriangles calculateTrianglesByVertex(const TriangleVec &triangles, VertInd verticesSize)
Calculate triangles adjacent to vertices (triangles by vertex index)
void RemoveDuplicates(std::vector< TVertex, TAllocator > &vertices, const std::vector< std::size_t > &duplicates)
Remove duplicates in-place from vector of custom points.
void RemapEdges(TEdgeIter first, TEdgeIter last, const std::vector< std::size_t > &mapping, TGetEdgeVertexStart getStart, TGetEdgeVertexEnd getEnd, TMakeEdgeFromStartAndEnd makeEdge)
Remap vertex indices in edges (in-place) using given vertex-index mapping.
DuplicatesInfo RemoveDuplicatesAndRemapEdges(std::vector< TVertex, TVertexAllocator > &vertices, TGetVertexCoordX getX, TGetVertexCoordY getY, TEdgeIter edgesFirst, TEdgeIter edgesLast, TGetEdgeVertexStart getStart, TGetEdgeVertexEnd getEnd, TMakeEdgeFromStartAndEnd makeEdge)
Find point duplicates, remove them from vector (in-place) and remap edges (in-place)
unordered_map< Edge, std::vector< VertInd > > EdgeToSplitVertices(const unordered_map< Edge, EdgeVec > &edgeToPieces, const std::vector< V2d< T > > &vertices)
CDT_EXPORT EdgeUSet extractEdgesFromTriangles(const TriangleVec &triangles)
Extract all edges of triangles.
CDT_EXPORT unordered_map< Edge, EdgeVec > EdgeToPiecesMapping(const unordered_map< Edge, EdgeVec > &pieceToOriginals)
DuplicatesInfo FindDuplicates(TVertexIter first, TVertexIter last, TGetVertexCoordX getX, TGetVertexCoordY getY)
Find duplicates in given custom point-type range.
Namespace containing triangulation functionality.
std::vector< Edge > EdgeVec
Vector of edges.
unordered_set< Edge > EdgeUSet
Hash table of edges.
IndexSizeType VertInd
Vertex index.
std::vector< Triangle > TriangleVec
Vector of triangles.
Information about removed duplicated vertices.
std::vector< std::size_t > mapping
vertex index mapping
std::vector< std::size_t > duplicates
duplicates' indices
Edge connecting two vertices: vertex with smaller index is always first.
VertInd v1() const
V1 getter.
VertInd v2() const
V2 getter.