我一直在使用以下方法测试两个圆圈之间的碰撞:
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;
}
这是使用这种方法的功能也许我在这里错了。我只是想知道我可以使用哪些其他方法。我知道分离轴定理更好,但我不知道从哪里开始。
答案 0 :(得分:5)
if( distance - xt < test.radius)
{
return true;
}
distance - xt
将评估蓝线,即两个磁盘之间的距离。它还满足小于测试半径的条件,但没有发生碰撞。
解决方案:
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)
使用毕达哥拉斯定理来计算中心之间的距离
这是一条直线
如果它们发生了碰撞,则该距离比两个半径的总和短