Tuesday, May 07, 2013

圆的碰撞检测,优化版



public boolean overlapCircles(Circle c1, Circle c2) {

float distance = c1.center.dist(c2.center);
return distance <= c1.radius + c2.radius;
}


public float distSquared(Vector2 other) {
float distX = this.x - other.x;
float distY = this.y - other.y;
return distX*distX + distY*distY;
}


sqrt(dist.x × dist.x + dist.y × dist.y) <= radius1 + radius2
因为平方根费时,所以,变形为:
dist.x × dist.x + dist.y × dist.y <= (radius1 + radius2) × (radius1 + radius2)

然后就可以这样直接使用了:
public boolean overlapCircles(Circle c1, Circle c2) {
float distance = c1.center.distSquared(c2.center);
float radiusSum = c1.radius + c2.radius;
return distance <= radiusSum * radiusSum;
}

No comments:

Search This Blog

Followers