如何计算一个点是否在圆内

How to calculate if a point is within a circle

我得到了一个构造函数:

Circle::Circle(const Point& c, float r) {
    x_ = c.getX();
    y_ = c.getY();
    r_ = r;
}

所有值都已初始化,如图所示。在参数中我有 Point& - 这只允许我使用来自不同 class 的函数获取 x 和 y 坐标。另外,我有“r”,它将接受半径值。

使用这个我想检查是否:如果 o 是一个圆,它 returns 当且仅当 p 在圆的内部或边界时才为真

例如,

我得到:Point p(1,2); & Circle c(p,3);

我想检查 Point(3.9,2) 是在 Circle c(p,3);

的内部还是边界上

为了额外参考,我将提供 Point Constructor:

Point::Point(float x, float y) {
    x_ = x;
    y_ = y;
}

初始化构造函数以允许我创建 getter 和 setter 以用于其他 classes。

在我的函数中我试过这个:

bool Circle::contains(const Point& p) const {

    bool results; 
    if( ( (getX()-p.getX() ) * ( getX()-p.getX() ) ) + ( ( (getY()-p.getY() ) * ( getY()-p.getY() ) ) <= (getR()*getR())))


    {
        results = true;
    }
else {results = false;}
return results;
}

这没有用。

给我的测试用例:

    Point p(1,2);
Circle c(p,3);
if (!c.contains(p)) errorOut_("c does not contain p?",1);
if (!c.contains(Point(3.9,2))) errorOut_("c does not contain (3.9,2)?",1);
if (!c.contains(Point(3.1,4.1))) errorOut_("c does not contain (3.1,4.1)?",1);
if (!c.contains(Point(-1.1,4.1))) errorOut_("c does not contain (-1.1,4.1)?",1);
if (!c.contains(Point(-1.1,-0.1))) errorOut_("c does not contain (-1.1,-0.1)?",1);
if (!c.contains(Point(3.1,-0.1))) errorOut_("c does not contain (3.1,-0.1)?",1);
if (c.contains(Point(3.2,4.2))) errorOut_("c contains (3.2,4.2)?",1);
if (c.contains(Point(-1.2,4.2))) errorOut_("c contains (-1.2,4.2)?",1);
if (c.contains(Point(-1.2,-0.2))) errorOut_("c contains (-1.2,-0.2)?",1);
if (c.contains(Point(3.2,-0.2))) errorOut_("c contains (3.2,-0.2)?",1);

结果:

fail1: c contains (-1.2,4.2)?
fail1: c contains (-1.2,-0.2)?
fail1: c contains (3.2,-0.2)?

要检查点是否在圆内,需要实现这个公式(如果不需要圆周上的点,则严格<):

 (px-cx)*(px-cx) + (py-cy)*(py-cy) <= r*r

从点到中心的平方距离应小于平方半径(以避免 sqrt 计算)

以你为例

(3.9-1)^2+(2-2)^2 = 8.41 < 3*3=9   - inside

更正了您的功能:

bool Circle::contains(const Point& p) const {
    return ( ( (getX()-p.getX() ) * ( getX()-p.getX() ) ) + 
             ( ( (getY()-p.getY() ) * ( getY()-p.getY() ) ) <= (getR()*getR())))
}