线段与圆是否相交

发布时间 2023-11-03 00:30:11作者: yanghui01

 一个点在圆内

 

两个点都在圆内

两个点都在圆外

    

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;
}

 

参考

判断线段与圆是否相交_判断线段和圆相交-CSDN博客