/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * @file * Public API - implementation */ #include "CDT.h" #include #include #include #include namespace CDT { CDT_INLINE_IF_HEADER_ONLY VerticesTriangles calculateTrianglesByVertex( const TriangleVec& triangles, const VertInd verticesSize) { VerticesTriangles vertTris(verticesSize); for(TriInd iT = 0; iT < triangles.size(); ++iT) { const VerticesArr3& vv = triangles[iT].vertices; for(VerticesArr3::const_iterator v = vv.begin(); v != vv.end(); ++v) { vertTris[*v].push_back(iT); } } return vertTris; } template DuplicatesInfo RemoveDuplicates(std::vector >& vertices) { const DuplicatesInfo di = FindDuplicates( vertices.begin(), vertices.end(), getX_V2d, getY_V2d); RemoveDuplicates(vertices, di.duplicates); return di; } CDT_INLINE_IF_HEADER_ONLY void RemapEdges(std::vector& edges, const std::vector& mapping) { RemapEdges( edges.begin(), edges.end(), mapping, edge_get_v1, edge_get_v2, edge_make); } template DuplicatesInfo RemoveDuplicatesAndRemapEdges( std::vector >& vertices, std::vector& edges) { return RemoveDuplicatesAndRemapEdges( vertices, getX_V2d, getY_V2d, edges.begin(), edges.end(), edge_get_v1, edge_get_v2, edge_make); } CDT_INLINE_IF_HEADER_ONLY EdgeUSet extractEdgesFromTriangles(const TriangleVec& triangles) { EdgeUSet edges; typedef TriangleVec::const_iterator CIt; for(CIt t = triangles.begin(); t != triangles.end(); ++t) { edges.insert(Edge(VertInd(t->vertices[0]), VertInd(t->vertices[1]))); edges.insert(Edge(VertInd(t->vertices[1]), VertInd(t->vertices[2]))); edges.insert(Edge(VertInd(t->vertices[2]), VertInd(t->vertices[0]))); } return edges; } CDT_INLINE_IF_HEADER_ONLY unordered_map EdgeToPiecesMapping(const unordered_map& pieceToOriginals) { unordered_map originalToPieces; typedef unordered_map::const_iterator Cit; for(Cit ptoIt = pieceToOriginals.begin(); ptoIt != pieceToOriginals.end(); ++ptoIt) { const Edge piece = ptoIt->first; const EdgeVec& originals = ptoIt->second; for(EdgeVec::const_iterator origIt = originals.begin(); origIt != originals.end(); ++origIt) { originalToPieces[*origIt].push_back(piece); } } return originalToPieces; } } // namespace CDT