Пример #1
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;
        }
Пример #2
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());
        }
Пример #3
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;
        }
Пример #4
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;
            }
        }
Пример #5
0
 public void TestIntegerXY()
 {
     Vertex v = new Vertex(0, 1);
     Assert.AreEqual(0, v.GetX());
     Assert.AreEqual(1, v.GetY());
 }
Пример #6
0
 public void TestDoubleXY()
 {
     Vertex v = new Vertex(0.1, 1.1);
     Assert.AreEqual(0.1, v.GetX());
     Assert.AreEqual(1.1, v.GetY());
 }
Пример #7
0
 public static double GetDistanceBetweenVertices(Vertex v1, Vertex v2)
 {
     double xDistance = Math.Abs(v1.GetX() - v2.GetX());
     double yDistance = Math.Abs(v1.GetY() - v2.GetY());
     return GetDistanceOfVertex(xDistance, yDistance);
 }
Пример #8
0
        public static Vertex Rotate(Vertex pivotPoint, Vertex point, double deg)
        {
            double angle = DegreesToRadians(deg);

            double x = pivotPoint.GetX() + Math.Cos(angle) * (point.GetX() - pivotPoint.GetX()) - Math.Sin(angle) * (point.GetY() - pivotPoint.GetY());
            double y = pivotPoint.GetY() + Math.Sin(angle) * (point.GetX() - pivotPoint.GetX()) + Math.Cos(angle) * (point.GetY() - pivotPoint.GetY());

            return new Vertex(x, y);
        }
Пример #9
0
        public static bool IsPointLeftOfLineToInfinity(Vertex v1, Vertex v2, Vertex point)
        {
            LineEquation lineEquation = GetLineEquation(v1, v2);
            double lineY = lineEquation.GetY(point.GetX());

            if (double.IsInfinity(lineEquation.Slope)) //VERTICAL
            {
                if (v1.GetY() < v2.GetY()) //BOTTOM UP
                {
                    if (point.GetX() <= v1.GetX())
                        return true;
                    else
                        return false;
                }
                else //TOP DOWN
                {
                    if (point.GetX() >= v1.GetX())
                        return true;
                    else
                        return false;
                }
            }
            else if (lineEquation.Slope < 0) //NEGATIVE
            {
                if (v1.GetX() < v2.GetX())
                {
                    if (point.GetY() >= lineY)
                        return true;
                    else
                        return false;
                }
                else
                {
                    if (point.GetY() <= lineY)
                        return true;
                    else
                        return false;
                }
            }
            else if (lineEquation.Slope > 0) //POSITIVE
            {
                if (v1.GetX() < v2.GetX())
                {
                    if (point.GetY() >= lineY)
                        return true;
                    else
                        return false;
                }
                else
                {
                    if (point.GetY() <= lineY)
                        return true;
                    else
                        return false;
                }
            }
            else if (lineEquation.Slope == 0)
            {
                if (v1.GetX() < v2.GetX()) //LEFT TO RIGHT
                {
                    if (point.GetY() >= v1.GetY())
                        return true;
                    else
                        return false;
                }
                else //RIGHT TO LEFT
                {
                    if (point.GetY() <= v1.GetY())
                        return true;
                    else
                        return false;
                }
            }
            else
                return false;
        }
Пример #10
0
        public static bool IsPointLeftOfLine(Vertex v1, Vertex v2, Vertex point)
        {
            LineEquation lineEquation = GetLineEquation(v1, v2);
            double lineY = lineEquation.GetY(point.GetX());

            Vertex left = null;
            Vertex right = null;

            if (v1.GetX() < v2.GetX())
            {
                left = v1;
                right = v2;
            }
            else
            {
                left = v2;
                right = v1;
            }

            double pointX = Math.Round(point.GetX(), 5);
            double pointY = Math.Round(point.GetY(), 5);

            double v1X = Math.Round(v1.GetX(), 5);
            double v1Y = Math.Round(v1.GetY(), 5);

            double v2X = Math.Round(v2.GetX(), 5);
            double v2Y = Math.Round(v2.GetY(), 5);

            double leftX = Math.Round(left.GetX(), 5);
            double leftY= Math.Round(left.GetY(), 5);

            double rightX = Math.Round(right.GetX(), 5);
            double rightY = Math.Round(right.GetY(), 5);

            if (lineEquation.Slope < 0) //NEGATIVE
            {
                if (pointX > rightX) //FAR RIGHT
                {
                    return false;
                }
                else if (pointX >= leftX && pointX <= rightX) //BETWEEN
                {
                    if (v1X < v2X) //LEFT TO RIGHT
                    {
                        if (pointY >= lineY)
                            return true;
                        else
                            return false;
                    }
                    else //RIGHT TO LEFT
                    {
                        if (pointY <= lineY)
                            return true;
                        else
                            return false;
                    }
                }
                else if (pointX < leftX) // FAR LEFT
                {
                    if (pointY > rightY && pointY < leftY)
                        return true;
                    else
                        return false;
                }
                else
                    return false;
            }
            else if (lineEquation.Slope > 0) //POSITIVE
            {
                if (pointX < leftX) //FAR LEFT
                {
                    return false;
                }
                else if (pointX <= rightX && pointX >= leftX) //BETWEEN
                {
                    if (v2X < v1X) //RIGHT TO LEFT
                    {
                        if (pointY <= lineY)
                            return true;
                        else
                            return false;
                    }
                    else //LEFT TO RIGHT
                    {
                        if (pointY >= lineY)
                            return true;
                        else
                            return false;
                    }
                }
                else if (pointX > rightX) //FAR RIGHT
                {
                    if (pointY > leftY && pointY < rightY)
                        return true;
                    else
                        return false;
                }
                else
                    return false;
            }
            else //HORIZONTAL OR VERTICAL
            {
                if (v1X == v2X) //VERTICAL
                {
                    if (v2Y > v1Y) //GOING UP
                    {
                        if (pointX < v1X && pointY > v1Y && pointY < v2Y)
                            return true;
                        else
                            return false;
                    }
                    else //GOING DOWN
                    {
                        if (pointX > v1Y && pointY < v1Y && pointY > v2Y)
                            return true;
                        else
                            return false;
                    }
                }
                else //HORIZONTAL
                {
                    if (v1X < v2X) //LEFT TO RIGHT
                    {
                        if (pointY >= v1Y && pointX > v1X && pointX < v2X)
                            return true;
                        else
                            return false;
                    }
                    else //RIGHT TO LEFT
                    {
                        if (pointY <= v1Y && pointX < v1X && pointX > v2X)
                            return true;
                        else
                            return false;
                    }
                }
            }
        }
Пример #11
0
        public static LineEquation GetLineEquation(Vertex v1, Vertex v2)
        {
            double slope = (v1.GetY() - v2.GetY()) / (v1.GetX() - v2.GetX());
            double yIntercept = v1.GetY() - (slope * v1.GetX());

            return new LineEquation(slope, yIntercept);
        }