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; }
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()); }
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; }
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; } }
public void TestIntegerXY() { Vertex v = new Vertex(0, 1); Assert.AreEqual(0, v.GetX()); Assert.AreEqual(1, v.GetY()); }
public void TestDoubleXY() { Vertex v = new Vertex(0.1, 1.1); Assert.AreEqual(0.1, v.GetX()); Assert.AreEqual(1.1, v.GetY()); }
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); }
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); }
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; }
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; } } } }
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); }