这里是圆类:Java的圈,圈的碰撞检测
public class Circle {
private double radius;
private double x;
private double y;
}
我怎么能知道从这个类(圆圈)两个物体发生碰撞?
P.S.你可以使用避免采用平方根的方法吗?
这里是圆类:Java的圈,圈的碰撞检测
public class Circle {
private double radius;
private double x;
private double y;
}
我怎么能知道从这个类(圆圈)两个物体发生碰撞?
P.S.你可以使用避免采用平方根的方法吗?
double xDif = x1 - x2;
double yDif = y1 - y2;
double distanceSquared = xDif * xDif + yDif * yDif;
boolean collision = distanceSquared < (radius1 + radius2) * (radius1 + radius2);
如果x,y,radius有近似误差(当使用浮点数时通常是这种情况),那么浮点比较最好使用epsilon来完成...... – TacticalCoder
下面是更新后的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());
}
您将中心之间的距离平方与任一半径进行比较。 –
@PeteKirkham是的,我们对此深感抱歉。在审查之前,我已经将JavaScript解决方案引入其中,然后发现它不正确,因为我正在将它更新到Java。 – Briguy37
dx = x2 - x1;
dy = y2 - y1;
radiusSum = radius1 + radius2;
return dx * dx + dy * dy <= radiusSum * radiusSum; // true if collision
从@instanceofTom链接的评论比较好...用图片。
当它们的中心之间的距离等于它们的半径之和时,圆圈将会碰触,或者当距离较小时碰撞。
由于我们使用的绝对距离,它是确定中心之间的距离的平方与半径之和的平方进行比较。
这个问题有一个详细的解答在这里:http://stackoverflow.com/questions/1736734/circle-circle-collision –
像circle1.collide(CIRCLE2)的方法需要访问CIRCLE2的半径,x和y但那些是私人的。 –
@SteveC:假设'circle1'和'circle2'是同一类型的对象的两个实例,那么这显然不是一个问题。 –