protected void UpdateVertexReflexity(PartitionVertex v)
        {
            PartitionVertex v1 = null, v3 = null;

            v1 = v.previous;
            v3 = v.next;

            v.isConvex = !IsReflex(v1.p, v.p, v3.p);
        }
Beispiel #2
0
        protected void UpdateVertexReflexity(PartitionVertex v)
        {
            PartitionVertex v1 = null, v3 = null;

            v1 = v.Previous;
            v3 = v.Next;

            v.IsConvex = !IsReflex(v1.P, v.P, v3.P);
        }
Beispiel #3
0
        protected bool InCone(PartitionVertex v, TpplPoint p)
        {
            TpplPoint p1, p2, p3;

            p1 = v.Previous.P;
            p2 = v.P;
            p3 = v.Next.P;

            return(InCone(p1, p2, p3, p));
        }
        protected bool InCone(PartitionVertex v, TPPLPoint p)
        {
            TPPLPoint p1, p2, p3;

            p1 = v.previous.p;
            p2 = v.p;
            p3 = v.next.p;

            return(InCone(p1, p2, p3, p));
        }
Beispiel #5
0
        protected void UpdateVertex(PartitionVertex v, List <PartitionVertex> vertices)
        {
            int             i;
            PartitionVertex v1 = null, v3 = null;
            TpplPoint       vec1, vec3;

            v1 = v.Previous;
            v3 = v.Next;

            v.IsConvex = IsConvex(v1.P, v.P, v3.P);

            vec1 = Normalize(v1.P - v.P);
            vec3 = Normalize(v3.P - v.P);

            v.Angle = vec1.X * vec3.X + vec1.Y * vec3.Y;

            if (v.IsConvex)
            {
                v.IsEar = true;

                int numvertices = vertices.Count;
                for (i = 0; i < numvertices; i++)
                {
                    if ((vertices[i].P.X == v.P.X) && (vertices[i].P.Y == v.P.Y))
                    {
                        continue;
                    }
                    if ((vertices[i].P.X == v1.P.X) && (vertices[i].P.Y == v1.P.Y))
                    {
                        continue;
                    }
                    if ((vertices[i].P.X == v3.P.X) && (vertices[i].P.Y == v3.P.Y))
                    {
                        continue;
                    }
                    if (IsInside(v1.P, v.P, v3.P, vertices[i].P))
                    {
                        v.IsEar = false;
                        break;
                    }
                }
            }
            else
            {
                v.IsEar = false;
            }
        }
        protected void UpdateVertex(PartitionVertex v, List <PartitionVertex> vertices)
        {
            int             i;
            PartitionVertex v1 = null, v3 = null;
            TPPLPoint       vec1, vec3;

            v1 = v.previous;
            v3 = v.next;

            v.isConvex = IsConvex(v1.p, v.p, v3.p);

            vec1 = Normalize(v1.p - v.p);
            vec3 = Normalize(v3.p - v.p);

            v.angle = vec1.X * vec3.X + vec1.Y * vec3.Y;

            if (v.isConvex)
            {
                v.isEar = true;

                int numvertices = vertices.Count();
                for (i = 0; i < numvertices; i++)
                {
                    if ((vertices[i].p.X == v.p.X) && (vertices[i].p.Y == v.p.Y))
                    {
                        continue;
                    }
                    if ((vertices[i].p.X == v1.p.X) && (vertices[i].p.Y == v1.p.Y))
                    {
                        continue;
                    }
                    if ((vertices[i].p.X == v3.p.X) && (vertices[i].p.Y == v3.p.Y))
                    {
                        continue;
                    }
                    if (IsInside(v1.p, v.p, v3.p, vertices[i].p))
                    {
                        v.isEar = false;
                        break;
                    }
                }
            }
            else
            {
                v.isEar = false;
            }
        }
Beispiel #7
0
        private static void UpdateVertex(PartitionVertex v, PartitionVertex[] vertices, int numvertices)
        {
            PartitionVertex v1 = v.previous;
            PartitionVertex v3 = v.next;

            v.isConvex = IsConvex(v1.p, v.p, v3.p);

            Vector2 vec1 = Normalize(v1.p - v.p);
            Vector2 vec3 = Normalize(v3.p - v.p);

            v.angle = vec1.x * vec3.x + vec1.y * vec3.y;

            if (v.isConvex)
            {
                v.isEar = true;
                for (int i = 0; i < numvertices; i++)
                {
                    if ((vertices[i].p.x == v.p.x) && (vertices[i].p.y == v.p.y))
                    {
                        continue;
                    }
                    if ((vertices[i].p.x == v1.p.x) && (vertices[i].p.y == v1.p.y))
                    {
                        continue;
                    }
                    if ((vertices[i].p.x == v3.p.x) && (vertices[i].p.y == v3.p.y))
                    {
                        continue;
                    }
                    if (IsInside(v1.p, v.p, v3.p, vertices[i].p))
                    {
                        v.isEar = false;
                        break;
                    }
                }
            }
            else
            {
                v.isEar = false;
            }
        }
Beispiel #8
0
        public int Triangulate_EC(TpplPoly poly, List <TpplPoly> triangles)
        {
            int numvertices;
            List <PartitionVertex> vertices = null;
            PartitionVertex        ear      = null;

            TpplPoly triangle = new TpplPoly();

            int  i, j;
            bool earfound;

            if (poly.Count < 3)
            {
                return(0);
            }
            if (poly.Count == 3)
            {
                triangles.Add(poly);
                return(1);
            }

            numvertices = poly.Count;

            vertices = new List <PartitionVertex>(numvertices);

            for (i = 0; i < numvertices; i++)
            {
                vertices.Add(new PartitionVertex());
            }

            for (i = 0; i < numvertices; i++)
            {
                vertices[i].IsActive = true;
                vertices[i].P        = poly[i];
                if (i == (numvertices - 1))
                {
                    vertices[i].Next = vertices[0];
                }
                else
                {
                    vertices[i].Next = vertices[i + 1];
                }
                if (i == 0)
                {
                    vertices[i].Previous = vertices[numvertices - 1];
                }
                else
                {
                    vertices[i].Previous = vertices[i - 1];
                }
            }

            for (i = 0; i < numvertices; i++)
            {
                UpdateVertex(vertices[i], vertices);
            }

            for (i = 0; i < numvertices - 3; i++)
            {
                earfound = false;
                //find the most extruded ear
                for (j = 0; j < numvertices; j++)
                {
                    if (!vertices[j].IsActive)
                    {
                        continue;
                    }
                    if (!vertices[j].IsEar)
                    {
                        continue;
                    }
                    if (!earfound)
                    {
                        earfound = true;
                        ear      = vertices[j];
                    }
                    else
                    {
                        if (vertices[j].Angle > ear.Angle)
                        {
                            ear = vertices[j];
                        }
                    }
                }
                if (!earfound)
                {
                    vertices.Clear();
                    return(0);
                }

                triangle = new TpplPoly(ear.Previous.P, ear.P, ear.Next.P);
                triangles.Add(triangle);

                ear.IsActive      = false;
                ear.Previous.Next = ear.Next;
                ear.Next.Previous = ear.Previous;

                if (i == numvertices - 4)
                {
                    break;
                }

                UpdateVertex(ear.Previous, vertices);
                UpdateVertex(ear.Next, vertices);
            }

            for (i = 0; i < numvertices; i++)
            {
                if (vertices[i].IsActive)
                {
                    triangle = new TpplPoly(vertices[i].Previous.P, vertices[i].P, vertices[i].Next.P);
                    triangles.Add(triangle);
                    break;
                }
            }

            vertices.Clear();

            return(1);
        }
Beispiel #9
0
        // Triangulates a polygon by ear clipping
        // time complexity O(n^2), n is the number of vertices
        // space complexity: O(n)
        // params:
        //    poly : an input polygon to be triangulated
        //           vertices have to be in counter-clockwise order
        //    triangles : a list of triangles (result)
        // returns true on success, false on failure
        private static bool Triangulate_EC(TPPLPoly poly, out TPPLPolyList triangles)
        {
            triangles = new TPPLPolyList();

            if (!poly.Valid())
            {
                return(false);
            }

            int numvertices = poly.NumPoints;

            if (numvertices < 3)
            {
                return(false);
            }
            if (numvertices == 3)
            {
                triangles.Add(poly);
                return(true);
            }

            PartitionVertex[] vertices = new PartitionVertex[numvertices];
            PartitionVertex   ear      = null;

            for (int i = 0; i < numvertices; i++)
            {
                vertices[i] = new PartitionVertex();
            }
            for (int i = 0; i < numvertices; i++)
            {
                vertices[i].isActive = true;
                vertices[i].p        = poly.GetPoint(i);
                if (i == (numvertices - 1))
                {
                    vertices[i].next = vertices[0];
                }
                else
                {
                    vertices[i].next = vertices[i + 1];
                }
                if (i == 0)
                {
                    vertices[i].previous = vertices[numvertices - 1];
                }
                else
                {
                    vertices[i].previous = vertices[i - 1];
                }
            }
            for (int i = 0; i < numvertices; i++)
            {
                UpdateVertex(vertices[i], vertices, numvertices);
            }

            for (int i = 0; i < numvertices - 3; i++)
            {
                bool earfound = false;
                //find the most extruded ear
                for (int j = 0; j < numvertices; j++)
                {
                    if (!vertices[j].isActive)
                    {
                        continue;
                    }
                    if (!vertices[j].isEar)
                    {
                        continue;
                    }
                    if (!earfound)
                    {
                        earfound = true;
                        ear      = vertices[j];
                    }
                    else
                    {
                        if (vertices[j].angle > ear.angle)
                        {
                            ear = vertices[j];
                        }
                    }
                }
                if (!earfound)
                {
                    return(false);
                }

                triangles.Add(new TPPLPoly(ear.previous.p, ear.p, ear.next.p));

                ear.isActive      = false;
                ear.previous.next = ear.next;
                ear.next.previous = ear.previous;

                if (i == numvertices - 4)
                {
                    break;
                }

                UpdateVertex(ear.previous, vertices, numvertices);
                UpdateVertex(ear.next, vertices, numvertices);
            }
            for (int i = 0; i < numvertices; i++)
            {
                if (vertices[i].isActive)
                {
                    triangles.Add(new TPPLPoly(vertices[i].previous.p, vertices[i].p, vertices[i].next.p));
                    break;
                }
            }

            return(true);
        }