예제 #1
0
        /// <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);
        }
예제 #2
0
 /// <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));
 }