l33*_*33t 4 c# math geometry collision-detection
下面是一个检测两个圆是否相交的函数.我想将其更改为仅检测圆圈的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;
}
}
Run Code Online (Sandbox Code Playgroud)
D说,你通过计算两个中心之间的距离来解决这个问题.如果有一个交叉点
abs(R1-R2) < D < R1+R2
Run Code Online (Sandbox Code Playgroud)
其中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;
}
Run Code Online (Sandbox Code Playgroud)
如果性能在这里很重要,你可以不用这样的调用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;
}
Run Code Online (Sandbox Code Playgroud)