Beispiel #1
0
        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)));
            }
        }
Beispiel #2
0
 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)
                ));
     }
 }