一个点在圆内
两个点都在圆内
两个点都在圆外
public static bool IsSegmentCircleIntersect(Vector2 p1, Vector2 p2, Vector2 center, float r) { float sqrR = r * r; //1) 一个点在圆内, 一个点在圆外, 一定相交 //2) 两个点都在圆内, 肯定不相交 var p1InCircle = (p1 - center).sqrMagnitude <= sqrR; var p2InCircle = (p2 - center).sqrMagnitude <= sqrR; if (p1InCircle) return !p2InCircle; else if (p2InCircle) return !p1InCircle; //3) 两个点都在圆外 //3-a) 圆心线段两侧, 肯定不相交 if (IsPointSideOfLine(center, p1, p2)) return false; //3-b) 圆心到线段所在直线的距离, >r则不相交 //点到直线的平方距离公式: (ax+by+c)^2/(a^2+b^2) float a = p2.y - p1.y; float b = p1.x - p2.x; float c = p1.y * p2.x - p1.x * p2.y; float temp1 = a * center.x + b * center.y + c; float sqrtDist = (temp1 * temp1) / (a * a + b * b); var result = sqrtDist <= sqrR; return result; }
参考