void ConvexClipper<Real>::OrderVertices (Face& face, std::vector<int>& vOrdered) { // Copy edge indices into contiguous memory. const int numEdges = (int)face.Edges.size(); std::vector<int> eOrdered(numEdges); std::set<int>::iterator iter = face.Edges.begin(); std::set<int>::iterator end = face.Edges.end(); int i = 0; while (iter != end) { eOrdered[i++] = *iter++; } // Bubble sort (yes, it is...). for (int i0 = 0, i1 = 1, choice = 1; i1 < numEdges - 1; i0 = i1++) { Edge& edgeCurr = mEdges[eOrdered[i0]]; int j, curr = edgeCurr.Vertex[choice]; for (j = i1; j < numEdges; ++j) { Edge& edgeTemp = mEdges[eOrdered[j]]; int save; if (edgeTemp.Vertex[0] == curr) { save = eOrdered[i1]; eOrdered[i1] = eOrdered[j]; eOrdered[j] = save; choice = 1; break; } if (edgeTemp.Vertex[1] == curr) { save = eOrdered[i1]; eOrdered[i1] = eOrdered[j]; eOrdered[j] = save; choice = 0; break; } } assertion(j < numEdges, "Unexpected condition.\n"); } vOrdered[0] = mEdges[eOrdered[0]].Vertex[0]; vOrdered[1] = mEdges[eOrdered[0]].Vertex[1]; for (i = 1; i < numEdges; ++i) { Edge& edge = mEdges[eOrdered[i]]; if (edge.Vertex[0] == vOrdered[i]) { vOrdered[i + 1] = edge.Vertex[1]; } else { vOrdered[i + 1] = edge.Vertex[0]; } } }
bool ClipMesh::orderVertices( CFace& face, std::vector<int>& vOrdered ) { // copy edge indices into contiguous memory const int numEdges = static_cast<int>(face.edges.size()); std::vector<int> eOrdered(numEdges); std::set<int>::const_iterator iter = face.edges.begin(); std::set<int>::const_iterator end = face.edges.end(); int counter = 0; while( iter != end ) { eOrdered[counter++] = *iter++; } //std::sort(eOrdered.begin(), eOrdered.end()); // BROKEN bubble sort, but the broken part makes this work... for( int i0 = 0, i1 = 1, choice = 1; i1 < numEdges - 1; i0 = i1++ ) { CEdge& edgeCurr = _edges[eOrdered[i0]]; int j, curr = edgeCurr.vertex[choice]; for( j = i1; j < numEdges; ++j ) { CEdge& edgeTemp = _edges[eOrdered[j]]; int save; if( edgeTemp.vertex[0] == curr ) { save = eOrdered[i1]; eOrdered[i1] = eOrdered[j]; eOrdered[j] = save; choice = 1; break; } if( edgeTemp.vertex[1] == curr ) { save = eOrdered[i1]; eOrdered[i1] = eOrdered[j]; eOrdered[j] = save; choice = 0; break; } } //assert(j < numEdges); // unexpected condition if( j >= numEdges ) { return false; } } vOrdered[0] = _edges[eOrdered[0]].vertex[0]; vOrdered[1] = _edges[eOrdered[0]].vertex[1]; for( int i = 1; i < numEdges; ++i ) { CEdge& edge = _edges[eOrdered[i]]; if( edge.vertex[0] == vOrdered[i] ) { vOrdered[i + 1] = edge.vertex[1]; } else { vOrdered[i + 1] = edge.vertex[0]; } } return true; }