private static IEnumerable <LineHL> ClippAtBottom(this IEnumerable <LineHL> lines, double bottom) { foreach (var line in lines) { var start = line.Start; var end = line.End; if ((start.Y >= bottom) || (end.Y >= bottom)) { if ((start.Y >= bottom) && (end.Y >= bottom)) { yield return(line); } else { if (start.Y > end.Y) { var help = start; start = end; end = help; } double qy = (bottom - start.Y) / (end.Y - start.Y); double deltax = qy * (end.X - start.X); var clippedStart = new PointHL(start.X + deltax, bottom); yield return(new LineHL { Start = clippedStart, End = end, Edge = line.Edge }); } } } }
private static (bool, LineHL) ClippAtLeft(this LineHL line, double left) { var start = line.Start; var end = line.End; if ((start.X < left) && (end.X < left)) { return(false, null); } if ((start.X >= left) && (end.X >= left)) { return(true, line); } else { if (start.X > end.X) { var help = start; start = end; end = help; } double qx = (left - start.X) / (end.X - start.X); double deltay = qx * (end.Y - start.Y); var clippedStart = new PointHL(left, start.Y + deltay); return(true, new LineHL { Start = clippedStart, End = end, Edge = line.Edge }); } }
private static IEnumerable <LineHL> ClippAtRight(this IEnumerable <LineHL> lines, double right) { foreach (var line in lines) { var start = line.Start; var end = line.End; if ((start.X <= right) || (end.X <= right)) { if ((start.X <= right) && (end.X <= right)) { yield return(line); } else { if (start.X > end.X) { var help = start; start = end; end = help; } double qx = (right - start.X) / (end.X - start.X); double deltay = qx * (end.Y - start.Y); var clippedEnd = new PointHL(right, start.Y + deltay); yield return(new LineHL { Start = start, End = clippedEnd, Edge = line.Edge }); } } } }
private static Axis3D GetRaytracingRay(LineHL line, double nearPlaneDistance) { var start = line.Start; var end = line.End; var centerViewLine = new PointHL((start.X + end.X) / 2.0, (start.Y + end.Y) / 2.0); var centerCameraPlaneLine = ViewProjection.ProjectCameraPlaneToCameraSystem(centerViewLine.X, centerViewLine.Y, nearPlaneDistance); var rayOffset = new Position3D(0.0, 0.0, 0.0); var rayDirection = centerCameraPlaneLine - rayOffset; return(new Axis3D(rayOffset, rayDirection)); }
public static IEnumerable <LineHL> CutLines(this IEnumerable <LineHL> lines) { var source = new Stack <LineHL>(lines); var target = new Stack <LineHL>(); var cutLines = new Stack <LineHL>(); while (source.Count > 0) { var first = source.Pop(); // Testcode while (source.Count > 0) { var second = source.Pop(); var x1 = first.Start.X; var y1 = first.Start.Y; var x2 = first.End.X; var y2 = first.End.Y; var x3 = second.Start.X; var y3 = second.Start.Y; var x4 = second.End.X; var y4 = second.End.Y; if (IntersectionMath.AreLinesBoundedBoxesOverlapped(x1, y1, x2, y2, x3, y3, x4, y4)) { var(hasIntersection, x, y) = IntersectionMath.Check2DLineWithLine(x1, y1, x2, y2, x3, y3, x4, y4); if (hasIntersection) { var intersection = new PointHL(x, y); var first1 = new LineHL { Start = first.Start, End = intersection, Edge = first.Edge }; var first2 = new LineHL { Start = intersection, End = first.End, Edge = first.Edge }; var second1 = new LineHL { Start = second.Start, End = intersection, Edge = second.Edge }; var second2 = new LineHL { Start = intersection, End = second.End, Edge = second.Edge }; if (!first2.Length.EqualsTo(0.0)) { if (!first1.Length.EqualsTo(0.0)) { target.Push(first2); first = first1; } else { first = first2; } } else { first = first1; } if (!second1.Length.EqualsTo(0.0)) { target.Push(second1); } if (!second2.Length.EqualsTo(0.0)) { target.Push(second2); } } else { target.Push(second); } } else { target.Push(second); } } cutLines.Push(first); var help = source; source = target; target = help; } return(cutLines); }