我正在研究一个项目,我需要能够检测到圆圈之间的碰撞。我已经找到了一个数学公式:http://cgp.wikidot.com/circle-to-circle-collision-detection
但是我有一个问题,如何检测这个区域是否有矩形?或者只是内部矩形的一部分?
我得到了:圆心和半径的坐标,对于矩形,我有一个x和y坐标,宽度和一个高度。我猜x和y只是一个点,我可以用宽度和高度来猜测形状。
有什么想法吗?
非常感谢!
答案 0 :(得分:4)
希望这有帮助。
祝你好运。
答案 1 :(得分:3)
您可以使用java.awt.geom.Area
课程。
它有一个构造函数来从Shape
创建一个Areapublic 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);