public static bool IsPointOnRay(HPoint p, HRay ray) { if (!HAccuracy.DoubleEqual(0, ((p - ray.Source) * (ray.Direction)).Length())) //is not on line(colinear) { return(false); } return(HAccuracy.DoubleGreater((p - ray.Source) % (ray.Direction), 0)); //is codirectional }
public HPoint CollisionPoint(HRay ray) { HPoint intersectionPoint = HGeometry.OldIntersectPlaneLine(A, B, C, ray.Source, ray.Source + ray.Direction); if (intersectionPoint == null) //no intersection point with plane { return(null); } if (!HGeometry.IsPointOnRay(intersectionPoint, ray)) //point is invisible { return(null); } double firstSquare = HGeometry.TriangleSquare(A, B, C); double secondSquare = HGeometry.TriangleSquare(A, B, intersectionPoint) + HGeometry.TriangleSquare(A, C, intersectionPoint) + HGeometry.TriangleSquare(C, B, intersectionPoint); return(HAccuracy.DoubleEqual(firstSquare, secondSquare) ? intersectionPoint : null); }