Example #1
0
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];
        }
    }
}
Example #2
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;
}