Пример #1
0
        public void TestEqualVertices()
        {
            Vertex v1 = new Vertex(0.1234, 0.1234);
            Vertex v2 = new Vertex(0.1234, 0.1234);

            Assert.IsTrue(v1.Equals(v2));
        }
Пример #2
0
        public void TestInvalidObjectComparison()
        {
            Vertex v1 = new Vertex(0.1234, 0.1234);
            LAV lav = new LAV();

            Assert.IsFalse(v1.Equals(lav));
        }
Пример #3
0
        public void TestEdgeAngleBisectorPoint()
        {
            Vertex v1;
            Vertex v2;
            Vertex v3;

            v1 = new Vertex(1, 3);
            v2 = new Vertex(1, 1);
            v3 = new Vertex(3, 1);

            LineSegment ls1 = new LineSegment(v1, v2);
            LineSegment ls2 = new LineSegment(v2, v3);

            Vertex bisector = MathLibrary.GetAngleBisectorVertex(ls1, ls2);
            Assert.AreEqual(1.71, Math.Round(bisector.GetX(), 2));
            Assert.AreEqual(1.71, Math.Round(bisector.GetY(), 2));

            v1 = new Vertex(5.78, 5.90);
            v2 = new Vertex(5, 3);
            v3 = new Vertex(6.93, 3.52);

            ls1 = new LineSegment(v1, v2);
            ls2 = new LineSegment(v2, v3);

            bisector = MathLibrary.GetAngleBisectorVertex(ls1, ls2);
            Assert.AreEqual(5.71, Math.Round(bisector.GetX(), 2));
            Assert.AreEqual(3.71, Math.Round(bisector.GetY(), 2));
        }
Пример #4
0
        //V2 ALWAYS NEEDS TO BE THE MIDDLE VERTEX
        public static double GetAngleBetweenVerticese(Vertex v1, Vertex v2, Vertex v3)
        {
            double a = MathLibrary.GetDistanceBetweenVertices(v1, v2);
            double b = MathLibrary.GetDistanceBetweenVertices(v2, v3);
            double c = MathLibrary.GetDistanceBetweenVertices(v1, v3);

            return RadiansToDegrees(Math.Acos(((a * a) + (b * b) - (c * c)) / (2 * a * b)));
        }
Пример #5
0
        public void TestBreakAndCreateNew()
        {
            SLAV slav = new SLAV();

            //NEED TO MAINTAIN THIS LIST FOR TESTING PURPOSES
            LAV localLav = new LAV();

            Vertex v1 = new Vertex(0, 3);
            Vertex v2 = new Vertex(2, 0);
            Vertex v3 = new Vertex(4, 2);
            Vertex v4 = new Vertex(6, 0);
            Vertex v5 = new Vertex(8, 3);

            localLav.Add(v1);
            localLav.Add(v2);
            localLav.Add(v3);
            localLav.Add(v4);
            localLav.Add(v5);

            SSLOperations.SetVertexType(localLav);
            SSLOperations.ComputeAngleBisectors(localLav);

            slav.Insert(v1, 0);
            slav.Insert(v2, 0);
            slav.Insert(v3, 0);
            slav.Insert(v4, 0);
            slav.Insert(v5, 0);

            SSLOperations.SetVertexType(slav.Get(0));
            SSLOperations.ComputeAngleBisectors(slav.Get(0));

            LAV lav = slav.Get(0);
            Assert.AreEqual(v1, lav.Get(1));
            Assert.AreEqual(v2, lav.Get(2));
            Assert.AreEqual(v3, lav.Get(3));
            Assert.AreEqual(Vertex.VertexType.Split, lav.Get(3).Type);
            Assert.AreEqual(v4, lav.Get(4));
            Assert.AreEqual(v5, lav.Get(5));

            slav.BreakAndCreateNew(v3, 0);

            lav = slav.Get(0);

            Assert.AreEqual(v1, lav.Get(1));
            Assert.AreEqual(v2, lav.Get(2));
            Assert.AreEqual(new Vertex(4, 3), lav.Get(3));
            Assert.AreEqual(v1, lav.Get(3).GetNextVertex());

            lav = slav.Get(1);

            Assert.AreEqual(new Vertex(4, 3), lav.Get(1));
            Assert.AreEqual(v4, lav.Get(2));
            Assert.AreEqual(v5, lav.Get(3));

            Assert.AreEqual(new Vertex(4, 3), lav.Get(3).GetNextVertex());
        }
Пример #6
0
        public void TestAngleBisector()
        {
            Vertex v1 = new Vertex(1, 1);
            Vertex bisector = new Vertex(2, 3);

            v1.AngleBisector = bisector;

            Assert.AreEqual(2, bisector.GetX());
            Assert.AreEqual(3, bisector.GetY());
        }
Пример #7
0
        //THIS IS FOR UNIT TESTING ONLY, DONT FEEL LIKE DOING THE DISTANCE CALCULATIONS
        public Intersection(double x, double y, Vertex vA, Vertex vB, double distance)
        {
            this.x = x;
            this.y = y;

            this.vA = vA;
            this.vB = vB;

            this.distance = distance;
        }
Пример #8
0
        public void TestAddVertexToList()
        {
            Vertex v = new Vertex(0.0, 1.1);
            listOfActiveVertices.Add(v);

            Vertex startVertex = listOfActiveVertices.GetStart();
            Assert.AreEqual(0.0, startVertex.GetX());
            Assert.AreEqual(1.1, startVertex.GetY());

            Assert.IsNull(startVertex.GetPrevVertex());
            Assert.IsNull(startVertex.GetNextVertex());
        }
Пример #9
0
        public Vertex(Vertex v)
        {
            this.x = v.GetX();
            this.y = v.GetY();

            this.prevVertex = null;
            this.nextVertex = null;

            this.bisectorVertex = v.bisectorVertex;
            this.processed = v.Processed;
            this.type = v.Type;
        }
Пример #10
0
        public void AngleBetweenVerticesTests()
        {
            Vertex v1;
            Vertex v2;
            Vertex v3;

            v1 = new Vertex(0, 3);
            v2 = new Vertex(0, 0);
            v3 = new Vertex(4, 0);

            Assert.AreEqual(90, MathLibrary.GetAngleBetweenVerticese(v1, v2, v3));
        }
Пример #11
0
        public void TestDeepCopy()
        {
            Vertex v = new Vertex(0, 1);
            Vertex bisector = new Vertex(100, 100);

            v.SetProcessed();
            v.Type = Vertex.VertexType.Split;
            v.AngleBisector = bisector;

            Vertex v2 = new Vertex(v);

            Assert.IsTrue(v2.Processed);
            Assert.AreEqual(Vertex.VertexType.Split, v2.Type);
            Assert.AreEqual(bisector, v2.AngleBisector);
        }
Пример #12
0
        public void TestAddTwoVertexToList()
        {
            Vertex v1 = new Vertex(0.0, 0.0);
            listOfActiveVertices.Add(v1);

            Vertex v2 = new Vertex(1.1, 1.1);
            listOfActiveVertices.Add(v2);

            Vertex startVertex = listOfActiveVertices.GetStart();
            Assert.AreEqual(0.0, startVertex.GetX());
            Assert.AreEqual(0.0, startVertex.GetY());

            Assert.AreEqual(v2, startVertex.GetNextVertex());
            Assert.AreEqual(v2, startVertex.GetPrevVertex());
        }
Пример #13
0
        public void TestIntersectionInit()
        {
            Vertex vA = new Vertex(2, 6);
            Vertex vB = new Vertex(2, 2);

            Intersection intersection = new Intersection(4, 4, vA, vB, Vertex.VertexType.Edge, ls1, ls2);

            Assert.AreEqual(4, intersection.GetX());
            Assert.AreEqual(4, intersection.GetY());

            Assert.AreEqual(vA, intersection.GetVA());
            Assert.AreEqual(vB, intersection.GetVB());

            Assert.AreEqual(2, intersection.Distance);
        }
Пример #14
0
        public Vertex(double x, double y)
        {
            this.x = x;
            this.y = y;

            this.prevVertex = null;
            this.nextVertex = null;
            this.bisectorVertex = null;

            this.prevLS = null;
            this.nextLS = null;

            this.processed = false;
            this.type = VertexType.Undefined;
        }
Пример #15
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);
        }
Пример #16
0
        public Intersection(double x, double y, Vertex vA, Vertex vB, Vertex.VertexType type, LineSegment lsVA, LineSegment lsVB)
        {
            this.x = x;
            this.y = y;

            this.vA = vA;
            this.vB = vB;

            this.type = type;

            this.lsVA = lsVA;
            this.lsVB = lsVB;

            this.distance = MathLibrary.GetDistanceBetweenLineAndVertex(vA, vB, new Vertex(x, y));
        }
Пример #17
0
        public void TestInputReader()
        {
            InputReader inputReader = new InputReader(inputHelper);
            LAV listOfActiveVertices;
            inputReader.ReadInput(out listOfActiveVertices);

            Vertex v1 = new Vertex(0, 0);
            Vertex v2 = new Vertex(1, 1);
            Vertex v3 = new Vertex(3, 3);

            Vertex startNode = listOfActiveVertices.GetStart();

            Assert.IsTrue(v1.Equals(startNode));
            Assert.IsTrue(startNode.GetPrevVertex().Equals(v3));
            Assert.IsTrue(startNode.GetNextVertex().Equals(v2));
        }
Пример #18
0
        public static double GetDistanceBetweenLineAndVertex(Vertex endPoint1, Vertex endPoint2, Vertex point)
        {
            double bottom = ((endPoint2.GetX() - endPoint1.GetX()) * (endPoint2.GetX() - endPoint1.GetX())) + ((endPoint2.GetY() - endPoint1.GetY()) * (endPoint2.GetY() - endPoint1.GetY()));
            double dot = ((point.GetX() - endPoint1.GetX()) * (endPoint2.GetX() - endPoint1.GetX())) + ((point.GetY() - endPoint1.GetY()) * (endPoint2.GetY() - endPoint1.GetY()));

            double t = dot / bottom;

            double newX = endPoint1.GetX() + t * (endPoint2.GetX() - endPoint1.GetX());
            double newY = endPoint1.GetY() + t * (endPoint2.GetY() - endPoint1.GetY());

            double retVal = Math.Sqrt(((point.GetX() - newX) * (point.GetX() - newX)) + ((point.GetY() - newY) * (point.GetY() - newY)));

            if (double.IsNaN(retVal))
                return double.PositiveInfinity;
            else
                return retVal;
        }
Пример #19
0
        public static Vertex GetAngleBisectorVertex(LineSegment ls1, LineSegment ls2)
        {
            Vertex intersection = GetIntersectionPoint(ls1, ls2);

            //THE LINES ARE PARALLEL
            if (double.IsInfinity(intersection.GetX()) || double.IsNaN(intersection.GetX()) || double.IsInfinity(intersection.GetY()) || double.IsNaN(intersection.GetY()))
                return null;

            Vertex maxLine1;
            Vertex maxLine2;

            if (GetDistanceBetweenVertices(ls1.Start, intersection) >= GetDistanceBetweenVertices(ls1.End, intersection))
                maxLine1 = ls1.Start;
            else
                maxLine1 = ls1.End;

            if (GetDistanceBetweenVertices(ls2.Start, intersection) >= GetDistanceBetweenVertices(ls2.End, intersection))
                maxLine2 = ls2.Start;
            else
                maxLine2 = ls2.End;

            double bisectorX = 0;
            double bisectorY = 0;

            double distance12 = GetDistanceBetweenVertices(maxLine1, intersection);
            double distance32 = GetDistanceBetweenVertices(maxLine2, intersection);

            bisectorX = (maxLine1.GetX() - intersection.GetX()) / distance12;
            bisectorY = (maxLine1.GetY() - intersection.GetY()) / distance12;

            bisectorX = bisectorX + ((maxLine2.GetX() - intersection.GetX()) / distance32);
            bisectorY = bisectorY + ((maxLine2.GetY() - intersection.GetY()) / distance32);

            bisectorX = bisectorX * 0.5;
            bisectorY = bisectorY * 0.5;

            double distance = GetDistanceOfVertex(bisectorX, bisectorY);

            bisectorX = intersection.GetX() + (bisectorX / distance);
            bisectorY = intersection.GetY() + (bisectorY / distance);

            Vertex bisectorVertex = new Vertex(bisectorX, bisectorY);

            return bisectorVertex;
        }
Пример #20
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);
        }
Пример #21
0
        public void TestForEach()
        {
            Vertex v1 = new Vertex(0, 0);
            listOfActiveVertices.Add(v1);

            Vertex v2 = new Vertex(1, 1);
            listOfActiveVertices.Add(v2);

            Vertex v3 = new Vertex(2, 2);
            listOfActiveVertices.Add(v3);

            int count = 0;
            foreach (Vertex v in listOfActiveVertices)
            {
                Assert.AreEqual(Convert.ToDouble(count), v.GetX());
                Assert.AreEqual(Convert.ToDouble(count), v.GetY());

                count++;
            }
        }
Пример #22
0
        public void DistanceBetweenVerticesTests()
        {
            Vertex v1;
            Vertex v2;

            v1 = new Vertex(0, 0);
            v2 = new Vertex(1, 0);
            Assert.AreEqual(1.0, MathLibrary.GetDistanceBetweenVertices(v1, v2));

            v1 = new Vertex(0, 0);
            v2 = new Vertex(2, 0);
            Assert.AreEqual(2.0, MathLibrary.GetDistanceBetweenVertices(v1, v2));

            v1 = new Vertex(1, 5);
            v2 = new Vertex(-2, 1);
            Assert.AreEqual(5, MathLibrary.GetDistanceBetweenVertices(v1, v2));

            v1 = new Vertex(-2, -3);
            v2 = new Vertex(-4, 4);
            Assert.AreEqual(7.28011, Math.Round(MathLibrary.GetDistanceBetweenVertices(v1, v2), 5));
        }
Пример #23
0
        public static List<LineSegment> GenerateSkeleton(SLAV setListOfActiveVertices)
        {
            List<LineSegment> result = new List<LineSegment>();
            int lavIndex = 0;

            if (queue.IsEmpty())
                SSLOperations.GeneratePriorityQueue(setListOfActiveVertices.Get(lavIndex));

            while (!queue.IsEmpty())
            {
                while (!queue.IsEmpty())
                {
                    Intersection intersection = GetMinIntersection();

                    if (intersection.Type == Vertex.VertexType.Undefined)
                    {
                        throw new Exception("Undefined vertex type.");
                    }

                    if (!intersection.GetVA().Processed && !intersection.GetVB().Processed)
                    {
                        double intersectionX = Math.Round(intersection.GetX(), 2);
                        double intersectionY = Math.Round(intersection.GetY(), 2);

                        Vertex intersectionVertex = new Vertex(intersectionX, intersectionY);

                        if (intersection.Type == Vertex.VertexType.Edge || intersection.Type == Vertex.VertexType.Split)
                        {
                            result.Add(new LineSegment(intersection.GetVB(), intersectionVertex));
                            result.Add(new LineSegment(intersection.GetVA(), intersectionVertex));

                            setListOfActiveVertices.Get(lavIndex).Insert(intersectionVertex, intersection.GetVB(), intersection.GetVA());

                            intersectionVertex.NextLineSegment = intersection.GetLSVA();
                            intersectionVertex.PrevLineSegment = intersection.GetLSVB();

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

                            if (intersectionVertex.AngleBisector == null) //THE LINES ARE PARALLEL
                            {
                                intersectionVertex.AngleBisector = MathLibrary.Rotate(intersectionVertex, MathLibrary.GetAngleBisectorVertex(new LineSegment(intersectionVertex, intersection.GetVB()), new LineSegment(intersectionVertex, intersection.GetVA())), 180);
                            }
                        }

                        intersection.GetVA().SetProcessed();
                        intersection.GetVB().SetProcessed();
                    }
                }

                Vertex startVertex = setListOfActiveVertices.Get(lavIndex).GetStart();
                if (startVertex.GetNextVertex().GetNextVertex().Equals(startVertex))
                {
                    result.Add(new LineSegment(startVertex, startVertex.GetNextVertex()));
                }
                else
                {
                    SSLOperations.GeneratePriorityQueue(setListOfActiveVertices.Get(lavIndex));
                }
            }

            return result;
        }
Пример #24
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;
            }
        }
Пример #25
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;
            }
        }
Пример #26
0
        public void TestIntersectionPointLineEquations()
        {
            Vertex v1 = new Vertex(1, 3);
            Vertex v2 = new Vertex(1, 1);
            Vertex v3 = new Vertex(3, 1);

            LineSegment ls1 = new LineSegment(v1, v2);
            LineSegment ls2 = new LineSegment(v2, v3);

            Assert.AreEqual(new Vertex(1, 1), MathLibrary.GetIntersectionPoint(ls1, ls2));

            v1 = new Vertex(1, 1);
            v2 = new Vertex(5, 5);
            v3 = new Vertex(0, 4);
            Vertex v4 = new Vertex(4, 0);

            ls1 = new LineSegment(v1, v2);
            ls2 = new LineSegment(v3, v4);

            Assert.AreEqual(new Vertex(2, 2), MathLibrary.GetIntersectionPoint(ls1, ls2));
        }
Пример #27
0
        public void TestTriangleContainsPoint()
        {
            Vertex v1 = new Vertex(0, 0);
            Vertex v2 = new Vertex(4, 0);
            Vertex v3 = new Vertex(2, 2);

            Assert.IsTrue(MathLibrary.TriangleContainsPoint(v1, v2, v3, new Vertex(2, 1)));

            Assert.IsFalse(MathLibrary.TriangleContainsPoint(v1, v2, v3, new Vertex(0, 1)));
            Assert.IsFalse(MathLibrary.TriangleContainsPoint(v1, v2, v3, new Vertex(2, -1)));
            Assert.IsFalse(MathLibrary.TriangleContainsPoint(v1, v2, v3, new Vertex(3, 1.5)));
        }
Пример #28
0
        public void TestSplitAngleBisectorPoint()
        {
            Vertex v1 = new Vertex(4, 0);
            Vertex v2 = new Vertex(4, 3);
            Vertex v3 = new Vertex(8, 3);

            LineSegment ls1 = new LineSegment(v1, v2);
            LineSegment ls2 = new LineSegment(v2, v3);

            Vertex bisector = MathLibrary.GetAngleBisectorVertex(ls1, ls2);
            bisector = MathLibrary.Rotate(v2, bisector, 180);
            Assert.AreEqual(3.29, Math.Round(bisector.GetX(), 2));
            Assert.AreEqual(3.71, Math.Round(bisector.GetY(), 2));
        }
Пример #29
0
        public void TestRectangleContainsPoint()
        {
            Vertex v1 = new Vertex(0, 6);
            Vertex v2 = new Vertex(0, 3);
            Vertex v3 = new Vertex(8, 3);
            Vertex v4 = new Vertex(8, 6);

            Assert.IsTrue(MathLibrary.RectangleContainsPoint(v1, v2, v3, v4, new Vertex(4, 4)));

            Assert.IsFalse(MathLibrary.RectangleContainsPoint(v1, v2, v3, v4, new Vertex(8, 3)));

            Assert.IsFalse(MathLibrary.RectangleContainsPoint(v1, v2, v3, v4, new Vertex(-1, 5)));
            Assert.IsFalse(MathLibrary.RectangleContainsPoint(v1, v2, v3, v4, new Vertex(2, 2)));
            Assert.IsFalse(MathLibrary.RectangleContainsPoint(v1, v2, v3, v4, new Vertex(9, 4)));
            Assert.IsFalse(MathLibrary.RectangleContainsPoint(v1, v2, v3, v4, new Vertex(7, 7)));
        }
Пример #30
0
        public void TestQuadrilateralContainsPoint2()
        {
            Vertex v1 = new Vertex(4, 2);
            Vertex v2 = new Vertex(6, 2);
            Vertex v3 = new Vertex(15.69, 34.02);
            Vertex v4 = new Vertex(-9.26, 34.02);

            Assert.IsTrue(MathLibrary.QuadrilateralContainsPoint(v1, v2, v3, v4, new Vertex(3.5, 4)));
        }