コード例 #1
0
        public static float Len(VtPoint a, VtPoint b)
        {
            var dx = a.X - b.X;
            var dy = a.Y - b.Y;

            return((float)Math.Sqrt(dx * dx + dy * dy));
        }
コード例 #2
0
        public static void DelanuaStep(ref List <VtTriangle> triangles, VtPoint newPoint)
        {
            var badTriangles = new List <VtTriangle>();
            var edges        = new List <VtEdge>();

            FindInvalidTriangles(triangles, newPoint, out badTriangles, out edges);
            edges     = RemoveDuplicateEdges(edges);
            triangles = RemoveBadTriangles(triangles, badTriangles);
            FillHole(ref triangles, edges, newPoint);
        }
コード例 #3
0
        public static List <VtTriangle> GetTriangles(List <VtTriangle> triangles, VtPoint pt)
        {
            var result = new List <VtTriangle>();

            for (int i = 0; i < triangles.Count; i++)
            {
                var tr = triangles[i];
                if (tr.A == pt || tr.B == pt || tr.C == pt)
                {
                    result.Add(tr);
                }
            }
            return(result);
        }
コード例 #4
0
 internal static void FindInvalidTriangles(List <VtTriangle> triangles, VtPoint newPoint, out List <VtTriangle> badTriangles, out List <VtEdge> allEdges)
 {
     badTriangles = new List <VtTriangle>();
     allEdges     = new List <VtEdge>();
     for (int triCounter = 0; triCounter < triangles.Count; triCounter++)
     {
         if (EMath.Len(triangles[triCounter].CirC, newPoint) < triangles[triCounter].CirR)
         {
             badTriangles.Add(triangles[triCounter]);
             allEdges.Add(triangles[triCounter].AB);
             allEdges.Add(triangles[triCounter].BC);
             allEdges.Add(triangles[triCounter].AC);
         }
     }
 }
コード例 #5
0
        public static List <VtEdge> MissedEdges(this List <VtEdge> edges, float minX, float minY, float maxX, float maxY)
        {
            List <VtEdge> result = new List <VtEdge>();
            var           points = new List <VtPoint>();

            for (int i = 0; i < edges.Count; i++)
            {
                var edge = edges[i];

                var ex = points.FirstOrDefault(point => point == edge.S);
                if (ex != null)
                {
                    points.Remove(ex);
                }
                else
                {
                    points.Add(edge.S);
                }

                ex = points.FirstOrDefault(point => point == edge.E);
                if (ex != null)
                {
                    points.Remove(ex);
                }
                else
                {
                    points.Add(edge.E);
                }
            }

            if (points.Count != 2)
            {
                return(result);
            }

            var pt1 = points[0];
            var pt2 = points[1];

            if (Math.Abs(pt1.X - pt2.X) < float.Epsilon || Math.Abs(pt1.Y - pt2.Y) < float.Epsilon)
            {
                result.Add(new VtEdge(pt1, pt2));
                return(result);
            }

            float x = 0, y = 0;

            if (Math.Abs(pt1.X - minX) < float.Epsilon || Math.Abs(pt1.X - maxX) < float.Epsilon)
            {
                x = pt1.X;
            }
            else
            if (Math.Abs(pt2.X - minX) < float.Epsilon || Math.Abs(pt2.X - maxX) < float.Epsilon)
            {
                x = pt2.X;
            }
            if (Math.Abs(pt1.Y - minY) < float.Epsilon || Math.Abs(pt1.Y - maxY) < float.Epsilon)
            {
                y = pt1.Y;
            }
            else
            if (Math.Abs(pt2.Y - minY) < float.Epsilon || Math.Abs(pt2.Y - maxY) < float.Epsilon)
            {
                y = pt2.Y;
            }

            var pt = new VtPoint(x, y);

            result.Add(new VtEdge(pt1, pt));
            result.Add(new VtEdge(pt, pt2));
            return(result);
        }
コード例 #6
0
 private static void FillHole(ref List <VtTriangle> triangles, List <VtEdge> polygonHole, VtPoint newPoint)
 {
     for (int polyCounter = 0; polyCounter < polygonHole.Count; polyCounter++)
     {
         triangles.Add(new VtTriangle(polygonHole[polyCounter].S, polygonHole[polyCounter].E, newPoint));
     }
 }