private static bool IsLineVisible(LineHL line, double nearPlaneDistance, TriangleHL[] triangles) { var rayAxis = GetRaytracingRay(line, nearPlaneDistance); var(success, edgeIntersection) = GetRayIntersectionWithEdge(rayAxis, line.Edge); if (!success) { return(true); } var rayToEdgeDirection = (edgeIntersection - rayAxis.Offset); var edgeDistanceSquared = rayToEdgeDirection.SquaredLength(); foreach (var triangle in triangles) { if (!IsTriangleNeighbourOfLine(triangle, line)) { if (!IsLineInTrianglePlane(line, triangle)) { var(hasIntersection, triangleDistanceSquared) = IntersectionMath.GetSquaredDistanceOfIntersectionOfRayAndTriangle(rayAxis.Offset, rayToEdgeDirection, triangle.P1, triangle.P2, triangle.P3); if (hasIntersection && triangleDistanceSquared < edgeDistanceSquared) { return(false); } } } } return(true); }
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 bool IsTriangleNeighbourOfLine(TriangleHL triangle, LineHL line) { var firstTriangle = line.Edge.First; var secondTriangle = line.Edge.Second; var isNeighbour = firstTriangle == triangle || secondTriangle == triangle; return(isNeighbour); }
private static bool IsLineInTrianglePlane(LineHL line, TriangleHL triangle) { var start = line.Edge.Start; var end = line.Edge.End; var distStart = start.DistancePositionToPlane(triangle.P1, triangle.Normal); var distEnd = end.DistancePositionToPlane(triangle.P1, triangle.Normal); var isInPlane = distStart.EqualsTo(0.0) && distEnd.EqualsTo(0.0); return(isInPlane); }
private static LineHL ToLine2D(this EdgeHL edge, double nearPlaneDist) { var(x1, y1) = ViewProjection.ProjectCameraSystemToCameraPlane(edge.Start, nearPlaneDist); var(x2, y2) = ViewProjection.ProjectCameraSystemToCameraPlane(edge.End, nearPlaneDist); var line2d = new LineHL { Start = new PointHL(x1, y1), End = new PointHL(x2, y2), Edge = edge }; return(line2d); }
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 <int> ToLineCoordinates(this LineHL line, double canvasWidth, double canvasHeight) { var(x1, y1) = ViewProjection.ProjectCameraPlaneToCanvas(line.Start.X, line.Start.Y, canvasWidth, canvasHeight); var(x2, y2) = ViewProjection.ProjectCameraPlaneToCanvas(line.End.X, line.End.Y, canvasWidth, canvasHeight); yield return(x1); yield return(y1); yield return(x2); yield return(y2); }
private static bool IsLineVisible(LineHL line) => line.Edge.First.Spin == TriangleSpin.counter_clockwise || line.Edge.Second.Spin == TriangleSpin.counter_clockwise;
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); }