Пример #1
0
        public static void SetVertexType(Vertex v)
        {
            Vertex next = null;
            Vertex prev = null;

            double nextX = 0;
            double nextY = 0;

            double prevX = 0;
            double prevY = 0;

            double myX = 0;
            double myY = 0;

            myX = v.GetX();
            myY = v.GetY();

            next = v.GetNextVertex();
            prev = v.GetPrevVertex();

            nextX = next.GetX();
            nextY = next.GetY();

            prevX = prev.GetX();
            prevY = prev.GetY();

            if (nextX == myX)
            {
                nextX += 0.01;
            }

            if (nextY == myY)
            {
                nextY -= 0.01;
            }

            if (prevX == myX)
            {
                prevX -= 0.01;
            }

            if (prevY == myY)
            {
                prevY -= 0.01;
            }

            if ((prevY < myY && prevX < myX) && (nextY < myY && myX < nextX)) //PEAK
            {
                v.Type = Vertex.VertexType.Split;
            }
            else if ((prevY > myY && myX < prevX) && (nextY > myY && nextX < myX)) //VALLEY
            {
                v.Type = Vertex.VertexType.Split;
            }
            else if ((prevY > myY && myX > prevX) && (myY > nextY && myX > nextX)) //>
            {
                v.Type = Vertex.VertexType.Split;
            }
            else if ((prevY < myY && prevX > myX) && (myY < nextY && nextX > myX)) //<
            {
                v.Type = Vertex.VertexType.Split;
            }
            else
            {
                v.Type = Vertex.VertexType.Edge;
            }
        }
Пример #2
0
        public static Intersection GetClosestIntersection(Vertex v)
        {
            Vertex next = v.GetNextVertex();
            Vertex prev = v.GetPrevVertex();

            Vertex nextIntersection = MathLibrary.GetIntersectionPoint(new LineSegment(next, next.AngleBisector), new LineSegment(v, v.AngleBisector));
            Vertex prevIntersection = MathLibrary.GetIntersectionPoint(new LineSegment(prev, prev.AngleBisector), new LineSegment(v, v.AngleBisector));

            Vertex.VertexType type = Vertex.VertexType.Undefined;

            if (MathLibrary.GetDistanceBetweenLineAndVertex(v, next, nextIntersection) < MathLibrary.GetDistanceBetweenLineAndVertex(v, prev, prevIntersection))
            {
                if (v.Type == Vertex.VertexType.Split || next.Type == Vertex.VertexType.Split)
                    type = Vertex.VertexType.Split;
                else
                    type = Vertex.VertexType.Edge;

                Intersection i = new Intersection(nextIntersection.GetX(), nextIntersection.GetY(), next, v, type, next.NextLineSegment, v.PrevLineSegment);
                return i;
            }
            else
            {
                if (v.Type == Vertex.VertexType.Split || prev.Type == Vertex.VertexType.Split)
                    type = Vertex.VertexType.Split;
                else
                    type = Vertex.VertexType.Edge;

                Intersection i = new Intersection(prevIntersection.GetX(), prevIntersection.GetY(), v, prev, type, prev.PrevLineSegment, v.NextLineSegment);
                return i;
            }
        }
Пример #3
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--;
        }
Пример #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());
        }
Пример #5
0
 public void TestNullPrevAndNextNeighbor()
 {
     Vertex v = new Vertex(0, 1);
     Assert.IsNull(v.GetPrevVertex());
     Assert.IsNull(v.GetNextVertex());
 }
Пример #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;
                    }
                }
            }
        }