如果你有一个圆心(center_x, center_y)和半径为半径的圆,如何测试一个坐标为(x, y)的给定点是否在圆内?


当前回答

进入3D世界,如果你想检查一个3D点是否在单位球面上,你最终会做类似的事情。在2D中工作所需要的就是使用2D矢量运算。

    public static bool Intersects(Vector3 point, Vector3 center, float radius)
    {
        Vector3 displacementToCenter = point - center;

        float radiusSqr = radius * radius;

        bool intersects = displacementToCenter.magnitude < radiusSqr;

        return intersects;
    }

其他回答

这与Jason Punyon提到的解决方案相同,但它包含伪代码示例和更多细节。写完这篇文章后,我看到了他的回答,但我不想删除我的。

我认为最容易理解的方法是先计算圆心到点的距离。我会用这个公式:

d = sqrt((circle_x - x)^2 + (circle_y - y)^2)

然后,简单地比较公式的结果,距离(d),与半径。如果距离(d)小于或等于半径(r),则该点在圆内(如果d和r相等,则在圆的边缘)。

下面是一个伪代码示例,可以很容易地转换为任何编程语言:

function is_in_circle(circle_x, circle_y, r, x, y)
{
    d = sqrt((circle_x - x)^2 + (circle_y - y)^2);
    return d <= r;
}

其中circle_x和circle_y是圆的中心坐标,r是圆的半径,x和y是点的坐标。

计算距离

D = Math.Sqrt(Math.Pow(center_x - x, 2) + Math.Pow(center_y - y, 2))
return D <= radius

这是用c#写的……转换为python中使用…

如前所述,为了显示点是否在圆中,我们可以使用下面的方法

if ((x-center_x)^2 + (y - center_y)^2 < radius^2) {
    in.circle <- "True"
} else {
    in.circle <- "False"
}

要用图形表示,我们可以使用:

plot(x, y, asp = 1, xlim = c(-1, 1), ylim = c(-1, 1), col = ifelse((x-center_x)^2 + (y - center_y)^2 < radius^2,'green','red'))
draw.circle(0, 0, 1, nv = 1000, border = NULL, col = NA, lty = 1, lwd = 1)

一般来说,x和y必须满足(x - center_x)²+ (y - center_y)²< radius²。

请注意,满足上式<的点被==替换为圆上的点,满足上式<的点被>替换为圆外的点。

进入3D世界,如果你想检查一个3D点是否在单位球面上,你最终会做类似的事情。在2D中工作所需要的就是使用2D矢量运算。

    public static bool Intersects(Vector3 point, Vector3 center, float radius)
    {
        Vector3 displacementToCenter = point - center;

        float radiusSqr = radius * radius;

        bool intersects = displacementToCenter.magnitude < radiusSqr;

        return intersects;
    }