2011-12-19 61 views
2

这里是圆类:Java的圈,圈的碰撞检测

public class Circle { 
    private double radius; 

    private double x; 
    private double y; 
} 

我怎么能知道从这个类(圆圈)两个物体发生碰撞?

P.S.你可以使用避免采用平方根的方法吗?

+5

这个问题有一个详细的解答在这里:http://stackoverflow.com/questions/1736734/circle-circle-collision –

+0

像circle1.collide(CIRCLE2)的方法需要访问CIRCLE2的半径,x和y但那些是私人的。 –

+1

@SteveC:假设'circle1'和'circle2'是同一类型的对象的两个实例,那么这显然不是一个问题。 –

回答

6
double xDif = x1 - x2; 
double yDif = y1 - y2; 
double distanceSquared = xDif * xDif + yDif * yDif; 
boolean collision = distanceSquared < (radius1 + radius2) * (radius1 + radius2); 
+1

如果x,y,radius有近似误差(当使用浮点数时通常是这种情况),那么浮点比较最好使用epsilon来完成...... – TacticalCoder

1

下面是更新后的Java解决方案:

public boolean hasCollision(Circle circle){ 
    double xDiff = x - circle.getX(); 
    double yDiff = y - circle.getY; 

    double distance = Math.sqrt((Math.pow(xDiff, 2) + Math.pow(yDiff, 2))); 

    return distance < (radius + circle.getRadius()); 
} 
+0

您将中心之间的距离平方与任一半径进行比较。 –

+0

@PeteKirkham是的,我们对此深感抱歉。在审查之前,我已经将JavaScript解决方案引入其中,然后发现它不正确,因为我正在将它更新到Java。 – Briguy37

3
dx = x2 - x1; 
dy = y2 - y1; 
radiusSum = radius1 + radius2; 
return dx * dx + dy * dy <= radiusSum * radiusSum; // true if collision 

从@instanceofTom链接的评论比较好...用图片。

0

当它们的中心之间的距离等于它们的半径之和时,圆圈将会碰触,或者当距离较小时碰撞。

由于我们使用的绝对距离,它是确定中心之间的距离的平方与半径之和的平方进行比较。