public static IntersectionResult Intersect(Plane3 plane1, Plane3 plane2) { if (plane1.IsCoincidentWith(plane2)) { return(new IntersectionFailed(IntersectionFailedReason.Coincident)); } else if (plane1.IsParallelTo(plane2)) { return(new IntersectionFailed(IntersectionFailedReason.Parallel)); } else { Vector3 binormal = plane1.Normal.Cross(plane2.Normal); Vertex3 origin1 = plane1.Origin; Vertex3 origin2 = new Plane3(origin1, binormal).NearestPointTo(plane2.Origin); Line3 line1 = new Line3(origin1, plane1.Normal); Line3 line2 = new Line3(origin2, plane2.Normal); Vector3 convergence = line2.Direction.ComponentOrtho(line1.Direction); //Vector3 run = line2.Direction.ComponentAlong(line1.Direction); Vector3 p1 = line2.Origin - line1.Origin; Vector3 p2 = line2.Origin + line2.Direction - line1.Origin; Vertex3 isect = Interpolate(p1.ScaledLengthAlong(convergence), line2.Origin, p2.ScaledLengthAlong(convergence), line2.Origin + line2.Direction, BigRational.Zero); return(new IntersectionLine3(new Line3(isect, binormal))); } }
public static IntersectionResult Intersect(Line3 line, Plane3 plane) { if (plane.Contains(line)) { return(new IntersectionFailed(IntersectionFailedReason.Coincident)); } else if (plane.IsParallelTo(line)) { return(new IntersectionFailed(IntersectionFailedReason.Parallel)); } else { Vector3 convergence = line.Direction.ComponentAlong(plane.Normal); //Vector3 run = line.Direction.ComponentOrtho(plane.Normal); Vector3 p1 = line.Origin - plane.Origin; Vector3 p2 = (line.Origin + line.Direction) - plane.Origin; return(new IntersectionVertex3 ( Interpolate(p1.ScaledLengthAlong(convergence), line.Origin, p2.ScaledLengthAlong(convergence), line.Origin + line.Direction, BigRational.Zero) )); } }