两个圆圈碰撞

时间:2013-12-29 15:12:57

标签: c++ math collision

我一直在使用以下方法测试两个圆圈之间的碰撞:

Circle A = (x1,y1) Circle b = (x2,y2)
Radius A           Radius b

x1 - x2 = x' * x'
y1 - y2 = y' * y'

x' + y' = distance

square root of distance - Radius A + Radius B

如果得到的答案是负数,那么它就是相交的。

我在测试中使用过这种方法,但它似乎并不是非常准确。

bool circle::intersects(circle & test)
{

Vector temp;
temp.setX(centre.getX() - test.centre.getX());
temp.setY(centre.getY() - test.centre.getY());

float distance;
float temp2;
float xt;
xt = temp.getX();
temp2 = xt * xt;
temp.setX(temp2);

xt = temp.getY();
temp2 = xt * xt;
temp.setY(temp2);

xt = temp.getX() + temp.getY();
distance = sqrt(xt);
xt = radius + test.radius;

if( distance - xt < test.radius)
{
    return true;
}
else return false;

}

这是使用这种方法的功能也许我在这里错了。我只是想知道我可以使用哪些其他方法。我知道分离轴定理更好,但我不知道从哪里开始。

4 个答案:

答案 0 :(得分:5)

enter image description here

if( distance - xt < test.radius)
{
return true;
}

distance - xt将评估蓝线,即两个磁盘之间的距离。它还满足小于测试半径的条件,但没有发生碰撞。

解决方案:

enter image description here

 if(distance <= (radius + test.radius) )
return true;

distance是距离中心的距离。

答案 1 :(得分:4)

鉴于:xt = radius + test.radius;

正确的测试是:if( distance < xt)

这是尝试为您重写主体:(没有编译器,因此可能是错误)

bool circle::intersects(circle & test)
{
    float x = this->centre.getX() - test.centre.getX()
    float y = this->centre.getY() - test.centre.getY()  

    float distance = sqrt(x*x+y*y);

    return distance < (this->radius + test.radius);
}

答案 2 :(得分:1)

基于理查德解决方案但比较平方距离。这减少了计算错误和计算时间。

bool circle::intersects(circle & test)
{
    float x = this->centre.getX() - test.centre.getX()
    float y = this->centre.getY() - test.centre.getY()  

    float distance2 = x * x + y * y;
    float intersect_distance2 = (this->radius + test.radius) * (this->radius + test.radius);

    return distance <= intersect_distance2;
}

答案 3 :(得分:0)

使用毕达哥拉斯定理来计算中心之间的距离

这是一条直线

如果它们发生了碰撞,则该距离比两个半径的总和短