圆的面积并.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
圆的面积并.doc

《圆的并》解题报告 1、题目描述 给定n(1≤n≤1000)个圆,求n个圆的并的面积。圆的坐标和半径的范围是-10000到10000,答案精确到小数点后面6位。 2、算法分析 关于求圆的并的方法有很多。这中间有很多是求近似值的算法,例如随机算法,割平面算法,这些算法都很简单,当精度要求不高时,使用这些算法是比较好的选择。但是,如果精度要求高一点,这些算法的复杂度也会大大的提高。例如这里的数据范围,用随机算法时最坏情况下至少需要随机1010个点,割平面算法的复杂度也不止1000*1010的级别。 这道题,我们只有用理论上能求出准确值的算法(不考虑计算时的精度误差)。由于圆的并是一个很复杂的形状,直接计算它的面积不是很容易,想法当然是把它们分割成若干部分,每一个部分求出它们的面积,而每一部分的面积都不是很难算。这样就不难想到离散交点的方法,把所有的交点按照x坐标排序后,对任意两个交点,用一条条的竖直线去分割图形: 图1 这样,平面被分成若干条形区域,怎样计算条形区域的面积呢?由于没有交点,所以这个变得简单。 看图中绿色方框框住的区域里面的圆,就不难发现,它可以分成若干梯形和弓形的面积(下面的左图): 图2 考虑一般的情况,一个竖直区域的左右两条分界线,一个圆与它们相交的情况有3种:不与任意一条分界线相交、与其中一条相交,与两条都相交(相切不算相交)。其实如果把每个圆的两条竖直切线都拿来离散,那么就只需要考虑圆与两条竖直线都相交的情况了。 两条分界线切割圆时,在两条分割线中会形成两条弧,上面和下面各一条。这些弧之间不可能有交点,于是把它们的左的端点从上到下排序,左端点相同的按照右端点排序。记一个层次,然后再从上往下扫描,遇到上边界就将层次加1,遇到下边界就将层次减1。到了层次为0的时候,就形成了一个独立区域。这个区域的面积可以通过两个弓形的面积和一个梯形的面积相接计算出来。如图2的右,形成了两个独立区域,粉红色表示层次为1,绿色表示层次为2,蓝色表示层次为3。 再来分析算法的时间复杂度,最坏情况下,交点个数的级别是O(n2)的,共分成了O(n2)个区域,然后每一个区域都与n个圆相交,加上排序,复杂度是O(n3log2n)的。 总感觉到题目描述很简单,应该复杂度降低一些。上面的算法很直观,而下面说的算法也比较直观,可以把复杂度降为O(n2log2n)。 试想,如果人来做此题,而不使用计算机计算,那么,人会采取什么样的方法呢?看下面的图: 两个圆相交的情况,可以把面积分成两个弓形的面积之和。(上面两个图) 下面是三个圆两两相交的情况,可以把面积看成是3个弓形与一个三角形面积之和。(下面两个图) 看图4,4个圆,如上图所示,可以看成是8个弓形(外面4个,里面4个)的面积,再加上一个4边形面积(外面的4边形),再减去一个4边形面积(里面的4边形)。 上面的图形虽然简单,人能够很快的看出它是什么样的图形拼接而成,但是,如果圆的个数多了一点,还能不能变得如此简单? 从图3的3个圆的情况可以看出,有些交点是没有用到的!虽然3个圆有6个交点,但是,只有3个交点在计算中起到了作用。观察这3个点与另外3个点的区别。这3个圆的周围没有完全被蓝色部分包围!推广到一般的情况,也可以这样做。 首先要做一些预处理,如果一个圆完全被另一个圆包围,那么这一个圆可以删除。删除后,如果一个圆是孤立的圆,不与其它任何圆相交,就可以把这个圆的面积现算出来,也将它删去。剩下的工作就是求交点了。 对于一个圆来说,其他的某些圆覆盖了他的圆弧上的某一段,即若干个区间。那么所有的圆覆盖的部分也是若干个区间。如果有k个区间被覆盖了,也就会有k个区间没有被覆盖。这2k个区间被2k个点分开。 图中黑色部分是被覆盖的部分,即“看不见的”,而绿色部分是为覆盖的部分,即“露在外面的”,所以在计算弓形的面积时,绿色部分所围成的弓形一定会计算在总面积中间。所以我们用若干有向弦把这些部分分开,有向是指:沿圆的逆时针方向,如图5的右边所示。 对所有的圆都这样处理了以后,只看这些连线,有什么发现?不难发现任意一个分割点一定会有两条连线!一条连线连进来,一条连出去。并且也只会有两条连线。这个试着画就可以了,例如如果3个圆经过通过同一个点,那么其中一定有一个圆,这个点的两边的弧都被覆盖了,即这个点不是这个圆的分割点! 如果任意一个分割点都会有两条连线,那么,这些连线之间形成了若干多边形。这些多边形就是我们要求的多边形的面积。但是,这些多边形中有的面积是负的,这个只需要看这个多边形的连线是顺时针的还是逆时针的,顺的为正,逆的为负。 用一个例子来说明这个算法。 然后再把一个被完全包含的圆和一个孤立的圆特殊处理删掉后,就变成了右边的图。注意还有一个圆它没有被任意一个圆完全包围,但是它却没有圆弧露在外面。 算法就

文档评论(0)

snj01 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档