【问题标题】:How to calculate if a point is within a circle如何计算一个点是否在一个圆内
【发布时间】:2022-01-12 02:53:21
【问题描述】:

我得到了一个构造函数:

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

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

使用这个我想检查是否:如果 o 是一个圆,它返回 true 当且仅当 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。

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

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)?

【问题讨论】:

  • 看到代码中很难匹配括​​号的那一行了吗?你匹配错了。

标签: c++ math contains


【解决方案1】:

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

 (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())))
}    

【讨论】:

  • 谢谢。只是为了弄清楚 (pointX - circleX)^2 等等等等..?
  • 是的。确切地。但是不要使用pow(除非编译器优化了pow(x,2)
  • 能否请您再次检查问题。我已经尝试过您的解决方案
  • 您在函数中错过了return。添加更正
  • 对不起,我已经添加了我给出的测试用例。
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多