这个圆悬挂在矩形之外的面积是多少(想象矩形两端延伸到(无穷大,无穷大)),以及如何将其推广到任何半径的任何圆以及任何矩形尺寸。
我有一个编码问题,我需要计算多个不同圆的圆在矩形中的百分比,当矩形的角被覆盖时,我在代码中遇到困难。如果没有角问题,我可以简单地查看每个突出边缘的距离,然后使用一些圆/三角数学来找到每个外部位的面积。但是一旦角被覆盖,代码就会对角位进行计数:在圆位于 (0,0) 的极端情况下,它将左半部分计为出局,将上半部分计为出局,并得出整个圆出局的结论。我画了图表,但没能找到一种方法来发现被多算的区域。我最初尝试找到外三角形的尺寸,但我也无法弄清楚。
我知道有一个答案,因为只有一种可能性有足够的信息,但我不知道如何解决。
这是我到目前为止的代码,它只是计算垂直于轴的线段覆盖的面积,因此当这些线段重叠时会过度计算。 xbounds 是矩形宽度的元组 (low, high),ybounds (low, high) 是矩形高度的元组,这些只是说明矩形在 x 和 y 轴上开始和结束的位置,实际上,第一个值是 0,因为矩形从零开始,第二个值是非常大的数字。 范围是圆的半径。 Pos 是一个虚数,代表原点,其中 real 是 x 坐标,imag 是 y 坐标。
r2 = range*range
outarea = 0
if (b:= -pos.real+range+xbounds[0])>0:
theta = 2*acos(1-b/range)
outarea=0.5*r2*(theta-sin(theta))
if (b:= pos.real+range-xbounds[1])>0:
theta = 2*acos(1-b/range)
outarea+=0.5*r2*(theta-sin(theta))
if (b:= -pos.imag+range+ybounds[0])>0:
theta = 2*acos(1-b/range)
outarea+=0.5*r2*(theta-sin(theta))
if (b:= pos.imag+range-ybounds[1])>0:
theta = 2*acos(1-b/range)
outarea+=0.5*r2*(theta-sin(theta))
如果角(我称之为 O)在圆的内部,你可以
在两个交点 A 和 B 之间画一条线。
求直角三角形ABO的面积。
获取 A 和 B 之间以圆 C 中心为中心的扇形面积。这应该是
pi*r*r*percentage
,其中 percentage
可以通过使用 atan2 计算得到射线 CA 和 CB 的角度,然后将它们的差除以 2pi。
计算直角三角形ABC的面积。
弦AB与圆之间的面积是面积(扇形)-面积(三角形ABC)。
圆与矩形交点的面积为(弦与圆之间的面积)+面积(三角形ABC)
矩形外圆的面积是圆的面积减去它们的交点。