欢迎来到天天文库
浏览记录
ID:37646391
大小:426.70 KB
页数:14页
时间:2019-05-27
《多圆求面积并》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、算法参照AekdyCoin的Blog开始看的时候觉的很多地方没讲清楚,所以决定rewrite一遍。感谢黄伟老湿的大力支持。多圆面积并这个东西自己也只是听说过几次,觉得挺神奇的,不会写,前几天遇到一题孜孜YY了一个用多圆面积并+多圆与矩形面积并的算法,当时不会这个,比赛结束后就果断被拉去学了。题目来源:http://www.spoj.pl/problems/CIRU/题意:给你1000个圆,求这1000个圆的并集的面积。举个栗子,下图是三个圆并的一种情况。初看可能觉得毫无头绪,下面我们把轮廓标记一下。仔细分析不难发现边界的轮廓都是只被
2、覆盖一次的圆周。那么我们就利用这个轮廓来把这三个圆的并给划分一下吧。分法有很多,只要把轮廓分开了都是可以的,给一个比较直观的分法,连接在轮廓线上的相邻两个圆交点,如下图所示。这样分割之后,我们就把这三个圆的并集划分成了三个弓形+一个三角形。这些形体的面积都是比较容易计算的。那么处理多圆面积并就有了一个比较好的算法:1、去除被包含的圆,或者退化成点的圆。2、找到只被覆盖一次的圆弧,然后把图形分成若干个弓形和若干个多边形3、计算面积。怎么找只被覆盖一次的圆弧呢?首先,我们枚举一个圆,然后求出其他所有圆与它的交点(交点数少于两个可以直接忽
3、略不计)。先直接贴AC牛的一段话引用PS.以下算法基于正方向为逆时针考虑上图中的蓝色圆,绿色的圆和蓝色的圆交于A,B2个交点,我们在逆时针系下考虑,那么可以知道对于蓝色的圆,它对应的某个角度区间被覆盖了假设区间为[A,B],并且角度是按照圆心到交点的向量的极角来定义(为了方便,我一般都把角度转化到[0,2pi]区间内)那么可以知道在这种标识情况下,可能存在以下情况这种区间的跨度如何解决呢?实际上十分简单,只需要把[A,B]拆成[A,2PI],[0,B]即可,也就是所谓的添加虚拟点这上面这一段话定义了被覆盖了的角度区间我们求出所有与它
4、相交的圆对应的被覆盖了的角度区间,那么查找只被覆盖一次的圆弧就可以转换成查找只被覆盖了一次的区间了,这个实现起来是非常简单的。找到了这些区间后,一个区间对应了一个弓形以及多边形上的一条边,面积是可以直接计算的。首先是弓形。对于a1角对应的弓形面积,可以看成一个a1角对应的扇形面积减去一个三角形的面积,不难得出弓形面积解决了接下来是多边形的面积。给个大一点的栗子,今天凌晨画的。有多个多边形?这怎么搞?当然,还有更猎奇的。这个多边形虽然鬼畜,但它肯定是简单多边形,既然是简单多边形,我们就可以利用叉积直接搞出来。叉积有个很好的性质,就是它
5、的值等于两个向量组成的一个平行四边形的有向面积,而这个面积根据向量ab的夹角还是有正负之分的,按照ab夹角为逆时针方向取正。对于这个五边形QRSTU,我们按照逆时针顺序将五条边定向,假设原点为(0,0),那么,按照这五条边的方向将这些相邻的两个点一次叉乘然后除以二然后累加会得到什么东西呢?上面说了,叉乘的值等价于两个向量组成的一个平行四边形的有向面积,除以二就是以这两个向量为边的三角形有向面积了。所以,这个和为S(OUT)+S(OTS)+S(OSR)+S(ORQ)-S(OQU)=S(QUTSR)恰好是这个五边形的面积。而且,计算的时
6、候不需要考虑不同边之间的先后顺序。这个方法可以计算任意简单多边形的面积,只需要把每条边与原点构成的三角形的有向面积求出来然后累加即可。总体复杂度是O(n^2logn)的。扩展:https://www.spoj.pl/problems/CIRUT/[/url]给你N个不同的圆,求被覆盖了K次的面积,K从1取到N。这个的处理方法和被覆盖一次的面积处理方法一样,自己画个图,把被覆盖一次的圆弧连接起来,把覆盖两次的圆弧连接起来,把覆盖三次的圆弧连接起来……答案就出来了。下图是三个圆相交的情况。黑色为被覆盖一次的圆弧蓝色为被覆盖两次的圆弧紫色
7、为被覆盖三次的圆弧至于怎么做什么的,人家才不告诉你呢~
此文档下载收益归作者所有