碰撞检测:圆形物体

我正在开发一个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)。 但我根本不知道如何获得这个公式。 任何帮助将非常感谢。

正如您所提到的实现语言并不重要,我将为您提供一种检测圆形对象碰撞的通用解决方案。

另外,根据我收集的内容,场景中的所有对象都是圆圈。 以下解决方案不适用于检测圆与其他形状之间的碰撞。

假设你有两个圆圈c1c2 。 假设相应的半径是c1.rc2.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。

基本上,该function的作用是检查圆心之间的距离是否大于它们各自半径的总和。

在Java中,您有一个java.awt.Polygon 。

Polygon类有多个包含方法和交叉方法。

将圆定义为Polygon是一种痛苦,取决于您希望圆的精确度。 但是,一旦将所有对象定义为Polygon ,就可以使用定义的方法来检测碰撞。

您可以在边界框中设置圆形。 这将产生不太准确的碰撞,但与其他方法相比具有巨大的性能优势

@ 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; } 

这只是比较平方距离。 结果是一样的,但没有平方根和巨大的性能优势。