Exemple #1
0
 public static bool IsFlatAngle(TPoint p1, TPoint p2, TPoint p3)
 {
     return(CrossProduct(p1, p2, p3) == 0);
 }
Exemple #2
0
        public override bool Equals(object point)
        {
            TPoint p = point as TPoint;

            return(p.x == x && p.y == y);
        }
Exemple #3
0
 public float Distance(TPoint p)
 {
     return((float)Math.Sqrt(Distance2(p)));
 }
Exemple #4
0
 public Edge(TPoint p1, TPoint p2)
 {
     this.p1 = p1;
     this.p2 = p2;
 }
Exemple #5
0
 public bool InCircumCircle(TPoint p)
 {
     float[] circle = GetCircumCircle();
     return(p.IsInCircle(circle[0], circle[1], circle[2]));
 }
Exemple #6
0
        public static List <Triangle> Triangulate(List <TPoint> vertices)
        {
            int nvertices = vertices.Count;

            if (vertices.Count < 3)
            {
                return(null);
            }

            int trmax = nvertices * 4;

            float minX = vertices[0].x;
            float minY = vertices[0].y;
            float maxX = minX;
            float maxY = minY;

            for (int i = 0; i < nvertices; i++)
            {
                TPoint vertex = vertices[i];
                vertex.id = i;

                if (vertex.x < minX)
                {
                    minX = vertex.x;
                }
                if (vertex.y < minY)
                {
                    minY = vertex.y;
                }
                if (vertex.x > maxX)
                {
                    maxX = vertex.x;
                }
                if (vertex.y > maxY)
                {
                    maxY = vertex.y;
                }
            }

            float dx = (maxX - minX) * convexMultiplier;
            float dy = (maxY - minY) * convexMultiplier;

            float deltaMax = Math.Max(dx, dy);

            float midx = (minX + maxX) * 0.5f;
            float midy = (minY + maxY) * 0.5f;

            TPoint p1 = new TPoint(midx - 2 * deltaMax, midy - deltaMax);
            TPoint p2 = new TPoint(midx, midy + 2 * deltaMax);
            TPoint p3 = new TPoint(midx + 2 * deltaMax, midy - deltaMax);

            p1.id = nvertices;
            p2.id = nvertices + 1;
            p3.id = nvertices + 2;

            vertices.Add(p1);
            vertices.Add(p2);
            vertices.Add(p3);

            List <Triangle> triangles = new List <Triangle>();

            triangles.Add(new Triangle(vertices[nvertices], vertices[nvertices + 1], vertices[nvertices + 2]));

            for (int i = 0; i < nvertices; i++)
            {
                List <Edge> edges      = new List <Edge>();
                int         nTriangles = triangles.Count;

                for (int j = triangles.Count - 1; j >= 0; j--)
                {
                    Triangle curTriangle = triangles[j];
                    if (curTriangle.InCircumCircle(vertices[i]))
                    {
                        edges.Add(curTriangle.e1);
                        edges.Add(curTriangle.e2);
                        edges.Add(curTriangle.e3);

                        triangles.RemoveAt(j);
                    }
                }

                for (int j = edges.Count - 2; j >= 0; j--)
                {
                    for (int k = edges.Count - 1; k >= j + 1; k--)
                    {
                        if (j < edges.Count && k < edges.Count && edges[j].Same(edges[k]))
                        {
                            edges.RemoveAt(j);

                            if (edges.Count > 0)
                            {
                                edges.RemoveAt(k - 1);
                            }
                        }
                    }
                }

                for (int j = 0; j < edges.Count; j++)
                {
                    int n = triangles.Count;

                    triangles.Add(new Triangle(edges[j].p1, edges[j].p2, vertices[i]));
                }
            }

            for (int i = triangles.Count - 1; i >= 0; i--)
            {
                Triangle triangle = triangles[i];
                if (triangle.p1.id > nvertices ||
                    triangle.p2.id > nvertices ||
                    triangle.p3.id > nvertices)
                {
                    triangles.RemoveAt(i);
                }
            }

            for (int i = 0; i < 3; i++)
            {
                vertices.RemoveAt(i);
            }

            return(triangles);
        }