算法训练 Pollution Solution(计算几何)

问题描述
作为水污染管理部门的一名雇员,你需要监控那些被有意无意倒入河流、湖泊和海洋的污染物。你的其中一项工作就是估计污染物对不同的水生态系统(珊瑚礁、产卵地等等)造成的影响。


  你计算所使用的模型已经在图1中被说明。海岸线(图1中的水平直线)为x轴,污染源位于原点(0, 0)。污染的蔓延呈半圆形,多边形代表了被波及的生态系统。你需要计算出生态系统被污染的面积,也就是图中深蓝色部分。
输入格式
输入文件包含仅包含一组测试数据。
  每组测试数据第一行为两个整数n (3 <= n <= 100), r (1 <= r <= 1000),n表示了多边形的顶点个数,r表示了污染区域的半径;
  接下来n行,每行包含两个整数xi (-1500 <= xi <= 1500), yi (0 <= yi <=1500),表示每个顶点的坐标,以逆时针顺序给出;
  数据保证多边形不自交或触及自身,没有顶点会位于圆弧上。
输出格式
输出多边形被圆心位于原点、半径为r的半圆覆盖的面积。
  答案的绝对误差不得超过10^-3。
样例输入
6 10
-8 2
8 2
8 14
0 14
0 6
-8 14
样例输出
101.576437872
数据规模和约定
存在约30%的数据,n = 3,r <= 20;
  存在另外约30%的数据,n <= 10,r <= 100,坐标范围不超过100;
  存在另外约10%的数据,n <= 100,r <= 150,坐标范围不超过250;
  存在另外约30%的数据,n <= 100,r <= 1000,数据存在梯度;
  对于100%的数据,满足题目所示数据范围。

 

题解

#include<iostream>
#include<math.h>
#include<cstdio>
#include<algorithm>
#include<string>
#include<queue>
#include<cctype>
#include<cstring>
#include<map>
using namespace std;
const int N=1e2+5;
const int M=N/2;int n,r; 
int X[N],Y[N];struct P{double x,y;double getlength(){return sqrt(x*x+y*y);}bool incircle(){return x*x+y*y<=r*r;}double cross(P &b){return x*b.y-y*b.x;}
};
double getArea(P &a,P &b){double degree=a.cross(b)/a.getlength()/b.getlength();if(degree<-1)degree=-1;if(degree>1)degree=1;degree=asin(degree);return r*r*degree/2;
}
double cal(P &a,P &b){bool in1 = a.incircle();bool in2 = b.incircle();if(in1&&in2){return a.cross(b)/2;}else if(in1!=in2){P l=a;P r=b;P mid;for(int i=0;i<40;i++){mid=P{(l.x+r.x)/2,(l.y+r.y)/2};if(mid.incircle()==in1){l=mid;}else{r=mid;}}if(in1){return a.cross(mid)/2+getArea(mid,b);}else{return getArea(a,mid)+mid.cross(b)/2;}}else{P l=a;P r=b;P mid;P midr;for(int i=0;i<40;i++){mid=P{(l.x+r.x)/2,(l.y+r.y)/2};midr=P{(l.x+r.x)/2+(r.x-l.x)*0.0001,(l.y+r.y)/2+(r.y-l.y)*0.0001};if(mid.getlength()<midr.getlength()){r=mid;}else{l=mid;}}if(mid.incircle()){return cal(a,mid)+cal(mid,b);}else{return getArea(a,b);}}
}int main() {cin>>n>>r;for(int i=0;i<n;i++){cin>>X[i]>>Y[i];}X[n]=X[0];Y[n]=Y[0];double ans=0;for(int i=0;i<n;i++){P a=P{X[i],Y[i]};P b=P{X[i+1],Y[i+1]};ans+=cal(a,b);}printf("%lf\n",ans);return 0;
}

  

看不懂系列》》》》

借助这道题补一下计算几何中的部分知识

1.容斥定理:要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分。

2.四色定理:四色问题的内容是“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”也就是说在不引起混淆的情况下一张地图只需四种颜色来标记就行。

3.点积:

点:A(x1,y1),B(x2,y2) 向量:向量AB=( x2 - x1 , y2 - y1 )= ( x , y );

向量的模 |AB| = sqrt ( x*x+y*y );

向量的点积: 结果为 x1*x2 + y1*y2。 点积的结果是一个数值。

点积的集合意义:我们以向量 a 向向量 b 做垂线,则 | a | * cos(a,b)为 a 在向量 b 上的投影,即点积是一个向量在另一个向量上的投影乘以另一个向量。且满足交换律

应用:可以根据集合意义求两向量的夹角, cos(a,b) =( 向量a * 向量b ) / (| a | * | b |) = x1*x2 + y1*y2 / (| a | * | b |)

4.叉积:

向量的叉积: 结果为 x1*y2-x2*y1 叉积的结果也是一个向量,是垂直于向量a,b所形成的平面,如果看成三维坐标的话是在 z 轴上,上面结果是它的模。

方向判定:右手定则,(右手半握,大拇指垂直向上,四指右向量a握向b,大拇指的方向就是叉积的方向)

叉积的集合意义: 1:其结果是a和b为相邻边形成平行四边形的面积。 2:结果有正有负,有sin(a,b)可知和其夹角有关,夹角大于180°为负值。 3:叉积不满足交换律

应用: (1:通过结果的正负判断两矢量之间的顺逆时针关系 若 a x b > 0表示a在b的顺时针方向上 若 a x b < 0表示a在b的逆时针方向上 若 a x b == 0表示a在b共线,但不确定方向是否相同

(2:判断折线拐向,可转化为判断第三点在前两的形成直线的顺逆时针方向,然后判断拐向。

(3:判断一个点在一条直线的那一侧,同样上面的方法。

(4:判断点是否在线段上,可利用叉乘首先判断是否共线,然后在判断是否在其上。

(5:判断两条直线是否想交(跨立实验) 根据判断点在直线那一侧我们可以判断一个线段的上的两点分别在另一个线段的两侧,当然这是不够的,因为我们画图发现这样只能够让直线想交,而不是线段,所以我们还要对另一条线段也进行相同的判断就ok。

5.凸包:graham扫描法

6.皮克公式:(计算多边形的面积)

S = 1/2×( ( X1*Y2-X2*Y1 ) + … + ( Xk*Yk+1-Xk+1*Yk ) + ... + ( Xn*Y1-X1*Yn ) )

需要注意的是,如果一系列点按逆时针排列算出的是正面积,而如果是顺时针的话算出的则是一个负面积。

 

转载于:https://www.cnblogs.com/ruruozhenhao/p/8419734.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MEMS传感器前景光明,国内产业如何创新破局

来源&#xff1a;MEMS当前&#xff0c;在行业技术不断发展和成熟的加持下&#xff0c;物联网已经成为世界新一轮科技革命和产业变革的重要驱动力。顺应着万物互联时代的到来&#xff0c;作为物联网先行技术、感知层的代表——传感器的市场需求急剧攀升&#xff0c;所扮演的角色…

python3层装饰器_python三层装饰器python字符串,数值计算

Python是一种面向对象的语言&#xff0c;但它不像C一样把标准类都封装到库中&#xff0c;而是进行了进一步的封装&#xff0c;语言本身就集成一些类和函数&#xff0c;比如print&#xff0c;list&#xff0c;dict etc. 给编程带来很大的便捷Python 使用#进行单行注释&#xff0…

2.6 线程优先级

package 第二章.线程优先级;/** * Created by zzq on 2018/1/18. */public class 线程优先级 { public static class T1 extends Thread{ Override public void run() { System.out.println("-------"); } } public static…

清华大学教授:唐杰——深度分析:人工智能的下个十年

来源&#xff1a;图灵人工智能唐杰教授从人工智能发展的历史开始&#xff0c;深入分析人工智能近十年的发展&#xff0c;阐述了人工智能在感知方面取得的重要成果&#xff0c;尤其提到算法是这个感知时代最重要、最具代表性的内容。重点讲解了 BERT、ALBERT、MoCo2 等取得快速进…

java去掉mongodb日志_MongoDB日志文件过大的解决方法 清理

MongoDB日志文件过大的解决方法2016年05月09日 14:43:11 jjwen 阅读数 1261MongoDB的日志文件在设置 logappendtrue 的情况下&#xff0c;会不断向同一日志文件追加的&#xff0c;时间长了&#xff0c;自然变得非常大。解决如下&#xff1a;(特别注意&#xff1a;启动的时候必须…

Solr 访问 403 错误

把 Solr 基础环境搭建好后访问发现会出现 403 错误&#xff1a; 解决方法&#xff1a; 找到自己 Tomcat 目录下的 solr &#xff0c;找到 ...\solr\WEB-INF\web.xml&#xff0c;然后把 169 - 183行注释&#xff0c;然后重启服务再次访问就 OK 啦。 访问成功界面&#xff1a; 转…

java数组的四个要素_Java零基础系列教程04Java数组

配套视频教程问题Java考试结束后&#xff0c;老师给张浩分配了一项任务&#xff0c;让他计算全班(30人)的平均分int stu1 95;int stu2 89;int stu3 79;int stu4 64;int stu5 76;int stu6 88;……avg (stu1stu2stu3stu4stu5…stu30)/30;数组数组是一个变量&#xff0c;存…

多页面webpack配置

工程结构如下 dev-serverconst config require(../config); const express require(express); const path require(path); const fs require(fs); // const faviconrequire(serve-favicon); const exec require(child_process).exec; process.env.NODE_ENV config.dev.e…

深度 | 量子计算技术的研究现状与未来

来源&#xff1a;本源量子导读1900年 Max Planck 提出“量子”概念&#xff0c;宣告了“量子”时代的诞生。科学家发现&#xff0c;微观粒子有着与宏观世界的物理客体完全不同的特性。宏观世界的物理客体&#xff0c;要么是粒子&#xff0c;要么是波动&#xff0c;它们遵从经典…

exsist什么意思_exist什么意思_通达信EXIST什么意思

matlab中的exist是什么意思exist用来判断变量或函数是否存在&#xff1a; exist Check if variables or functions are defined.exist(A) returns:0 if A does not exist1 if A is a variable in the workspace2 if A is an M-file on MATLABs search path. It also returns …

拥有“上帝视角”是怎样的体验?高分多模卫星首批影像成果发布

本文转载自“中国的航天”&#xff0c;原标题《拥有“上帝视角”是怎样的体验&#xff1f;高分多模卫星首批影像成果发布》&#xff0c;作者 | 杨璐9月29日&#xff0c;国家航天局发布了高分辨率多模综合成像卫星&#xff08;以下简称“高分多模卫星”&#xff09;首批20余幅亚…

1.2 - 列表练习题

1 1.创建列表2 >>> names [old_driver, rain, jack, shanshan, peiqi, black_girl]3 >>> names4 [old_driver, rain, jack, shanshan, peiqi, black_girl] 5 6 2.插入alex7 >>> names.insert(-1,alex)8 >>> names9 [old_driver, rain, ja…

java 工程ssl配置_HTTPS_SSL配置的步骤以及原理说明

1、单向认证&#xff0c;就是传输的数据加密过了&#xff0c;但是不会校验客户端的来源2、双向认证&#xff0c;如果客户端浏览器没有导入客户端证书&#xff0c;是访问不了web系统的&#xff0c;找不到地址&#xff0c;想要用系统的人没有证书就访问不了系统HTTPS概念方法/步骤…

我们人类与人工智能技术究竟是怎样的关系?

图片来自pixabay.com来源&#xff1a;赛先生撰文 | 爱德华阿什福德李&#xff08;加州大学伯克利分校教授&#xff09;责编 | 李珊珊摘要&#xff1a;数字技术正在和人类文明协同进化。我们依赖技术而生存&#xff0c;技术也依赖我们&#xff0c;这种合作共生的趋势越来越明显。…

Js拼接嵌套php代码,分享一个js文件中嵌套php会出错的问题

前提&#xff1a;使用ThinkPHP。后台传一个变量到html页面&#xff1a;$this->assign("variable", $variable);问题&#xff1a;在html页面中嵌套js代码&#xff0c;在js的代码中输出这个变量&#xff1a;var variable <?php echo $variable;?>;alert(va…

textarea标签内的文字无缘故居中解决原因

<textarea>内容内容</textarea>浏览器会解析为<textarea><br> 内容内容</textarea>可见在写<textarea>时一定要写成<textarea>内容内容</textarea> 必须写成一行&#xff01;转载于:https://www.cnblogs.com/zhaomeizi/p/…

中国工程院院士陈左宁详述:人工智能模型和算法的七大发展趋势

来源&#xff1a;C114通信网在近日举行的“第十六届CCF全过高性能计算学术年会”上&#xff0c;中国工程院副院长、中国科协副主席、中国工程院院士陈左宁发表了题为《人工智能进展对算力需求分析》的演讲。在演讲中&#xff0c;她阐述了人工智能模型和算法的七大发展趋势。陈左…

php date 有warning,PHP Warning: strtotime()错误解决办法

strtotime()函数是php日期函数了&#xff0c;出现这种问题就是我们php.ini中的date.timezone没有设置好&#xff0c;只要配置一下时区即可解决。php5.1.0开始&#xff0c;php.ini里加入了date.timezone这个选项&#xff0c;默认情况下是关闭的。显示的时间都是格林威治标准时间…

数据库备份与还原

window to widows 数据库备份与还原 步骤&#xff1a;1、 D:\postgres\bin>pg_dump -h localhost -U postgres -p 5432 -d demo -f "D:/demo.dmp" 备份数据库 将demo 备份为 demo.dmp 文件&#xff08;要新建 demo2 数据库 因为还原的语句不包含创建数据库操作&a…

量子计算技术的研究现状与趋势

来源&#xff1a;《中国科学》 2020年 第50卷 第9期作者&#xff1a;郭光灿导读&#xff1a;1900年 Max Planck 提出“量子”概念&#xff0c;宣告了“量子”时代的诞生。科学家发现&#xff0c;微观粒子有着与宏观世界的物理客体完全不同的特性。宏观世界的物理客体&#xf…