Esempio n. 1
0
        public void Add(Vertex v)
        {
            if (startVertex == null)
            {
                startVertex = v;
            }
            else
            {
                endVertex.SetNextVertex(v);
                v.SetPrevVertex(endVertex);
                v.SetNextVertex(startVertex);
            }

            length++;

            endVertex = v;
            if(!startVertex.Equals(endVertex))
                startVertex.SetPrevVertex(endVertex);
        }
Esempio n. 2
0
        public void Insert(Vertex newVertex, Vertex prevVertex, Vertex nextVertex)
        {
            Vertex prev = prevVertex.GetPrevVertex();
            Vertex next = nextVertex.GetNextVertex();

            prev.SetNextVertex(newVertex);
            newVertex.SetPrevVertex(prev);

            next.SetPrevVertex(newVertex);
            newVertex.SetNextVertex(next);

            if (prevVertex.Equals(this.startVertex))
                startVertex = newVertex;

            if (nextVertex.Equals(this.startVertex))
                startVertex = nextVertex.GetNextVertex();

            if (nextVertex.Equals(this.endVertex))
                endVertex = newVertex;

            length--;
        }
Esempio n. 3
0
        public void TestLineSegmentEdges()
        {
            Vertex v1 = new Vertex(0, 1);
            Vertex v2 = new Vertex(0, 0);
            Vertex v3 = new Vertex(1, 0);

            Assert.IsNull(v2.PrevLineSegment);
            Assert.IsNull(v2.NextLineSegment);

            v2.SetPrevVertex(v1);
            v2.SetNextVertex(v3);

            Assert.AreEqual(new LineSegment(v1, v2), v2.PrevLineSegment);
            Assert.AreEqual(new LineSegment(v2, v3), v2.NextLineSegment);
        }
Esempio n. 4
0
        public void TestSetNextVertex()
        {
            Vertex v1 = new Vertex(0, 1);
            Vertex v2 = new Vertex(1, 1);

            Assert.IsNull(v1.GetNextVertex());

            v1.SetNextVertex(v2);

            Assert.AreEqual(v2, v1.GetNextVertex());
        }
Esempio n. 5
0
        public void TestSetLineSegmentEdges()
        {
            Vertex v1 = new Vertex(0, 1);
            Vertex v2 = new Vertex(0, 0);
            Vertex v3 = new Vertex(1, 0);

            LineSegment ls1 = new LineSegment(new Vertex(1, 1), new Vertex(3, 3));
            LineSegment ls2 = new LineSegment(new Vertex(10, 10), new Vertex(30, 30));

            Assert.IsNull(v2.PrevLineSegment);
            Assert.IsNull(v2.NextLineSegment);

            v2.SetPrevVertex(v1);
            v2.SetNextVertex(v3);

            Assert.AreEqual(new LineSegment(v1, v2), v2.PrevLineSegment);
            Assert.AreEqual(new LineSegment(v2, v3), v2.NextLineSegment);

            v2.PrevLineSegment = ls1;
            v2.NextLineSegment = ls2;

            Assert.AreEqual(ls1, v2.PrevLineSegment);
            Assert.AreEqual(ls2, v2.NextLineSegment);
        }
Esempio n. 6
0
        public void BreakAndCreateNew(Vertex v, int lavIndex)
        {
            LAV lav = this.Get(lavIndex);

            Vertex nextVertex = null;
            Vertex intersection = null;

            foreach (Vertex currentVertex in lav)
            {
                nextVertex = currentVertex.GetNextVertex();

                if (currentVertex.Equals(v) || nextVertex.Equals(v))
                    continue;

                intersection = MathLibrary.GetIntersectionPoint(new LineSegment(currentVertex, currentVertex.AngleBisector), new LineSegment(nextVertex, nextVertex.AngleBisector));

                //IF THE BISECTORS DON'T INTERSECT, OR INTERSECT BEHIND THE LINE, IT MUST BE A QUADRALATERAL
                if ((currentVertex.GetX() < nextVertex.GetX() && (intersection.GetY() < currentVertex.GetY() && intersection.GetY() < nextVertex.GetY())) ||
                    (currentVertex.GetX() > nextVertex.GetX() && (intersection.GetY() > currentVertex.GetY() && intersection.GetY() > nextVertex.GetY())) ||
                    double.IsInfinity(intersection.GetX()))
                {
                    double distanceCurrent = MathLibrary.GetDistanceBetweenVertices(currentVertex, v);
                    double distanceNext = MathLibrary.GetDistanceBetweenVertices(nextVertex, v);

                    double maxDistance = 0;

                    if (distanceCurrent >= distanceNext)
                        maxDistance = distanceCurrent * 10; //MAKE IT A LITTLE BIGGER JUST TO BE SURE
                    else
                        maxDistance = distanceNext * 10; //MAKE IT A LITTLE BIGGER JUST TO BE SURE

                    LineEquation line1 = MathLibrary.GetLineEquation(currentVertex, currentVertex.AngleBisector);
                    LineEquation line2 = MathLibrary.GetLineEquation(nextVertex, nextVertex.AngleBisector);
                    Vertex rectCurrent = new Vertex(line1.GetX(maxDistance + currentVertex.GetY()), maxDistance + currentVertex.GetY());
                    Vertex rectNext = new Vertex(line2.GetX(maxDistance + nextVertex.GetY()), maxDistance + nextVertex.GetY());

                    if (MathLibrary.QuadrilateralContainsPoint(currentVertex, nextVertex, rectNext, rectCurrent, v))
                    {
                        Vertex splitVertex = null;
                        Vertex referenceVertex = null;
                        Vertex counterVertex = lav.GetStart();

                        while (splitVertex == null && !(counterVertex.GetNextVertex().Equals(lav.GetStart())))
                        {
                            if (counterVertex.Equals(v))
                                splitVertex = counterVertex;
                            else if (counterVertex.Equals(currentVertex))
                                referenceVertex = counterVertex;

                            counterVertex = counterVertex.GetNextVertex();
                        }

                        counterVertex = lav.GetStart();
                        while (referenceVertex == null && !(counterVertex.GetNextVertex().Equals(lav.GetStart())))
                        {
                            if (counterVertex.Equals(v))
                                splitVertex = counterVertex;
                            else if (counterVertex.Equals(currentVertex))
                                referenceVertex = counterVertex;

                            counterVertex = counterVertex.GetNextVertex();
                        }

                        Vertex splitNext = splitVertex.GetNextVertex();
                        Vertex splitPrev = splitVertex.GetPrevVertex();

                        Vertex refNext = referenceVertex.GetNextVertex();
                        Vertex refPrev = referenceVertex.GetPrevVertex();

                        Vertex newVertex1 = new Vertex(v.AngleBisector.GetX(), v.AngleBisector.GetY());
                        newVertex1.SetNextVertex(splitNext);
                        newVertex1.SetPrevVertex(referenceVertex);

                        referenceVertex.SetNextVertex(newVertex1);
                        splitVertex.GetNextVertex().SetPrevVertex(newVertex1);

                        SSLOperations.SetVertexType(newVertex1);
                        newVertex1.AngleBisector = MathLibrary.GetAngleBisectorVertex(newVertex1.PrevLineSegment, newVertex1.NextLineSegment);

                        Vertex newVertex2 = new Vertex(v.AngleBisector.GetX(), v.AngleBisector.GetY());
                        newVertex2.SetNextVertex(refNext);
                        newVertex2.SetPrevVertex(splitPrev);

                        splitVertex.GetPrevVertex().SetNextVertex(newVertex2);
                        referenceVertex.GetNextVertex().SetPrevVertex(newVertex2);

                        SSLOperations.SetVertexType(newVertex2);
                        newVertex2.AngleBisector = MathLibrary.GetAngleBisectorVertex(newVertex2.PrevLineSegment, newVertex2.NextLineSegment);

                        //CREATE NEW LAV
                        this.Insert(newVertex2, lavIndex + 1);
                        Vertex counterVertex2 = newVertex2.GetNextVertex();
                        while (!counterVertex2.Equals(newVertex2))
                        {
                            this.Insert(counterVertex2, lavIndex + 1);
                            counterVertex2 = counterVertex2.GetNextVertex();
                        }

                        break;
                    }

                }
                else
                {
                    if (MathLibrary.TriangleContainsPoint(currentVertex, nextVertex, intersection, v.AngleBisector))
                    {
                        bool matchFound = false;
                        foreach (Vertex matchVertex in lav)
                        {
                            if (matchFound)
                            {
                                this.Insert(matchVertex, lavIndex + 1);
                            }

                            if (matchVertex.Equals(v))
                            {
                                Vertex newVertex = new Vertex(v.AngleBisector.GetX(), v.AngleBisector.GetY());
                                newVertex.SetPrevVertex(matchVertex.GetPrevVertex());
                                newVertex.SetNextVertex(nextVertex);

                                matchVertex.GetPrevVertex().SetNextVertex(newVertex);

                                SSLOperations.SetVertexType(newVertex);
                                newVertex.AngleBisector = MathLibrary.GetAngleBisectorVertex(newVertex.PrevLineSegment, newVertex.NextLineSegment);

                                this.Insert(newVertex, lavIndex + 1);

                                matchFound = true;
                            }
                        }

                        break;
                    }
                }
            }
        }