N个圆的相交公共面积求法

寻开心 2005-06-16 12:56:40
原题参考 mmmcd 超超 在这个帖子当中的讨论
http://community.csdn.net/Expert/topic/4075/4075074.xml?temp=.4154627

N个任意圆相交求公共面积的问题

必须注意到如下
一:凸体和凸体相交依然是凸体,多元相交后也是凸体
二:多元相交结果,必然是由圆弧所组成,
三:最终的相交面积为各个子圆弧的弓形面积 + 内部凸多边形的面积


要解决这个问题,要解决下面几个问题:
第一个:圆弧的表达方法
Arc(圆心位置,半径,开始角度和结束角度,P1, P2)
p1,p2是两个交点的位置
交点表达:
P(x, y, c1, c2) : 必然是两个 圆交出来的

第二个: 建立同圆的圆弧相交算法
只有两个圆弧是同一个圆上的时候,才用此算法
算法运算的结果是生成一组圆弧,他们的圆心,半径相同,其他的参数不同

第三个: 任意两圆相交结果的圆弧表达方法
任意两个圆做相交判断,结果有三种:
相 交:得到组成相交结果的两个圆弧
不相交:得到两个空的圆弧
包 含:得到一个空圆弧,一个满圆弧

有了这三个算法,n个圆相交的解决方案如下

第一步:
n个圆两两执行相交计算,把结果用圆弧表示,执行结果是一个N×N的表格
执行次数是n*(n-1)/2, 每次运算填充表的两个位置
第一个圆 第二个 第三个 第四个 ..... 第n个
第一个圆 * arc12 arc13 arc14 ..... arc1n
第二个圆 arc21 * arc23 arc24 ..... arc2n
第三个圆 arc31 arc32 * arc24 ..... arc2n
第四个圆 arc41 arc42 arc23 * arc2n
........ ................................................
第n个圆 arcn1 arcn2 arcn3 arcn4 ..... *
在这个表格当中,每次运算填充的是arcij和arcji两个位置
比如,第3个和第4个圆相交,结果写入arc34和arc43
arc34是相交后的,第三个圆上的圆弧, arc43则是相交后的第四个圆上的圆弧

如果在执行这个运算过程当中
arcij 和 arcji都是空圆弧,那么证明圆i和圆j不相交,全体的交集必然是空,可以停止算法了
arcij 和 arcji一个空,一个满。那么空的圆可以抛弃当作不存在,因为他们之间是包含关系

第二步
对表的每行做同圆的圆弧的相交运算,得到的最终结果依然是多段圆弧
相交的结果,可能是空,但是依然是有效的答案

第三步,串连所有的圆弧
从第二步计算得到的结果当中,随意找到一个不空的圆弧,从中找到任意一个圆弧,开始串连
串连的方法:
总面积S为0, 串连点队列L为空
从表当中选择一个圆,这个圆的表内同圆圆弧相交计算后得到的圆弧数组不空,从这个数组当中任意取得一个圆弧,作为当前圆弧
while(1)
{
把当前圆弧的P1点加入串连顶点队列L当中
计算这个圆弧的弓形面积,加入总面积S当中
if ( 当前圆弧的P2点是顶点队列L的第一个点) {
是跳出循环,结束串连
}
根据P2(x,y,c1,c2)点,找到它和另外一个圆的交点对应的圆弧,并把该圆弧作为当前的圆弧, 继续循环
}

第四步, 计算面积
在执行完成第三步之后, 串连点队列L就是N个圆相交部分的凸多边形的顶点队列,计算它的面积加入到S当中就完成了任务

...全文
1137 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2005-06-20
  • 打赏
  • 举报
回复
理解,可是
计算量也不小: 每个点在所有圆内部的判别计算×随机数的量
生成套住交的矩形的算法也要琢磨

蒙特卡罗法这种算概率的方法没有大量的样本就不准
和把矩形分成100000个部分,每个部分取中心点判断是否在公共交内部一样,而且会更准确

至少也是一种解决的办法
mathe 2005-06-20
  • 打赏
  • 举报
回复
用一个矩形套住所有的圆的交(可以偏大).矩形的面积很容易计算.
然后在矩形内部产生大量的随即点(比如1000000个点)
判断有多少个点落在所有的圆的内部,这个就是面积的期望值.
寻开心 2005-06-20
  • 打赏
  • 举报
回复
to mathe: 详细点

精确计算是比较累
mathe 2005-06-20
  • 打赏
  • 举报
回复
其实如果对计算精度要求不是太高的话,还是用蒙特卡罗法比较简单:)
galois_godel 2005-06-17
  • 打赏
  • 举报
回复
是啊, 关键在于用一段段圆弧表示边界,
至于是否用曲线积分还是割补法,其实是一样的,
因为割补法当中的那个多边形面积公式本来就是用曲线积分推出来的.
寻开心 2005-06-16
  • 打赏
  • 举报
回复
觉得那个网上的答复是建立在已经获得了最终的各个圆弧基础上,提供的如何计算面积的方法
而对如何得到各段圆弧没有解决方案

对于圆来说,不用积分,知道了弧长和半径,弓的面积中学生都会算 ;)
mmmcd 2005-06-16
  • 打赏
  • 举报
回复
那个人还说:
The area may be found without too much fuss using Stokes' Theorem, but there's an easy geometric argument too.
mmmcd 2005-06-16
  • 打赏
  • 举报
回复
具体积分的计算过程我也不清楚
http://www.math.niu.edu/~rusin/known-math/95/circleset.area
这里有个人说他曾经 thought this problem was too cumbersome,
但现在 decided it's kind of cool.
寻开心 2005-06-16
  • 打赏
  • 举报
回复
记得格林公式是计算多端连续的封闭曲线所围绕的面积用的
可是要用格林公式就要把各个曲线段方程计算出来,对于这个例子恐怕更麻烦

计算弓形的面积,在知道半径与弦长的时候可以很方便的算出小弓形或者大弓形的面积的
在前面的方法当中,由于计算出来了弧的两个端点的各自的角度,所以计算弓面积更容易
mmmcd 2005-06-16
  • 打赏
  • 举报
回复
听说有一种方法:通过格林公式计算曲线积分来算n个圆并的面积
ACM Fighting! 2 1.计算几何 5 1.1 注意 5 1.2几何公式 6 1.3 多边形 8 1.4多边形切割 11 1.5 浮点函数 12 1.6 面积 18 1.7球面 18 1.8三角形 19 1.9三维几何 22 1.10 凸包 30 1.11 网格 32 1.12 33 1.13 矢量运算求几何模板 35 1.14结构体表示几何图形 47 1.15四城部分几何模板 52 1.16 一些代码 54 1.16.1 最小覆盖_zju1450 54 1.16.2 直线旋转_两凸包的最短距离(poj3608) 58 1.16.3 扇形的重心 62 1.16.4 根据经度纬度求球面距离 62 1.16.5 多边形的重心 64 1.16.6 存不存在一个平面把两堆点分开(poj3643) 66 1.16.7 pku_3335_判断多边形的核是否存在 67 1.16.8 pku_2600_二分+的参数方程 74 1.16.9 pku_1151_矩形相交面积 76 1.16.10 pku_1118_共线最多的点的个数 78 1.16.11 pku2826_线段围成的区域可储水量 80 1.16.12 Pick公式 84 1.16.13 N点中三个点组成三角形面积最大 86 1.16.14 直线关于的反射 89 1.16.15 pku2002_3432_N个点最多组成多少个正方形(hao) 94 1.16.16 pku1981_单位覆盖最多点(poj1981)CircleandPoints 97 1.16.17 pku3668_GameofLine_N个点最多确定多少互不平行的直线(poj3668) 99 1.16.18 求凸多边形直径 100 2.组合 102 2.1 组合公式 102 2.2 排列组合生成 102 2.3 生成gray码 104 2.4 置换(polya) 104 2.5 字典序全排列 105 2.6 字典序组合 105 2.7 一些原理及其例子 106 3.数论 108 3.1 阶乘最后非0位 108 3.2 模线性方程组 108 3.3 素数 110 3.4 欧拉函数 114 3.6高精度 116 3.6.1平方根 116 3.6.2 高精度乘幂 117 3.7 高斯消元回代法 122 3.8 数值计算 124 3.8.1 定积分计算 124 3.8.2 多项式求根(牛顿法) 125 3.8.3 周期性方程(追赶法) 127 4.排序 128 4.1快速选择算法 128 4.2归并排序+逆序数的求取 128 5.字符串 130 5.1 KMP应用 130 5.2 后缀数组 131 5.3 中缀表达式转后缀表达式 134 5.4 Firefighters 表达式求值 135 6.博弈 139 6.1 博弈的AB剪枝 139 6.1.1 取石子 139 6.2 博弈 SG函数 局势分割 141 7.数据结构 142 7.1 TRIE 142 7.2 线段树 147 7.3 并查集 151 7.4 树状数组 152 7.5 点树 154 7.6 STL 156 7.7 离散化 157 8.图论 158 8.0 2-SAT 158 8.2 寻找Euler回路 163 8.3 拓扑排序 163 8.4 差分约束系统 164 8.5 笛卡尔树 165 8.6 LCA和RMQ 167 8.7 割和桥 171 8.8 最小生成树(kruskal) 172 8.9 最短路径 173 8.10 最大网络流 175 8.11 最小费用流 180 8.12 最大团问题 182 8.13 二分图匹配 184 8.14 带权的最优二分图匹配 184 9.搜索算法概略 187 9.1 迭代深搜+IDA* 187 9.2 分之界限法(深搜) 189 9.3 A* 8数码问题( pascal ) 192 9.4 优先队列广搜 194 10.应用 197 10.1 Joseph问题 197 10.2 N皇后构造解 197 10.3 布尔母函数 198 10.4 第k元素 199 10.5 幻方构造 199 10.6 模式匹配(kmp) 201 10.7 逆序对数 201 10.8 字符串最小表示 202 10.9 最长公共单调子序列 202 10.10 最长子序列 204 10.11 最大子串匹配 204 10.12 最大子段和 205 10.13 最大子阵和 206 11.其它 207 11.1 大数(只能处理正数) 207 11.2 分数 212 11.3 矩阵 214 11.4 线性方程组 216 11. 5 线性相关 218 11.6 日期 219 11.7 读入 220 11.8 函数 220
目录 目录 1 Graph 图论 3 | DAG 的深度优先搜索标记 3 | 无向图找桥 3 | 无向图连通度(割) 3 | 最大团问题 DP + DFS 3 | 欧拉路径 O(E) 3 | DIJKSTRA 数组实现 O(N^2) 3 | DIJKSTRA O(E * LOG E) 4 | BELLMANFORD 单源最短路 O(VE) 4 | SPFA(SHORTEST PATH FASTER ALGORITHM) 4 | 第 K 短路(DIJKSTRA) 5 | 第 K 短路(A*) 5 | PRIM 求 MST 6 | 次小生成树 O(V^2) 6 | 最小生成森林问题(K 颗树)O(MLOGM). 6 | 有向图最小树形图 6 | MINIMAL STEINER TREE 6 | TARJAN 强连通分量 7 | 弦图判断 7 | 弦图的 PERFECT ELIMINATION 点排列 7 | 稳定婚姻问题 O(N^2) 7 | 拓扑排序 8 | 无向图连通分支(DFS/BFS 邻接阵) 8 | 有向图强连通分支(DFS/BFS 邻接阵)O(N^2) 8 | 有向图最小点基(邻接阵)O(N^2) 9 | FLOYD 求最小环 9 | 2-SAT 问题 9 Network 网络流 11 | 二分图匹配(匈牙利算法 DFS 实现) 11 | 二分图匹配(匈牙利算法 BFS 实现) 11 | 二分图匹配(HOPCROFT-CARP 的算法) 11 | 二分图最佳匹配(KUHN MUNKRAS 算法 O(M*M*N)) 11 | 无向图最小割 O(N^3) 12 | 有上下界的最小(最大)流 12 | DINIC 最大流 O(V^2 * E) 12 | HLPP 最大流 O(V^3) 13 | 最小费用流 O(V * E * F) 13 | 最小费用流 O(V^2 * F) 14 | 最佳边割集 15 | 最佳点割集 15 | 最小边割集 15 | 最小点割集(点连通度) 16 | 最小路径覆盖 O(N^3) 16 | 最小点集覆盖 16 Structure 数据结构 17 | 求某天是星期几 17 | 左偏树 合并复杂度 O(LOG N) 17 | 树状数组 17 | 二维树状数组 17 | TRIE 树(K 叉) 17 | TRIE 树(左儿子又兄弟) 18 | 后缀数组 O(N * LOG N) 18 | 后缀数组 O(N) 18 | RMQ 离线算法 O(N*LOGN)+O(1) 19 | RMQ(RANGE MINIMUM/MAXIMUM QUERY)-ST 算法 (O(NLOGN + Q)) 19 | RMQ 离线算法 O(N*LOGN)+O(1)求解 LCA 19 | LCA 离线算法 O(E)+O(1) 20 | 带权值的并查集 20 | 快速排序 20 | 2 台机器工作调度 20 | 比较高效的大数 20 | 普通的大数运算 21 | 最长公共递增子序列 O(N^2) 22 | 0-1 分数规划 22 | 最长有序子序列(递增/递减/非递增/非递减) 22 | 最长公共子序列 23 | 最少找硬币问题(贪心策略-深搜实现) 23 | 棋盘分割 23 | 汉诺塔 23 | STL 中的 PRIORITY_QUEUE 24 | 堆栈 24 | 区间最大频率 24 | 取第 K 个元素 25 | 归并排序求逆序数 25 | 逆序数推排列数 25 | 二分查找 25 | 二分查找(大于等于 V 的第一个值) 25 | 所有数位相加 25 Number 数论 26 1 |递推求欧拉函数 PHI(I) 26 |单独求欧拉函数 PHI(X) 26 | GCD 最大公约数 26 | 快速 GCD 26 | 扩展 GCD 26 | 模线性方程 A * X = B (% N) 26 | 模线性方程组 26 | 筛素数 [1..N] 26 | 高效求小范围素数 [1..N] 26 | 随机素数测试(伪素数原理) 26 | 组合数学相关 26 | POLYA 计数 27 | 组合数 C(N, R) 27 | 最大 1 矩阵 27 | 约瑟夫环问题(数学方法) 27 | 约瑟夫环问题(数组模拟) 27 | 取石子游戏 1 27 | 集合划分问题 27 | 大数平方根(字符串数组表示) 28 | 大数取模的二进制方法 28 | 线性方程组 A[][]X[]=B[] 28 | 追赶法解周期性方程 28 | 阶乘最后非零位,复杂度 O(NLOGN) 29 递归方法求解排列组合问题 30 | 类循环排列 30 | 全排列 30 | 不重复排列 30 | 全组合 31 | 不重复组合 31 | 应用 31 模式串匹配问题总结 32 | 字符串 HASH 32 | KMP 匹配算法 O(M+N) 32 | KARP-RABIN 字符串匹配 32 | 基于 KARP-RABIN 的字符块匹配 32 | 函数名: STRSTR 32 | BM 算法的改进的算法 SUNDAY ALGORITHM 32 | 最短公共祖先(两个长字符串) 33 | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 求凸包 O(N * LOGN) 34 | 判断线段相交 34 | 求多边形重心 34 | 三角形几个重要的点 34 | 平面最近点对 O(N * LOGN) 34 | LIUCTIC 的计算几何库 35 | 求平面上两点之间的距离 35 | (P1-P0)*(P2-P0)的叉积 35 | 确定两条线段是否相交 35 | 判断点 P 是否在线段 L 上 35 | 判断两个点是否相等 35 | 线段相交判断函数 35 | 判断点 Q 是否在多边形内 35 | 计算多边形的面积 35 | 解二次方程 AX^2+BX+C=0 36 | 计算直线的一般式 AX+BY+C=0 36 | 点到直线距离 36 | 直线与的交点,已知直线与相交 36 | 点是否在射线的正向 36 | 射线与的第一个交点 36 | 求点 P1 关于直线 LN 的对称点 P2 36 | 两直线夹角(弧度) 36 ACM/ICPC 竞赛之 STL 37 ACM/ICPC 竞赛之 STL 简介 37 ACM/ICPC 竞赛之 STL--PAIR 37 ACM/ICPC 竞赛之 STL--VECTOR 37 ACM/ICPC 竞赛之 STL--ITERATOR 简介 38 ACM/ICPC 竞赛之 STL--STRING 38 ACM/ICPC 竞赛之 STL--STACK/QUEUE 38 ACM/ICPC 竞赛之 STL--MAP 40 ACM/ICPC 竞赛之 STL--ALGORITHM 40 STL IN ACM 41 头文件 42 线段树 43 求矩形并的面积(线段树+离散化+扫描线) 43 求矩形并的周长(线段树+离散化+扫描线) 44
一大堆模版 自己可以下来参考 应该有200个以上吧 自己下来看看 其中一个目录 图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 Euler Path / Tour Hamilton Path / Tour 特殊图的Hamilton Path / Tour 构造 生成树问题 最小生成树 第k小生成树 最优比率生成树 0/1分数规划 度限制生成树 连通性问题 强大的DFS算法 无向图连通性 割点 割边 二连通分支 有向图连通性 强连通分支 2-SAT 最小点基 有向无环图 拓扑排序 有向无环图与动态规划的关系 二分图匹配问题 一般图问题与二分图问题的转换思路 最大匹配(OK) 有向图的最小路径覆盖 0 / 1矩阵的最小覆盖 完备匹配(OK) 最优匹配(OK) 稳定婚姻 网络流问题 网络流模型的简单特征和与线性规划的关系 最大流最小割定理 最大流问题(OK) 有上下界的最大流问题 循环流 最小费用最大流 / 最大费用最大流 弦图的性质和判定 组合数学 解决组合数学问题时常用的思想 逼近 递推 / 动态规划 概率问题 Polya定理 计算几何 / 解析几何 计算几何的核心:叉积 / 面积 解析几何的主力:复数 基本形 点 直线,线段 多边形 凸多边形 / 凸包 凸包算法的引进,卷包裹法 Graham扫描法 水平序的引进,共线凸包的补丁 完美凸包算法 相关判定 两直线相交 两线段相交 点在任意多边形内的判定 点在凸多边形内的判定 经典问题 最小外接 近似O(n)的最小外接算法 点集直径 旋转卡壳,对踵点 多边形的三角剖分 数学 / 数论 高精度计算 高数度加减法、乘除法 最大公约数 Euclid算法 扩展的Euclid算法 同余方程 / 二元一次不定方程 同余方程组 线性方程组 高斯消元法 解mod 2域上的线性方程组 整系数方程组的精确解法 矩阵 行列式的计算 利用矩阵乘法快速计算递推关系 分数 分数树 连分数逼近 数论计算 求N的约数个数 求phi(N) 求约数和 快速数论变换 …… 素数问题 概率判素算法 概率因子分解 数据结构 组织结构 二叉堆 左偏树 二项树 胜者树 跳跃表 样式图标 斜堆 reap 统计结构 树状数组 虚二叉树 线段树 矩形面积面积并 关系结构 Hash表 并查集 路径压缩思想的应用 STL中的数据结构 vector deque set / map 动态规划 / 记忆化搜索 动态规划和记忆化搜索在思考方式上的区别 最长子序列系列问题 最长不下降子序列 最长公共子序列 一类NP问题的动态规划解法 树型动态规划 背包问题 动态规划的优化 四边形不等式 函数的凸凹性 状态设计 规划方向 线性规划 常用思想 二分 最小表示法 串 KMP Trie结构 后缀树/后缀数组 LCA/RMQ 有限状态自动机理论 排序 选择/冒泡 快速排序 堆排序 归并排序(OK) 基数排序 拓扑排序 排序网络

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧