//---------------------------------------------------------------------------- void ExtractCurveTris::MakeUnique (std::vector<Vector2f>& vertices, std::vector<EdgeKey>& edges) { int numVertices = (int)vertices.size(); if (numVertices == 0) { return; } // Use maps to generate unique storage. typedef std::map<Vector2f, int> VMap; typedef std::map<Vector2f, int>::iterator VIterator; VMap vertexMap; for (int v = 0, nextVertex = 0; v < numVertices; ++v) { std::pair<VIterator, bool> result = vertexMap.insert( std::make_pair(vertices[v], nextVertex)); if (result.second == true) { ++nextVertex; } } typedef std::map<EdgeKey, int> EMap; typedef std::map<EdgeKey, int>::iterator EIterator; EMap* edgeMap = 0; int e; VIterator vIter; int numEdges = (int)edges.size(); if (numEdges) { edgeMap = new0 EMap(); int nextEdge = 0; for (e = 0; e < numEdges; ++e) { // Replace old vertex indices by new ones. vIter = vertexMap.find(vertices[edges[e].V[0]]); assertion(vIter != vertexMap.end(), "Unexpected condition\n"); edges[e].V[0] = vIter->second; vIter = vertexMap.find(vertices[edges[e].V[1]]); assertion(vIter != vertexMap.end(), "Unexpected condition\n"); edges[e].V[1] = vIter->second; // Keep only unique edges. std::pair<EIterator, bool> result = edgeMap->insert( std::make_pair(edges[e], nextEdge)); if (result.second == true) { ++nextEdge; } } } // Pack the vertices into an array. numVertices = (int)vertexMap.size(); vertices.resize(numVertices); for (vIter = vertexMap.begin(); vIter != vertexMap.end(); ++vIter) { vertices[vIter->second] = vIter->first; } // Pack the edges into an array. if (numEdges > 0) { numEdges = (int)edgeMap->size(); edges.resize(numEdges); EIterator eIter; for (eIter = edgeMap->begin(); eIter != edgeMap->end(); ++eIter) { edges[eIter->second] = eIter->first; } delete0(edgeMap); } else { edges.clear(); } }