【问题标题】:Detect collisions between circles with rectangles inside检测内部带有矩形的圆圈之间的碰撞
【发布时间】:2015-01-22 09:51:05
【问题描述】:

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

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

我有:圆心和半径的坐标,对于矩形,我有一个 x 和 y 坐标,以及宽度和高度。我猜 x 和 y 只是一个点,这样我就能猜出形状的宽度和高度。

有什么想法吗?

非常感谢!

【问题讨论】:

标签: java algorithm collision-detection


【解决方案1】:
  1. 编写一个方法来检查一个点是否在一个圆内。
  2. 为两个圆上矩形的所有角点(根据 x、y、宽度和高度计算)调用该方法。
  3. 使用您现有的圆形交叉点检测器方法来修剪呼叫。

希望这会有所帮助。
祝你好运。

【讨论】:

  • 这不适用于所有情况...当矩形完全包含圆的相交区域时呢? (或者完全包含两个圆圈等?)
  • 或者更糟糕的是,当矩形分别与每个圆相交,但不在圆本身相交的点上)。
【解决方案2】:

你可以使用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)

【讨论】:

    【解决方案3】:

    这听起来像是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);
    

    【讨论】:

    • 非常好的答案!非常感谢,我要深入研究一下:D
    猜你喜欢
    • 2023-01-26
    • 2014-05-05
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多