我正在研究一个小型游戏几何库,在其他一些方法中,我希望能够找到圆形和矩形之间的交点中点。但是,我很难想到快速算法。有没有人知道这样做的好算法?
如果这意味着算法会明显加快,我愿意牺牲完美的准确性。
我代表每个形状的基本方法是:
环:
矩形:
编辑:
由于我对“中点”的意思似乎有些混淆,让我澄清一下:
鉴于圆和矩形相交,有一个由重叠创建的区域。我希望确定这个区域的地理中心(确切地说,或确定近似的近似值)。
示例:http://en.wikipedia.org/wiki/Centroid
编辑#2:
你们给了我一些想法,让我努力实施其中的一些,我会回复你。
结束思考:
我将Gareth的答案标记为已接受的答案,因为它给了我最终结果的想法,但我的最终实施与他的不同,所以我将在这里解释。
我提出了两种一般的方法:一种是完全准确的(但需要更复杂的编程和更多的数学运算),另一种更简单/更快的方式,它始终相当接近。我最后选择了后者,但这里有两种方法:
方法1:形状碎片:
基本上,我们的想法是将重叠区域分解为可以轻松计算其中点和面积的离散区段,然后对整个结果进行加权平均。
此处显示的示例有三个子部分:占据区域大部分的中心矩形,以及圆的边缘的两个弯曲部分。
方法2:行插值
首先,您需要计算矩形中将作为基本位置的点。这应该是一个容易计算并且重叠的点。我在这一点上使用的是圆和矩形的所有边缘交点的平均值(如果不存在边缘交点,我默认为圆的位置,因为它意味着一个形状包含在另一个中)。
计算圆心和该点之间的直线。然后,计算位于重叠区域内的段。该区域的中点被视为该线段的中点。
此方法不准确,但始终在两个对象中生成一个点,并且结果点通常接近中间(因此它“看起来”对于随意的眼睛是好的)。它也更简单,更快,所以我选择了它。
答案 0 :(得分:5)
如果您对近似值感到满意,请尝试采样。将矩形划分为若干个正方形,并且对于每个正方形估计,如果它主要位于圆内(可能只是测试其中心是否在圆内)。
然后应用the centroid formula,
平面图的质心可以通过将其除以有限数量的更简单的数字来计算,计算每个部分的质心C i 和区域A i ,然后计算ΣC i A i /ΣA i 。
在这种情况下特别简单,因为正方形的质心是它的中心,并且所有A i 都相等。
(几何解剖为suggested by Vaughn Cato将得到确切的答案,但这种近似方法具有简单的优点:错误编程会更加困难。)
CodeBunny在评论中询问“更简单,基于方程式的结果”。以下是使用方程式计算结果的方法,但我认为它并不“简单”。
首先,您必须通过将圆与矩形的每个边相交并计算交叉点的数量来确定您所处的几何情况。我相信,这让你有以下十四种情况之一:
然后,对于每种情况,您将交叉点分解为圆形线段和凸多边形的总和。计算这些中的每一个的区域和质心(参见维基百科的公式:area和centroid圆形段; area and centroid of convex polygon)并使用我上面给出的质心公式将它们组合。
这绝不是简单的:几何案例的枚举很棘手(我很容易错过一两个案例:在我第一次尝试时我只发现了11个案例),编程计算很简单(很容易)在其中一个案例中犯了一个错误而没有注意到。)
答案 1 :(得分:2)
一种方法是将其分解为案例:
然后,在每种情况下找到质心。例如,在第三种情况下,交点是圆形段,您可以使用标准公式找到其中心。在第四种情况下,您将得到一个三角形和一个圆形段。您可以通过将每个部分的面积乘以其各自的质心,然后除以总面积来找到组合区域的质心。
答案 2 :(得分:0)
如果我正确理解您的要求,您希望找到两个形状重叠的区域的中心?
这是对的吗?
有一个圆心,中心(x,y)和半径r。 有一个矩形,中心(x,y),宽度w和高度h
所以这是第一个差距:
您无法在x,y平面中定义矩形,仅包含其中心点和宽度和高度。矩形面向哪个方向?
如上所述的圆的等式是 (x-a)^ 2 +(y-b)^ 2 = r ^ 2
可以使用线的等式同时求解该等式以获得交点。
第二个差距:
一条线可能在2个点,一个点或没有点与一个圆相交 - 您是否确定圆和矩形将始终重叠,因此该线的两个点与圆相交?
假设是,从这一点开始(找到两个交点)计算交点之间的中点,然后计算垂直于该中点的线的中点,应该不会太困难到圆的边缘(形状的交叉区域的中点)
这绝不是'这是答案'的答案,但我希望这有点帮助?
史蒂夫
答案 3 :(得分:0)
也许为时已晚......
有一种简单,准确,快速的方法:
考虑到在每个矩形边ABO
和圆心AB
之间形成的三角形O
,您必须以顺时针方向循环矩形。
然后,您必须考虑该三角形ABO
与圆的交点。最多,您会将ABO
划分为两个圆形扇区(APO
,QBO
)和一个子三角形(PQO
)。对于这个扇区和子三角形中的每一个,你可以计算它的中点及其面积,当OA
和OB
之间的角度是逆时针时,考虑面积为负值的特性。
然后,要获得矩形和圆的交点上的中点,您必须计算由其带符号区域加权的扇区和子三角形的中点的中位数。