/// <summary> /// Does this ray intersect with the provided face? /// </summary> /// <param name="face">The Face to intersect with.</param> /// <param name="result">The intersection result.</param> /// <returns>True if an intersection occurs, otherwise false. If true, check the intersection result for the location of the intersection.</returns> internal bool Intersects(Face face, out Vector3 result) { var plane = face.Plane(); if (Intersects(plane, out Vector3 intersection)) { var boundaryPolygon = face.Outer.ToPolygon(); var transformToPolygon = new Transform(plane.Origin, plane.Normal); var transformFromPolygon = new Transform(transformToPolygon); transformFromPolygon.Invert(); var transformedPolygon = transformFromPolygon.OfPolygon(boundaryPolygon); var transformedIntersection = transformFromPolygon.OfVector(intersection); if (transformedPolygon.Contains(transformedIntersection) || transformedPolygon.Touches(transformedIntersection)) { result = intersection; return(true); } } result = default(Vector3); return(false); }