下面是一个检测两个圆是否相交的函数。我想将其更改为仅检测圆圈的periferi是否相交。因此,如果圆圈A在圆圈B内完全,则没有碰撞!
如何?
private bool IsCircleCollision(
int x1, int y1, int radius1,
int x2, int y2, int radius2)
{
int dx = x2 - x1;
int dy = y2 - y1;
int distance = (dx * dx) + (dy * dy);
int radii = radius1 + radius2;
if (distance < radii * radii)
{
return true;
}
else
{
return false;
}
}
答案 0 :(得分:7)
abs(R1-R2) < D < R1+R2
其中R1和R2是两个圆的半径。
第一个测试abs(R1-R2) < D
处理一个圆心位于另一个圆圈内部的情况。第二个测试D < R1+R2
处理两个圆都不包含另一个中心的情况。
因此,调整我们的代码:
private bool IsCircleCollision(
int x1, int y1, int radius1,
int x2, int y2, int radius2)
{
int dx = x2 - x1;
int dy = y2 - y1;
double D = Math.Sqrt(dx*dx + dy*dy);
return Math.Abs(radius1-radius2)<D && D<radius1+radius2;
}
如果这里的表现非常重要,那么您可以在不调用Math.Sqrt
的情况下执行此操作:
private bool IsCircleCollision(
int x1, int y1, int radius1,
int x2, int y2, int radius2)
{
int dx = x2 - x1;
int dy = y2 - y1;
int Dsqr = dx*dx + dy*dy;
int rdiff = Math.Abs(radius1-radius2);
int rsum = radius1+radius2
return rdiff*rdiff<Dsqr && D<rsum*rsum;
}
答案 1 :(得分:2)
当且仅当两个中心之间的距离小于或等于两个半径之和但大于或等于其绝对差值时,周长才会相交。有了这个事实,重写函数应该不难。
答案 2 :(得分:0)
您可以添加一项检查,以查看distance + radius1
是否小于radius2
或distance + radius2
是否小于radius1
,但您需要distance
}是实际距离而不是它的正方形。
答案 3 :(得分:0)
else if (Math.Sqrt(dx * dx + dy * dy) < Math.Abs(radius1 - radius2))