Esempio n. 1
0
        public static List <Vector3> Simplify(List <Vector3> points, float minArea, bool isClosed, bool useCopy = true)
        {
            const int minPointsCount = 10;

            var pts = useCopy ? new List <Vector3>(points) : points;

            if (isClosed)
            {
                int prevPointCount;
                int index = 0;
                do
                {
                    prevPointCount = pts.Count;
                    while (index < pts.Count && pts.Count >= minPointsCount)
                    {
                        Vector2 p1 = pts[index];
                        Vector2 p2 = pts[(index + 1) % pts.Count];
                        Vector2 p3 = pts[(index + 2) % pts.Count];

                        var area = MeshHelper.GetTriangleArea(p1, p2, p3);
                        if (area < minArea)
                        {
                            pts.RemoveAt((index + 1) % pts.Count);
                            index += 2;
                        }
                        else
                        {
                            index++;
                        }
                    }
                    index %= pts.Count;
                } while (prevPointCount != pts.Count);
            }
            else
            {
                int prevPointCount;
                do
                {
                    prevPointCount = pts.Count;
                    int index = 0;
                    while (index < pts.Count - 2 && pts.Count >= minPointsCount)
                    {
                        Vector2 p1 = pts[index];
                        Vector2 p2 = pts[index + 1];
                        Vector2 p3 = pts[index + 2];

                        var area = MeshHelper.GetTriangleArea(p1, p2, p3);
                        if (area < minArea)
                        {
                            pts.RemoveAt(index + 1);
                            index += 2;
                        }
                        else
                        {
                            index++;
                        }
                    }
                } while (prevPointCount != pts.Count);
            }
            return(pts);
        }