n圈联盟区域(MATLAB代码)

时间:2012-01-04 05:49:42

标签: matlab

当我知道所有圆的半径相等且它们的中心也是已知的(在所有n个圆中)时,我试图计算平面中n个圆的并集区域。我试图遵循集合论方法(包含 - 排除原则),在那里我们知道n集的并集公式。我只是使用了一个运算符Ar()来给出该区域,即。 Ar(A)给出了A的区域。我首先试图在D< 2R的帮助下找出哪个圆与哪个圆相交(D =两个圆心之间的距离),然后我他们试图成对地计算它们之间的交叉区域,从而找到了联合区域。但是我被困在n> 4。任何人都可以提供一个解决方案(通过集合理论方法解决是必要的)。提前致谢

1 个答案:

答案 0 :(得分:1)

如果您的问题仅适用于成对的圈子,则您将使用Circle-Circle intersection areas的已知结果。在那里给出了基于所涉及的所有圆的标准参数化的任意两个圆之间的成对区域的公式。但随着n变大,这些区域的公式并不常见。可能有一种聪明的方法来使用递归来计算两个圆(n=2)的交集的公式,两个不对称的镜头形状(n=3)的交集,两个任何形状的实例的交集是两个不对称镜片形状(n=4)的交集,依此类推。如果您可以导出这些区域的公式,则可以始终使用inclusion-exclusion来计算交点。关键的见解是,前一个形状的n个实例的交集实际上是前一个形状的交叉点的n-1个实例的交集。但正如上面的评论者所说,这个问题确实属于Math Overflow。

实践旁白

对于任何对解决此问题的实用方法感兴趣的人来说,蒙特卡洛集成是一个很好的选择。您需要做的就是计算一个绑定所有圆的大矩形,然后在该矩形中均匀地绘制点。对于每个圆圈,检查该点是在内部还是外部。如果它在里面,那么递增一个计数器并且不再进行任何检查。最后,该计数器与绘制的总点数的比例乘以矩形的面积,将得出该区域。

如果我们假设对于每个n - 明智的交叉区域,我们需要执行n个不同的O(1)步骤(假设我们得到一个分析公式,我们可以插入半径和中心数据直接进入,这可能是乐观的,然后这种分析方法仍然是O(n^2)

蒙特卡罗更糟糕,O(Mn)其中M是我们绘制的点数,如果我们做出悲观假设,我们必须针对每个点检查所有n个圆圈。对于中等n,虽然M不需要难度大,但它肯定不会接近n。然而,我们得到的额外好处是我们的函数自动推广到混合半径的情况(一般解决方案更难)。从实践者的角度来看,这里的解析解不是很有用,除非圆圈几乎没有重叠,并且边界矩形包含大量的空白空间。