算法训练 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;所扮演的角色…

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

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

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余幅亚…

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

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

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

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

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

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

Java毕业设计——springboot+vue电影院会员管理系统

1&#xff0c;项目背景 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个B/S结构的电影院会员管理系统&#xff1b;电影院会员管理系统的管理工作系统化、规范化&#xff0c;也会提高影院形象…

idea创建maven web项目

创建maven web项目 1&#xff1a;首先打开idea&#xff0c;点击“create new project“&#xff0c;在左边一栏找到maven&#xff0c;右边把“create from archetype“钩上&#xff0c;根据模版来创建项目&#xff0c; 注意在选择模版的时候一定要选择org.apache.maven.archety…

世界一流大学观察报告:斯坦福大学何以后来居上?

斯坦福大学(Stanford University)本文转自 管理学季刊 公众号文|石毓智&#xff0c;斯坦福大学博士、新加坡国立大学终身教职只有短短120年历史的斯坦福大学&#xff0c;已有近30人获得诺奖&#xff0c;不要说世界上其他大学难以匹敌&#xff0c;就是拿国家来比&#xff0c;能超…

PowerShell(PHPStorm terminal with PowerShell)运行git log中文乱码

解决方案&#xff1a; 1&#xff09;以管理员身份运行PowerShell 2&#xff09;新建一个针对PowerShell的Pofile文件 New-Item -Path $Profile -ItemType file -Force3&#xff09;用记事本打开这个文件 notepad $Profile4&#xff09;然后输入并保存退出 $env:LC_ALLC.UTF-85&…

机器学习研究者必知的八个神经网络架构

本文转自计算机视觉研究院本文简述了机器学习核心结构的历史发展&#xff0c;并总结了研究者需要熟知的 8 个神经网络架构。我们为什么需要「机器学习」&#xff1f;机器学习对于那些我们直接编程太过复杂的任务来说是必需的。有些任务很复杂&#xff0c;以至于人类不可能解决任…

php伪静态失败,php伪静态后html不能访问怎么办

php伪静态后html不能访问的解决办法&#xff1a;首先判断文件是否存在&#xff1b;然后设置存在则不rewirte&#xff0c;不存在且符合规则才rewrite&#xff1b;最后修改htaccess文件即可。具体问题&#xff1a;PHP伪静态后不能访问纯html文件.htaccess文件RewriteEngine onRew…

LR-IE录制设置

ie浏览器去掉启用第三方浏览器扩展&#xff0c;路径。 ie浏览器-工具-internet选项-高级&#xff0c;在列表中找到“启用第三方浏览器扩展” 把钩去掉 。 启动loadrunner11&#xff0c;按键盘F4&#xff0c;在browser Emulation点击change&#xff0c;在弹出的提示框中Browser …

芯片的未来,靠这些技术了

来源&#xff1a;内容来自「technews」&#xff0c;谢谢。除了先进制程之外&#xff0c;先进封装也成为延续摩尔定律的关键技术&#xff0c;像是2.5D、3D 和Chiplets 等技术在近年来成为半导体产业的热门议题。究竟&#xff0c;先进封装是如何在延续摩尔定律上扮演关键角色&…

php 判断不是文件类型,php 判断文件类型

[php]代码库$files array (c:\1.jpg,c:\1.png,c:\1.gif,c:\1.rar,c:\1.zip,c:\1.exe,);foreach ( $files AS $file ){$fp fopen ( $file, "rb" );$bin fread ( $fp, 2 ); //只读2字节fclose ( $fp );$str_info unpack ( "C2chars", $bin );$type_code …