检测内部带有矩形的圆圈之间的碰撞

时间:2015-01-22 09:51:06

标签: java algorithm collision-detection

我正在研究一个项目,我需要能够检测到圆圈之间的碰撞。我已经找到了一个数学公式:http://cgp.wikidot.com/circle-to-circle-collision-detection

但是我有一个问题,如何检测这个区域是否有矩形?或者只是内部矩形的一部分?

我得到了:圆心和半径的坐标,对于矩形,我有一个x和y坐标,宽度和一个高度。我猜x和y只是一个点,我可以用宽度和高度来猜测形状。

Example of Collisions

有什么想法吗?

非常感谢!

3 个答案:

答案 0 :(得分:4)

  1. 编写一种方法来检查点是否位于圆圈内。
  2. 在两个圆上为矩形的所有角点(从x,y,宽度和高度计算)调用该方法。
  3. 使用现有的圆形交叉检测器方法修剪呼叫。
  4. 希望这有帮助。
    祝你好运。

答案 1 :(得分:3)

您可以使用java.awt.geom.Area课程。

它有一个构造函数来从Shape

创建一个Area
public Area(Shape s)

因此,为您的圆圈和矩形创建简单区域。然后,您可以使用方法组合区域以获得新区域。

public void add(Area rhs)
public void subtract(Area rhs)

通过

检查区域是否相交或包含其他区域
public void intersect(Area rhs)
public boolean contains(Rectangle2D r)

答案 2 :(得分:2)

这听起来像this answer中描述的技术的变体。

同样适用两种情况(圆圈的中心位于区域内,或者一个或多个矩形的边缘与区域相交)......不同之处在于不考虑圆圈一般来说,你需要考虑圆的交叉点。

第一种情况很简单,因为你可以交换中心点。如果矩形的中心点位于圆的交点,则矩形部分位于内部。这很容易确定:找到矩形的中心点,看它是否在第一个圆圈中,看它是否在第二个圆圈中。

第二种情况很复杂,因为它要求你计算curves where the circles intersect。如果矩形的边缘与这些曲线中的任何一条相交,则矩形与交点重叠。作为一种特殊情况,如果一个圆圈完全位于另一个圆圈内,则要检查的线条是较小圆圈的边界。

如果您不需要确切的答案,那么第二种情况可以近似。首先,找到points where the two circles intersect(或者使用您已经提出的方法,如果可以的话)。这两个点可用于构造边界矩形(它们是矩形的左上/右下或右上/左下点)。如果此边界矩形与矩形相交,则矩形可能与圆形交叉点重叠。

总而言之,如果你想得到一个适用于所有特殊情况的精确答案(一个圆圈完全在另一个圆圈内,矩形与两个圆圈相交但不与它们的交点相交等),这相当复杂。我希望这有点帮助。

我在调用the JTS topology suite 之前使用的库可能适合您的需要。与纯欧几何几何相比,它更倾向于GIS操作,但是一旦您定义了形状,它就可以轻松地为您完成所有这些计算:

import com.vividsolutions.jts.util.*

GeometricShapeFactory gsf = new GeometricShapeFactory();
gsf.setSize(100);
gsf.setNumPoints(100);
gsf.setBase(new Coordinate(100, 100));
//configure the circle as appropriate
Polygon circleA = gsf.createCircle();

//configure again and create a separate circle
Polygon circleB = gsf.createCircle();

//configure a rectangle this time
Polygon rectangle = gsf.createRectangle();

Geometry circleIntersection = circleA.intersection(circleB);
return rectangle.intersects(circleIntersection);