我正在开发一个Java游戏(但开发语言并不重要),包括球或圆球等圆形物体,现在正在进行碰撞。 我使用计时器,所以在每一帧我检查是否发生碰撞。
这是一个代表对象右上角的图表。
对象的中心由点[0,0]表示,其半径为10px,单位为像素。
现在,如果我的对象(例如,obj_1
)是方形/菱形(蓝线),为了找到另一个(obj_2
)是否碰撞它,我只需得到它们的坐标和通过检查Math.abs(obj_1.x - obj_2.x) + Math.abs(obj_1.y - obj_2.y) <= radius
我会知道是否发生了碰撞。
但问题是圆形(红线)更棘手,因为它需要更多的空间,这个占用的空间不受直线的限制。当然我必须舍入一些值(例如在上图中,如果我想在x = 2
检查碰撞,我将必须舍入y值,看起来像9.5到10)。但我根本不知道如何得到这个公式。任何帮助将非常感激。
答案 0 :(得分:3)
正如您所提到的那样,实现语言无关紧要,我将为您提供检测圆形对象碰撞的通用解决方案。
另外,根据我收集的内容,场景中的所有对象都是圆圈。以下解决方案不适用于检测圆形与其他形状之间的碰撞。
假设您有两个圈子 c1 和 c2 。假设相应的半径为 c1.r 且 c2.r ,且中心为(c1.x,c1.y)且(c2.x,c2.y),然后以下函数将判断c1和c2是否在碰撞中
boolean areColliding(Circle c1, Circle c2){
center_distance = sqrt((x1-x2)^2 +(y1-y2)^2); //this is the distance between the centers of the two circles.
if((c1.r+c2.r) < center_distance)
return false;
else
return true;
}
如果圆圈发生碰撞,此伪代码函数将返回 true ,否则返回false。
基本上,该功能的作用是检查圆心之间的距离是否大于它们各自半径的总和。
答案 1 :(得分:2)
在Java中,您有一个java.awt.Polygon。
Polygon
类有多个包含方法和交叉方法。
将圆圈定义为Polygon
是一种痛苦,具体取决于您希望圆圈的准确度。但是,一旦将所有对象定义为Polygon
,就可以使用定义的方法来检测碰撞。
答案 2 :(得分:1)
您可以在边界框中设置圆形。这将产生不太准确的碰撞,但与其他方法相比具有巨大的性能优势
答案 3 :(得分:1)
@ Ankit解决方案的补充:
boolean areColliding(Circle c1, Circle c2){
center_distance = (x1-x2)^2 +(y1-y2)^2; //this is the distance between the centers of the two circles.
if((c1.r+c2.r)^2 < center_distance)
return false;
else
return true;
}
这只是比较平方距离。结果是一样的,但没有平方根和巨大的性能优势。