/// <summary> /// Computes an intersection of the line and the circle /// </summary> public static bool LineCircle(Vector2 lineOrigin, Vector2 lineDirection, Vector2 circleCenter, float circleRadius, out IntersectionLineCircle intersection) { Vector2 originToCenter = circleCenter - lineOrigin; float centerProjection = Vector2.Dot(lineDirection, originToCenter); float sqrDistanceToLine = originToCenter.sqrMagnitude - centerProjection * centerProjection; float sqrDistanceToIntersection = circleRadius * circleRadius - sqrDistanceToLine; if (sqrDistanceToIntersection < -Geometry.Epsilon) { intersection = IntersectionLineCircle.None(); return(false); } if (sqrDistanceToIntersection < Geometry.Epsilon) { intersection = IntersectionLineCircle.Point(lineOrigin + lineDirection * centerProjection); return(true); } float distanceToIntersection = Mathf.Sqrt(sqrDistanceToIntersection); float distanceA = centerProjection - distanceToIntersection; float distanceB = centerProjection + distanceToIntersection; Vector2 pointA = lineOrigin + lineDirection * distanceA; Vector2 pointB = lineOrigin + lineDirection * distanceB; intersection = IntersectionLineCircle.TwoPoints(pointA, pointB); return(true); }
/// <summary> /// Computes an intersection of the line and the circle /// </summary> public static bool LineCircle(Line2 line, Circle2 circle, out IntersectionLineCircle intersection) { return(LineCircle(line.origin, line.direction, circle.center, circle.radius, out intersection)); }