示例#1
0
//----------------------------------------------------------------------------
void MTMesh::AttachTriangleToEdge (int t, MTTriangle& triangle, int i, int e,
                                   MTEdge& edge)
{
	if (edge.Triangle(0) == -1)
	{
		edge.Triangle(0) = t;
	}
	else
	{
		int a = edge.Triangle(0);
		MTTriangle& adjacent = mTriangles[a];
		triangle.Adjacent(i) = a;
		for (int j = 0; j < 3; ++j)
		{
			if (adjacent.Edge(j) == e)
			{
				adjacent.Adjacent(j) = t;
				break;
			}
		}

		if (edge.Triangle(1) == -1)
		{
			edge.Triangle(1) = t;
		}
		else
		{
			assertion(false, "The mesh is not manifold.\n");
		}
	}

	triangle.Edge(i) = e;
}
示例#2
0
//----------------------------------------------------------------------------
void MTMesh::AttachTriangleToEdge (int iT, MTTriangle& rkT, int i, int iE,
    MTEdge& rkE)
{
    if ( rkE.Triangle(0) == -1 )
    {
        rkE.Triangle(0) = iT;
    }
    else
    {
        int iTAdj = rkE.Triangle(0);
        MTTriangle& rkTAdj = m_akTriangle[iTAdj];
        rkT.Adjacent(i) = iTAdj;
        for (int j = 0; j < 3; j++)
        {
            if ( rkTAdj.Edge(j) == iE )
            {
                rkTAdj.Adjacent(j) = iT;
                break;
            }
        }

        if ( rkE.Triangle(1) == -1 )
        {
            rkE.Triangle(1) = iT;
        }
        else
        {
            // mesh is not manifold
            assert( false );
        }
    }

    rkT.Edge(i) = iE;
}
示例#3
0
//----------------------------------------------------------------------------
void MTMesh::DetachTriangleFromEdge (int t, MTTriangle& triangle, int i,
                                     int e, MTEdge& edge)
{
	// This function leaves T only partially complete.  The edge E is no
	// longer referenced by T, even though the vertices of T reference the
	// end points of E.  If T has an adjacent triangle A that shares E, then
	// A is a complete triangle.

	if (edge.Triangle(0) == t)
	{
		int a = edge.Triangle(1);
		if (a != -1)
		{
			// T and TAdj share E, update adjacency information for both
			MTTriangle& adjacent = mTriangles[a];
			for (int j = 0; j < 3; ++j)
			{
				if (adjacent.Edge(j) == e)
				{
					adjacent.Adjacent(j) = -1;
					break;
				}
			}
		}
		edge.Triangle(0) = a;
	}
	else if (edge.Triangle(1) == t)
	{
		// T and TAdj share E, update adjacency information for both
		MTTriangle& adjacent = mTriangles[edge.Triangle(0)];
		for (int j = 0; j < 3; ++j)
		{
			if (adjacent.Edge(j) == e)
			{
				adjacent.Adjacent(j) = -1;
				break;
			}
		}
	}
	else
	{
		// Should not get here.  The specified edge must share the input
		// triangle.
		assertion(false, "Unexpected condition.\n");
	}

	edge.Triangle(1) = -1;
	triangle.Edge(i) = -1;
	triangle.Adjacent(i) = -1;
}
示例#4
0
//----------------------------------------------------------------------------
void MTMesh::DetachTriangleFromEdge (int iT, MTTriangle& rkT, int i, int iE,
    MTEdge& rkE)
{
    // This function leaves T only partially complete.  The edge E is no
    // longer referenced by T, even though the vertices of T reference the
    // end points of E.  If T has an adjacent triangle A that shares E, then
    // A is a complete triangle.

    if ( rkE.Triangle(0) == iT )
    {
        int iTAdj = rkE.Triangle(1);
        if ( iTAdj != -1 )
        {
            // T and TAdj share E, update adjacency information for both
            MTTriangle& rkTAdj = m_akTriangle[iTAdj];
            for (int j = 0; j < 3; j++)
            {
                if ( rkTAdj.Edge(j) == iE )
                {
                    rkTAdj.Adjacent(j) = -1;
                    break;
                }
            }
        }
        rkE.Triangle(0) = iTAdj;
    }
    else if ( rkE.Triangle(1) == iT )
    {
        // T and TAdj share E, update adjacency information for both
        MTTriangle& rkTAdj = m_akTriangle[rkE.Triangle(0)];
        for (int j = 0; j < 3; j++)
        {
            if ( rkTAdj.Edge(j) == iE )
            {
                rkTAdj.Adjacent(j) = -1;
                break;
            }
        }
    }
    else
    {
        // Should not get here.  The specified edge must share the input
        // triangle.
        assert( false );
    }

    rkE.Triangle(1) = -1;
    rkT.Edge(i) = -1;
    rkT.Adjacent(i) = -1;
}