Beispiel #1
0
    /// <summary>
    /// Add a triangular prism (6 vertices and 5 planes) to this fragment.
    /// </summary>
    /// <param name="triPrism">Triangular prism given.</param>
    public void PushBackTriPrism(List <Vector3> triPrism)
    {
        if (triPrism.Count != 6)
        {
            return;
        }
        List <int> plane1 = new List <int>(), plane2 = new List <int>();
        int        times = 0;

        for (int i1 = 0; i1 < 6; i1++)
        {
            for (int i2 = i1 + 1; i2 < 6; i2++)
            {
                for (int i3 = i2 + 1; i3 < 6; i3++)
                {
                    for (int i4 = i3 + 1; i4 < 6; i4++)
                    {
                        if (ToolFunction.IsCoplanar(triPrism[i1], triPrism[i2], triPrism[i3], triPrism[i4]))
                        {
                            times++;
                            if (times == 1)
                            {
                                plane1.AddRange(new int[] { i1, i2, i3, i4 });
                            }
                            else
                            {
                                plane2.AddRange(new int[] { i1, i2, i3, i4 });
                                goto out_loop;
                            }
                        }
                    }
                }
            }
        }
out_loop:
        List <int> intersect = new List <int>();

        foreach (int i in plane1)
        {
            if (plane2.Contains(i))
            {
                intersect.Add(i);
                plane2.Remove(i);
            }
        }
        foreach (int i in intersect)
        {
            plane1.Remove(i);
        }
        // For ABC-DEF
        // vertices1: ADEB
        List <Vector3> vertices1 = ToolFunction.SortConvexPolygon(new List <Vector3> {
            triPrism[intersect[0]], triPrism[intersect[1]], triPrism[plane1[0]], triPrism[plane1[1]]
        });
        // vertices2: ADFC
        List <Vector3> vertices2 = ToolFunction.SortConvexPolygon(new List <Vector3> {
            triPrism[intersect[0]], triPrism[intersect[1]], triPrism[plane2[0]], triPrism[plane2[1]]
        });

        // tetra F-ABC
        PushBackTetra(new List <Vector3> {
            vertices2[2], vertices1[0], vertices1[3], vertices2[3]
        });
        // tetra F-ABE
        PushBackTetra(new List <Vector3> {
            vertices2[2], vertices1[0], vertices1[3], vertices1[2]
        });
        // tetra F-ADE
        PushBackTetra(new List <Vector3> {
            vertices2[2], vertices1[0], vertices1[1], vertices1[2]
        });
    }