【发布时间】:2012-03-28 08:03:24
【问题描述】:
我正在开发一个小型游戏几何库,在许多其他方法中,我希望能够找到圆和矩形之间的交点。但是,我很难想到一个快速算法来做到这一点。有谁知道这样做的好算法吗?
如果这意味着算法会明显更快,我愿意牺牲完美的准确性。
我表示每个形状的基本方式是:
圈子:
- 浮动 x, y(中心)
- float r(半径)
矩形:
- 浮动 x, y(中心)
- float w, h(宽度和高度值,它们代表从中心到各自边缘的 x 和 y 距离)。
编辑:
由于我所说的“中点”似乎有些混淆,让我澄清一下:
鉴于圆形和矩形相交,它们的重叠创建了一个区域。我希望确定该区域的地理中心(准确或确定近似值)。
示例:http://en.wikipedia.org/wiki/Centroid
编辑#2:
你们给了我一些想法,让我努力实现其中的一些,我会回复你的。
结语:
我将 Gareth 的答案标记为已接受的答案,因为它给了我最终的想法,但我的最终实现与他的不同,所以我会在这里解释一下。
我想出了两种通用的方法:一种是完全准确的(但需要更复杂的编程和更多的数学运算),另一种更简单/更快的方法,一直都非常接近。我最终选择了后者,但这里有两种方法:
方法一:形状碎片化:
基本上,这个想法是将重叠区域分解成离散的部分,可以轻松计算它们的中点和面积,然后对整个结果进行加权平均。
此处显示的示例包含三个子部分:一个中心矩形占据了大部分区域,两个曲线段用于圆的边缘。
方法2:线插值
首先,您需要计算矩形中的一个点,该点将作为基本位置。这应该是一个易于计算且处于重叠中的点。我对这一点使用的是圆形和矩形的所有边缘交叉点的平均值(如果不存在边缘交叉点,我默认为圆的位置,因为这意味着一个形状包含在另一个形状中)。
C计算圆心和那个点之间的直线。然后,计算位于重叠区域内的线段。该区域的中点被视为该线段的中点。
这种方法不准确,但总是在两个对象内产生一个点,并且结果点通常靠近中间(所以它“看起来”不错)。它也更简单、更快,所以我选择了它。
【问题讨论】:
-
“中点”是什么意思?你想要centroid吗?
-
相交区域的中心。
-
另外,请记住,圆形和矩形可以以多种不同方式相交。
-
@CodeBunny:好的,定义“相交区域的中心”。
-
如果您需要一些非常快但不准确的东西,您可以用它的边界框来表示球体。
标签: algorithm geometry 2d intersection area