public static void SetAsTriangleEdge(double d2, Edge currentEdge, Edge nextEdge) { Vertice start = currentEdge.Start; Vertice middle = currentEdge.End; Vertice end = nextEdge.End; (double, double)nextLine = Line.GetStraightLine(end, middle); (double, double)straightLine = Line.GetStraightLine(end, start); double cos = Angle.GetCosinusFromBetween(nextLine, straightLine); double d = DistanceHelpers.DistanceBetween(start, end); double sqrtDelta = Math.Sqrt(Math.Pow(2 * d * cos, 2) - 4 * (d * d * d2 * d2)); double x1 = (-2 * d * cos - sqrtDelta) / 2; double x2 = (-2 * d * cos + sqrtDelta) / 2; double x = Math.Min(x1, x2); if (x < 0) { x = Math.Max(x1, x2); } (Vertice, Vertice)vertices = PointHelpers.GetPointFromLineDistanceAndPoint(nextLine, x, end); Vertice resultVertice = DistanceHelpers.GetCloserVerticeFromVertice(vertices, start); if (resultVertice.x < int.MinValue + 100 || resultVertice.y > int.MaxValue - 100 || resultVertice.y < int.MinValue + 100 || resultVertice.y > int.MaxValue - 100) { int xdddd = 2; } PointHelpers.SetPointXY(middle, resultVertice.x, resultVertice.y); }
public static void SetPerpednicular(Edge siblingEdge, Edge currentEdge, Edge nextEdge) { Vertice start = currentEdge.Start; Vertice middle = currentEdge.End; Vertice end = nextEdge.End; double d = DistanceHelpers.GetEdgeLength(siblingEdge); (double, double)line = Line.GetStraightLine(siblingEdge.Start, siblingEdge.End); (Vertice, Vertice)vertices; if (line.Item1 == 0) { vertices = (new Vertice(start.x, start.y - (int)d), new Vertice(start.x, start.y + (int)d)); } else if (line.Item1 > int.MaxValue - 100 || line.Item1 < int.MinValue + 100) { vertices = (new Vertice(start.x - (int)d, start.y), new Vertice(start.x + (int)d, start.y)); } else { (double, double)perpendicularLine = Line.GetPerpendicularThroughPoint(line, start); vertices = PointHelpers.GetPointFromLineDistanceAndPoint(perpendicularLine, d, start); } Vertice resultVertice = DistanceHelpers.GetCloserVerticeFromVertice(vertices, middle); PointHelpers.SetPointXY(middle, resultVertice.x, resultVertice.y); }
public static void SetOnLineBetween(double d, Edge currentEdge, Edge nextEdge) { Vertice start = currentEdge.Start; Vertice middle = currentEdge.End; Vertice end = nextEdge.End; double distance = DistanceHelpers.DistanceBetween(start, end); double proportion = d / distance; Vertice resultVertice = PointHelpers.GetPointInProportion(proportion, start, end); if (resultVertice.x < int.MinValue + 100 || resultVertice.y > int.MaxValue - 100 || resultVertice.y < int.MinValue + 100 || resultVertice.y > int.MaxValue - 100) { int xdddd = 2; } PointHelpers.SetPointXY(middle, resultVertice.x, resultVertice.y); }
public static void ShortenLineForEdge(double d, Edge currentEdge, Edge nextEdge) { Vertice start = currentEdge.Start; Vertice middle = currentEdge.End; Vertice end = nextEdge.End; Vertice helper = new Vertice(end.x - CONST.ShortenLineForEdgeDistance, end.y - CONST.ShortenLineForEdgeDistance); (double, double)lineHelp = Line.GetStraightLine(helper, end); Vertice resultVertice = PointHelpers.GetPointInProportion(1 / 2, helper, end); (double, double)line = Line.GetStraightLine(start, resultVertice); (Vertice, Vertice)midVertices = PointHelpers.GetPointFromLineDistanceAndPoint(line, d, currentEdge.Start); Vertice midVertice = DistanceHelpers.GetCloserVerticeFromLine(lineHelp, midVertices); PointHelpers.SetPointXY(middle, midVertice.x, midVertice.y); }
public static void SetAsTriangleLength(double d, Edge currentEdge, Edge nextEdge) { Vertice start = currentEdge.Start; Vertice middle = currentEdge.End; Vertice end = nextEdge.End; double d2 = DistanceHelpers.GetEdgeLength(nextEdge); double distance = DistanceHelpers.DistanceBetween(start, end); double triangleArea = Triangle.TriangleArea(d, d2, distance); Vertice missingPoint = Triangle.GetPointFromTriangleArea(triangleArea, start, end, d, d2); if (missingPoint.x < int.MinValue + 100 || missingPoint.y > int.MaxValue - 100 || missingPoint.y < int.MinValue + 100 || missingPoint.y > int.MaxValue - 100) { int xdddd = 2; } PointHelpers.SetPointXY(middle, missingPoint.x, missingPoint.y); }
public static void SetPerpednicularNextEqual(Edge siblingEdge, Edge currentEdge, Edge nextEdge) { Vertice start = currentEdge.Start; Vertice middle = currentEdge.End; Vertice end = nextEdge.End; double d = DistanceHelpers.GetEdgeLength(siblingEdge); double d2 = DistanceHelpers.GetEdgeLength(nextEdge); (double, double)line = Line.GetStraightLine(siblingEdge.Start, siblingEdge.End); (double, double)distanceLine = Line.GetStraightLine(start, end); (Vertice, Vertice)vertices = (null, null); if (line.Item1 != 0 && line.Item1 < int.MaxValue - 100 && line.Item1 > int.MinValue + 100) { (double, double)perpendicularLine = Line.GetPerpendicularThroughPoint(line, start); if (d2 < Line.DistanceVerticeFromLine(perpendicularLine, end)) { d2 = Line.DistanceVerticeFromLine(perpendicularLine, end) + 1; } double cos = Angle.GetCosinusFromBetween(perpendicularLine, distanceLine); double sqrtDelta = Math.Sqrt(Math.Pow(2 * d * cos, 2) - 4 * (d * d - d2 * d2)); double x1 = (2 * d * cos - sqrtDelta) / 2; double x2 = (2 * d * cos + sqrtDelta) / 2; double x = Math.Min(x1, x2); if (x < 0) { x = Math.Max(x1, x2); } vertices = PointHelpers.GetPointFromLineDistanceAndPoint(perpendicularLine, x, start); Vertice resultVertice = DistanceHelpers.GetCloserVerticeFromVertice(vertices, end); PointHelpers.SetPointXY(middle, resultVertice.x, resultVertice.y); } else { SetPerpednicularNextPerpendicular(siblingEdge, currentEdge, nextEdge); } }