protected override void BuildMeshComponents()
        {
            Vertices = new Vector3[4];
            Vector2 center = (verts[0] + verts[1] + verts[2] + verts[3]) * 0.25f;

            for (int i = 0; i < 4; i++)
            {
                Vertices[i] = verts[i] - center;
            }

            if (MeshHelper.IsPointInTriangle(verts[0], verts[1], verts[2], verts[3]))
            {
                Triangles = new int[] { 0, 2, 3, 0, 1, 2 };
            }
            else if (!MeshHelper.IsPointInTriangle(verts[3], verts[0], verts[1], verts[2]))
            {
                if (MeshHelper.IsPointInTriangle(verts[2], verts[0], verts[1], verts[3]))
                {
                    Triangles = new int[] { 0, 2, 3, 1, 0, 2 };
                }
                else
                {
                    Triangles = new int[] { 0, 1, 3, 1, 2, 3 };
                }
            }
            else
            {
                Triangles = new int[] { 0, 1, 3, 2, 3, 1 };
            }

            UVs = MeshHelper.UVUnwrap(Vertices);
        }
Ejemplo n.º 2
0
        public static List<Vector2Triple> GetTriangles(List<Vector2> sourcePoints)
        {
            List<Vector2Triple> triangles = new List<Vector2Triple>();
            int MAX = sourcePoints.Count * sourcePoints.Count;

            //temporary List of points
            List<Vector2> verts = sourcePoints;

            //was shape drawn clockwise?
            bool isCW = IsShapeClockWise(verts);
            int start = 0;

            int repeats = 0;

            while (verts.Count > 2 && repeats < MAX)
            {
                bool earNotFound = true;
                while (earNotFound && repeats < MAX)
                {
                    repeats++;
                    start %= verts.Count;
                    int middle = (start + 1) % verts.Count;
                    int end = (start + 2) % verts.Count;

                    triangles.Add(new Vector2Triple(verts[start], verts[middle], verts[end]));
                    //is current point convex?
                    bool isConvex =
                        IsPointConvex(verts[start], verts[middle], verts[middle], verts[end], !isCW)
                        && IsPointConvex(verts[middle], verts[end], verts[end], verts[start], !isCW)
                        && IsPointConvex(verts[end], verts[start], verts[start], verts[middle], !isCW);

                    if (!isConvex)
                    {
                        //reject the triangle
                        start++;
                        triangles.RemoveAt(triangles.Count - 1);
                        continue;
                    }

                    bool noPointsIn = true;

                    for (int i = 0; i < verts.Count; i++)
                        if (i != start && i != middle && i != end)
                            if (MeshHelper.IsPointInTriangle(verts[i], verts[start], verts[middle], verts[end]) && noPointsIn)
                            {
                                //there's a point in triangle
                                noPointsIn = false;
                                //reject the triangle
                                start++;
                                triangles.RemoveAt(triangles.Count - 1);
                                break;
                            }

                    if (noPointsIn)
                    {
                        earNotFound = false;
                        //add triangle to set
                        verts.RemoveAt(middle);
                    }
                }
            }
            return triangles;
        }
Ejemplo n.º 3
0
        public static List<IntTriple> TriangulationToInt3(List<Vector2> sourcePoints)
        {
            List<IntTriple> triangles = new List<IntTriple>();
            int MAX = sourcePoints.Count * sourcePoints.Count;

            //temporary List of points
            List<VecIndexPair> verts = VecIndexPair.Get(sourcePoints);

            //was shape drew clockwise?
            bool isCW = IsShapeClockWise(sourcePoints);
            int start = 0;

            int repeats = 0;

            while (verts.Count > 2 && repeats < MAX)
            {
                bool earNotFound = true;
                while (earNotFound && repeats < MAX)
                {
                    repeats++;
                    start %= verts.Count;
                    int middle = (start + 1) % verts.Count;
                    int end = (start + 2) % verts.Count;

                    //change the order to fit triangle mesh facing
                    triangles.Add(new IntTriple(verts[start].index, verts[end].index, verts[middle].index));

                    //is current point convex?
                    bool isConvex =
                        IsPointConvex(verts[start].v, verts[middle].v, verts[middle].v, verts[end].v, !isCW)
                        && IsPointConvex(verts[middle].v, verts[end].v, verts[end].v, verts[start].v, !isCW)
                        && IsPointConvex(verts[end].v, verts[start].v, verts[start].v, verts[middle].v, !isCW);

                    if (!isConvex)
                    {
                        //reject the triangle
                        start++;
                        triangles.RemoveAt(triangles.Count - 1);
                        continue;
                    }

                    bool noPointsIn = true;

                    for (int i = 0; i < verts.Count; i++)
                    {
                        if (i != start && i != middle && i != end)
                            if (MeshHelper.IsPointInTriangle(verts[i].v, verts[start].v, verts[middle].v, verts[end].v) && noPointsIn)
                            {
                                //there's a point in triangle
                                noPointsIn = false;
                                //reject the triangle
                                start++;
                                triangles.RemoveAt(triangles.Count - 1);
                                break;
                            }
                    }

                    if (noPointsIn)
                    {
                        earNotFound = false;
                        //add triangle to set
                        verts.RemoveAt(middle);
                    }
                }
            }
            return triangles;
        }