总之,圆的面积并是一个非常漂亮的算法,虽然说好像没有很强的扩展性以及实用性,但确实训练自己计算几何代码能力的好题目。

一下皆蒯自栗师《圆的并》解题报告:

试想,如果人来做此题,而不使用计算机计算,那么,人会采取什么样的方法呢?

首先要做一些预处理,如果一个圆完全被另一个圆包围,那么这一个圆可以删除。删除后,如果一个圆是孤立的圆,不与其它任何圆相交,就可以把这个圆的面积现算出来,也将它删去。剩下的工作就是求交点了。

对于一个圆来说,其他的某些圆覆盖了他的圆弧上的某一段,即若干个区间。那么所有的圆覆盖的部分也是若干个区间。如果有k个区间被覆盖了,也就会有k个区间没有被覆盖。这2k个区间被2k个点分开。

我们用若干有向弦把这些部分分开,有向是指:沿圆的逆时针方向,

对所有的圆都这样处理了以后,只看这些连线,有什么发现?不难发现任意一个分割点一定会有两条连线!一条连线连进来,一条连出去。并且也只会有两条连线。这个试着画就可以了,例如如果3个圆经过通过同一个点,那么其中一定有一个圆,这个点的两边的弧都被覆盖了,即这个点不是这个圆的分割点!

如果任意一个分割点都会有两条连线,那么,这些连线之间形成了若干多边形。这些多边形就是我们要求的多边形的面积。但是,这些多边形中有的面积是负的,这个只需要看这个多边形的连线是顺时针的还是逆时针的,顺的为正,逆的为负。

代码相当的短:

program ex3; type real=extended; const e=1e-15; var cr,cx,cy,l,r:array[0..300] of real; cover:array[0..300] of boolean; x1,x2,y1,y2,t1,dx,dy,ans,tmp,dist:real; n,i,j,k,t,tt,ss:longint; procedure swap(var a,b:real);begin tmp:=a;a:=b;b:=tmp end; function eq(a,b:real):boolean;begin eq:=abs(a-b)<e end; function dis(a,b,c,d:real):real; begin dis:=sqrt(sqr(a-c)+sqr(b-d)) end; function ji(x,y:real):real; begin if x<0 then ji:=arctan(y/x)+pi else if y<0 then ji:=arctan(y/x)+pi*2 else ji:=arctan(y/x); end; procedure sort(ll,rr:longint);var i,j:longint; begin i:=ll;j:=rr;t1:=r[(i+j)>>1]; repeat while r[i]<t1-e do inc(i); while r[j]>t1+e do dec(j); if i<=j then begin swap(l[i],l[j]);swap(r[i],r[j]); inc(i);dec(j); end; until i>j; if ll<j then sort(ll,j); if i<rr then sort(i,rr); end; begin assign(input,'circle.in');reset(input); assign(output,'circle.out');rewrite(output); readln(n); for i:=1 to n do readln(cx[i],cy[i],cr[i]); for i:=1 to n do begin t:=0; for j:=1 to n do if (i<>j)and not cover[j] then begin dist:=dis(cx[i],cy[i],cx[j],cy[j]); if dist+cr[i]<cr[j]+e then cover[i]:=true else if dist+cr[j]<cr[i]+e then continue else if dist<cr[i]+cr[j]-e then begin inc(t); r[t]:=ji(cx[j]-cx[i]+e,cy[j]-cy[i]); dx:=(sqr(cr[i])-sqr(cr[j])+sqr(dist))/2/dist; dy:=sqrt(sqr(cr[i])-dx*dx); l[t]:=r[t]+ji(dx+e,dy); r[t]:=r[t]-ji(dx+e,dy); if r[t]<0 then begin r[t]:=r[t]+2*pi; l[t]:=l[t]+2*pi; end; end; end; if (t=0)and not cover[i] then ans:=ans+sqr(cr[i])*pi; if (t=0)or cover[i] then continue; sort(1,t);tt:=0;ss:=1; for j:=1 to t do if (tt=0)or(r[j]>l[tt]+e) then begin inc(tt);l[tt]:=l[j];r[tt]:=r[j]; end else if l[tt]<l[j] then l[tt]:=l[j]; while (ss<=tt)and(l[tt]-2*pi>r[ss]-e) do begin if l[tt]-2*pi<l[ss] then l[tt]:=l[ss]+2*pi; inc(ss); end; for j:=ss to tt do begin if j<>tt then k:=j+1 else k:=ss; dx:=r[k]-l[j]; if dx<0 then dx:=dx+2*pi; ans:=ans+sqr(cr[i])/2*(dx-sin(dx)); x1:=cx[i]+cr[i]*cos(l[j]); y1:=cy[i]+cr[i]*sin(l[j]); x2:=cx[i]+cr[i]*cos(r[k]); y2:=cy[i]+cr[i]*sin(r[k]); ans:=ans+(x1*y2-x2*y1)/2; end; end; writeln(ans:0:6); close(input);close(output); end.

【计算几何】圆的面积并相关推荐

  1. Square Card 计算几何-两圆相交面积

    题意 : 给两个圆,分别代表得分区域和奖励区域,边长为a的正方形以均等概率扔到平面后绕中心旋转,保证一定会有某时刻正方形完全在得分区域内. 如果某时刻正方形完全落在区域内,获得相应分数,求正方形 既获 ...

  2. YTU 2723: 默认参数--求圆的面积

    2723: 默认参数--求圆的面积 时间限制: 1 Sec  内存限制: 128 MB 提交: 206  解决: 150 题目描述 根据半径r求圆的面积, 如果不指定小数位数,输出结果默认保留两位小数 ...

  3. #圆的周长和面积面向对象_数学实验 | 圆的面积公式推导

    设计者 尤冰  谢凤梨 常州市武进区星辰实验学校 常州市教坛新秀 武进区学科带头人 __ 实验视频    圆的面积公式推导 __ 实验目的 通过实验的方式,将16等分圆转化成近似的长方形.梯形和三角形 ...

  4. 两条曲线所围成的面积_人教版数学六年级上册 5.3:圆的面积(一) 微课视频|知识点|课件解析|同步练习...

    [教学微课堂] [知识点] 一.圆的认识 1.日常生活中的圆 2.画图.感知圆的基本特征 (1)实物画图 (2)系绳画图 3.对比,感知圆的特征:我们以前学过的长方形.正方形.平行四边形.梯形.三角形 ...

  5. 【c语言】蓝桥杯入门训练 圆的面积

    [问题描述] 给定圆的半径r,求圆的面积. [输入格式] 输入包含一个整数r,表示圆的半径. [输出格式] 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个 ...

  6. 蓝桥杯:入门训练 圆的面积

    蓝桥杯:入门训练 圆的面积 问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本 ...

  7. Android 求圆的面积

    计算机应用112班  孔秋静 在Android中实现求圆的面积. 在Layout 中添加一个EditText控件并将它的ID设为e1,添加一个TextViw控件并设置它的ID为t1,添加一个Butto ...

  8. 蓝桥杯 入门训练 试题集汇总 【A+B问题、序列求和、圆的面积、Fibonacci数列】

    练习系统 目   录 BEGIN-1 A+B问题 BEGIN-2 序列求和 BEGIN-3 圆的面积 BEGIN-3 Fibonacci数列 BEGIN-1 A+B问题 资源限制 时间限制:1.0s ...

  9. 给定圆的半径r,求圆的面积。

    //编写人:yike //时间:2021/1/25/12:28 //问题描述 //给定圆的半径r,求圆的面积. //输入格式 //输入包含一个整数r,表示圆的半径. //输出格式 //输出一行,包含一 ...

最新文章

  1. 设置IDEA最多同时打开的窗口数量为100
  2. php代码审计工具_【学习笔记】PHP代码审计入门:代码审计实例2
  3. Android 应用程序集成FaceBook 登录及二次封装
  4. 【Flask项目2】python对象分页数据序列化基类(5)
  5. 投资,个人未来的生存之道(任何个人必知)
  6. hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程
  7. Javascript实现重力弹跳拖拽运动效果
  8. JavaScript+HTML 实现贪吃蛇简陋版
  9. 计算机系统结构 网易云课堂,网易大布局教育事业:网易公开课、网易云课堂和MOOC分析...
  10. 《Dreamweaver CS6 完全自学教程》笔记 第一章:网页制作基础知识
  11. Ubuntu18.04 PulseAudio实战
  12. AFD-0654: AFD is not supported on Exadata systems CRS-10001: Errors xxx.ko was not found
  13. BootStrap表格鼠标悬停颜色修改
  14. Python学习记录(一)
  15. 【 facenet-retinaface】快速复现 实现 facenet-retinaface-pytorch 人脸识别 windows上 使用cpu实现
  16. Postman高级应用(5):再也不用注释签名代码了——自动生成签名
  17. 金多多看盘新周期还在路上
  18. 二. 征服C指针:C如何使用内存
  19. 牛视源码。抖音矩阵系统,come here
  20. 最适合新手的python刷题网站_有没有适合新手练习Python的网站(做题类)?

热门文章

  1. python获取网卡的ip子网掩码和网关
  2. [基础论文阅读]QMIX: Monotonic Value Function Factorization for Deep Multi-agent Reinforcement Learning
  3. ros必备知识点3:rosbag话题的重命名与包的播放
  4. 航空摄影测量中yaw,pitch,roll
  5. SAP调整税码税率配置
  6. 【C#】简单二维码制作和打印
  7. Spring Boot自动装配过程解析及简单Demo演示
  8. 22春天津大学《建筑施工》在线作业一
  9. windows中新建任何后缀的文件(包括无后缀名)
  10. asp.net房屋出租系统。 采用的典型的三层架构和mvc相结合的技术