简单多边形与圆交面积模板
1 /* 2 求多边形与圆相交的面积 3 */ 4 5 #include <iostream> 6 #include <cstdio> 7 #include <cmath> 8 #define max(x,y) ((x)>(y)?(x):(y)) 9 #define min(x,y) ((x)<(y)?(x):(y)) 10 #define PI acos(-1.0) 11 #define EPS 1e-10 12 using namespace std; 13 14 inline int DB(double x) { 15 if(x<-EPS) return -1; 16 if(x>EPS) return 1; 17 return 0; 18 } 19 20 21 struct point { 22 double x,y; 23 24 point() {} 25 point(double _x,double _y):x(_x),y(_y) {} 26 27 point operator-(point a) { 28 return point(x-a.x,y-a.y); 29 } 30 point operator+(point a) { 31 return point(x+a.x,y+a.y); 32 } 33 34 double operator*(point a) { 35 return x*a.y-y*a.x; 36 } 37 38 point oppose() { 39 return point(-x,-y); 40 } 41 42 double length() { 43 return sqrt(x*x+y*y); 44 } 45 46 point adjust(double L) { 47 L/=length(); 48 return point(x*L,y*L); 49 } 50 51 point vertical() { 52 return point(-y,x); 53 } 54 55 double operator^(point a) { 56 return x*a.x+y*a.y; 57 } 58 }; 59 60 61 struct segment { 62 point a,b; 63 64 segment() {} 65 segment(point _a,point _b):a(_a),b(_b) {} 66 67 point intersect(segment s) { 68 double s1=(s.a-a)*(s.b-a); 69 double s2=(s.b-b)*(s.a-b); 70 double t=s1+s2; 71 s1/=t; 72 s2/=t; 73 return point(a.x*s2+b.x*s1,a.y*s2+b.y*s1); 74 } 75 point vertical(point p) { 76 point t=(b-a).vertical(); 77 return intersect(segment(p,p+t)); 78 } 79 int isonsegment(point p) { 80 return DB(min(a.x,b.x)-p.x)<=0&& 81 DB(max(a.x,b.x)-p.x)>=0&& 82 DB(min(a.y,b.y)-p.y)<=0&& 83 DB(max(a.y,b.y)-p.y)>=0; 84 } 85 }; 86 87 struct circle { 88 point p; 89 double R; 90 }; 91 92 circle C; 93 point p[105]; 94 int n; 95 96 97 double cross_area(point a,point b,circle C) { 98 point p=C.p; 99 double R=C.R; 100 int sgn=DB((b-p)*(a-p)); 101 double La=(a-p).length(),Lb=(b-p).length(); 102 int ra=DB(La-R),rb=DB(Lb-R); 103 double ang=acos(((b-p)^(a-p))/(La*Lb)); 104 segment t(a,b); 105 point s; 106 point h,u,temp; 107 double ans,L,d,ang1; 108 109 if(!DB(La)||!DB(Lb)||!sgn) ans=0; 110 else if(ra<=0&&rb<=0) ans=fabs((b-p)*(a-p))/2; 111 else if(ra>=0&&rb>=0) { 112 h=t.vertical(p); 113 L=(h-p).length(); 114 if(!t.isonsegment(h)||DB(L-R)>=0) ans=R*R*(ang/2); 115 else { 116 ans=R*R*(ang/2); 117 ang1=acos(L/R); 118 ans-=R*R*ang1; 119 ans+=R*sin(ang1)*L; 120 } 121 } else { 122 h=t.vertical(p); 123 L=(h-p).length(); 124 s=b-a; 125 d=sqrt(R*R-L*L); 126 s=s.adjust(d); 127 if(t.isonsegment(h+s)) u=h+s; 128 else u=h+s.oppose(); 129 if(ra==1) temp=a,a=b,b=temp; 130 ans=fabs((a-p)*(u-p))/2; 131 ang1=acos(((u-p)^(b-p))/((u-p).length()*(b-p).length())); 132 ans+=R*R*(ang1/2); 133 } 134 return ans*sgn; 135 } 136 137 double cal_cross(circle C,point p[],int n) { 138 double ans=0; 139 int i; 140 p[n]=p[0]; 141 for(i=0; i<n; i++) ans+=cross_area(p[i],p[i+1],C); 142 return fabs(ans); 143 } 144 145 double x,y,v,det,t,g,R; 146 147 int input() { 148 scanf("%lf%lf%lf%lf%lf%lf%lf",&x,&y,&v,&det,&t,&g,&R); 149 return x||y||v||det||t||g||R; 150 } 151 152 153 int main() { 154 //freopen("test.in","r",stdin); 155 while(input()) { 156 scanf("%d",&n); 157 int i; 158 for(i=0; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y); 159 det=det/180*PI; 160 C.R=R; 161 C.p.x=x+v*cos(det)*t; 162 C.p.y=y+v*sin(det)*t-0.5*g*t*t; 163 double area=cal_cross(C,p,n); 164 printf("%.2lf\n",area); 165 } 166 return 0; 167 }
View Code
转自:http://blog.csdn.net/acm_baihuzi/article/details/48473725
多边形面积求法:https://www.cnblogs.com/xiexinxinlove/p/3708147.html
转载于:https://www.cnblogs.com/zmin/p/8329118.html
简单多边形与圆交面积模板相关推荐
- 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...
链接:https://www.nowcoder.com/acm/contest/141/J 来源:牛客网 Eddy has graduated from college. Currently, he ...
- 简单多边形与圆相交求面积
简单多边形与圆相交求面积 简单多边形的有向面积 简单多边形与圆相交的有向面积 圆心三角形与圆相交求面积 简单多边形与圆相交的有向面积 简单多边形的有向面积 所谓简单多边形,就是指不相邻的边不相交,且每 ...
- 计算几何--简单多边形与圆面积交
求解二维空间内一个简单多边形和一个长度为R的圆公共面积. 因为任意简单多边形都可以划分成若干三角形,我们可以把这个简单多边形划分成三角形后,求三角形与圆的面积交,然后在把所有三角形的解合并. 由于可能 ...
- uva 11978 Fukushima Nuclear Blast (二分+多边形与圆交)
二分+多边形与圆交就可以了 1 //#include<bits/stdc++.h> 2 #include<iostream> 3 #include<cstdio> ...
- html语言计算圆周长和面积,纯JSP实现计算圆的面积和周长
一个jsp页面由元素和模板数据组成.元素是必须由jsp容器处理的部分.而模板数据是jsp容器不处理的部分,如jsp中的HTML内容 元素有三种类型: 脚本元素,指令元素, 动作元素 脚本元素:包含三个 ...
- java jsp面积怎么算_纯JSP实现计算圆的面积和周长
一个jsp页面由元素和模板数据组成.元素是必须由jsp容器处理的部分.而模板数据是jsp容器不处理的部分,如jsp中的HTML内容 元素有三种类型: 脚本元素,指令元素, 动作元素 脚本元素:包含三个 ...
- YTU 2723: 默认参数--求圆的面积
2723: 默认参数--求圆的面积 时间限制: 1 Sec 内存限制: 128 MB 提交: 206 解决: 150 题目描述 根据半径r求圆的面积, 如果不指定小数位数,输出结果默认保留两位小数 ...
- #圆的周长和面积面向对象_数学实验 | 圆的面积公式推导
设计者 尤冰 谢凤梨 常州市武进区星辰实验学校 常州市教坛新秀 武进区学科带头人 __ 实验视频 圆的面积公式推导 __ 实验目的 通过实验的方式,将16等分圆转化成近似的长方形.梯形和三角形 ...
- 两条曲线所围成的面积_人教版数学六年级上册 5.3:圆的面积(一) 微课视频|知识点|课件解析|同步练习...
[教学微课堂] [知识点] 一.圆的认识 1.日常生活中的圆 2.画图.感知圆的基本特征 (1)实物画图 (2)系绳画图 3.对比,感知圆的特征:我们以前学过的长方形.正方形.平行四边形.梯形.三角形 ...
最新文章
- leetcode 342. Power of Four
- 腾讯 tars java_腾讯TARS开源团队郑苏波:腾讯微服务开发框架的源码剖析
- 进程间内存共享问题[转]
- IEEP-网络实施-项目交付流程
- 分享20个Android游戏源码,…
- 概率练习 (16.04.30)
- 记一次 ERROR scheduler.AsyncEventQueue: Dropping event from queue shared导致OOM
- 组建计算机网络的硬件设备,计算机网络的硬件组成中包含了哪些硬件设备
- 小红书话题笔记是什么意思?小红书话题的形式有哪些?
- 变量存储重温及在Ubuntu系统和Keil中编程验证
- VGA RGBHV 时序图
- 2023年2月东莞/惠州/深圳CPDA数据分析师认证招生简章
- 用顺序表实现学生信息管理系统
- 函数 内置函数 动态数组 字符
- python 年会抽奖小程序
- [ 题解 ] [ 逆推 ] A. Taming the Herd
- Web程序设计——基本操作
- 路面检测的多尺度网络结构论文笔记
- google浏览器打开黑屏,无法显示的办法,怀疑是显卡问题,解决办法如下!
- 【网盘】开启移动云计算时代,5大策略发展移动云计算