计算几何-UVa10652
This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.
题意见白书,P272~273
把之前的板子拼起来就可以了
ans=(S(木板)*100/S(凸包))%
板子太长,先贴关键
求面积
db Area(D*R,int n){
db S=0.0;
for(int i=;i<n;i++)S+=Cross(R[i]-R[],R[i+]-R[]);
return S/;
}
int n,cnt=;db S1=0.0;
for(scanf("%d",&n);n--;){
db x,y,w,h,j,a;
scanf("%lf%lf%lf%lf%lf",&x,&y,&w,&h,&j);
D O(x,y);a=-Rad(j);
R[++cnt]=O+Rotate(V(-w/,-h/),a);
R[++cnt]=O+Rotate(V( w/,-h/),a);
R[++cnt]=O+Rotate(V(-w/, h/),a);
R[++cnt]=O+Rotate(V( w/, h/),a);
S1+=w*h;
}
int m=Andrew(R,cnt,A);
db S2=Area(A,m);
printf("%.1lf %%\n",S1*100.0/S2);
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define sqr(x) ((x)*(x))
#define RG register
#define op operator
#define IL inline
#define db double
#define bl bool
#define vo void
IL vo read(int&x){
x=;char c=getchar(),f=;
while(c<''||c>''){if(c=='-')f=;c=getchar();}
while(c>=''&&c<='')x=x*+c-'',c=getchar();
if(f)x=-x;
}
const db pi=acos(-1.0),eps=1e-;
struct D{
db x,y;
D(db x=0.0,db y=0.0):x(x),y(y){}
};
typedef D V;
bl op<(D A,D B){return A.x<B.x||(A.x==B.x&&A.y<B.y);}
V op+(V A,V B){return V(A.x+B.x,A.y+B.y);}
V op-(V A,V B){return V(A.x-B.x,A.y-B.y);}
V op*(V A,db N){return V(A.x*N,A.y*N);}
V op/(V A,db N){return V(A.x/N,A.y/N);} db Ang(db x){return(x*180.0/pi);}
db Rad(db x){return(x*pi/180.0);}
V Rotate(V A,db a){return V(A.x*cos(a)-A.y*sin(a),A.x*sin(a)+A.y*cos(a));}
db Dis(D A,D B){return sqrt(sqr(A.x-B.x)+sqr(A.y-B.y));}
db Cross(V A,V B){return A.x*B.y-A.y*B.x;} db Area(D*R,int n){
db S=0.0;
for(int i=;i<n;i++)S+=Cross(R[i]-R[],R[i+]-R[]);
return S/;
}
db Leng(D*R,int n){
db C=0.0;
for(int i=;i<=n;i++)C+=Dis(R[i],R[i-]);
return C+Dis(R[n],R[]);
} int Andrew(D*R,int n,D*A){
int m=;
sort(R+,R+n+);
for(int i=;i<=n;i++){
while(m>= && Cross(A[m]-A[m-],R[i]-A[m-])<=)m--;
A[++m]=R[i];
}
int k=m;
for(int i=n-;i>=;i--){
while(m>k && Cross(A[m]-A[m-],R[i]-A[m-])<=)m--;
A[++m]=R[i];
}
return n>?m-:m;
} D GO;
bl acomp(D A,D B){
db x=Cross(A-GO,B-GO);
if(x>)return ;if(x<)return ;
return Dis(GO,A)<Dis(GO,B);
} int Graham(D*R,int n,D*A){
for(int i=;i<=n;i++){
if(R[i].y<R[].y)swap(R[i],R[]);
else if(R[i].y==R[].y&&R[i].x<R[].x)swap(R[i],R[]);
}
GO=R[],sort(R+,R+n+,acomp);
int m=;A[++m]=R[],A[++m]=R[];
for(int i=;i<=n;i++)
{
while(m> && Cross(A[m-]-R[i],A[m]-R[i])<=)m--;
A[++m]=R[i];
}
return m;
}
const int maxn=(<<)+;
D R[maxn],A[maxn];
int main(){
int T;
for(scanf("%d",&T);T--;){
int n,cnt=;db S1=0.0;
for(scanf("%d",&n);n--;){
db x,y,w,h,j,a;
scanf("%lf%lf%lf%lf%lf",&x,&y,&w,&h,&j);
D O(x,y);a=-Rad(j);
R[++cnt]=O+Rotate(V(-w/,-h/),a);
R[++cnt]=O+Rotate(V( w/,-h/),a);
R[++cnt]=O+Rotate(V(-w/, h/),a);
R[++cnt]=O+Rotate(V( w/, h/),a);
S1+=w*h;
}
int m=Andrew(R,cnt,A);
db S2=Area(A,m);
printf("%.1lf %%\n",S1*100.0/S2);
}
return ;
}
UVa10652
计算几何-UVa10652的更多相关文章
- ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)
POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- ACM 计算几何中的精度问题(转)
http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...
- hdu 2393:Higher Math(计算几何,水题)
Higher Math Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)
Rescue The Princess Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Several days ago, a b ...
- [知识点]计算几何I——基础知识与多边形面积
// 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxaq.html 1.前言 ...
- POJ 1106 Transmitters(计算几何)
题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...
- TYVJ计算几何
今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基 ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
随机推荐
- Mysql快速入门(二)
多表关联查询 JOIN 按照功能大致分为如下三类: CROSS JOIN(交叉连接) INNER JOIN(内连接或等值连接). OUTER JOIN(外连接) 交叉连接 交叉连接的关键字:CROSS ...
- C++-HDU3400-Line belt[三分]
将军饮马问题的升级版 二维平面中要从A到D,给出两条线段AB,CD,分别在线段AB,CD,以及空白处的速度为P,Q,R 求最少用时 由于最优位置满足“凸性”,且两条线段可以等价,所以可以采取三分答案迭 ...
- python3.6安装lxml库
好像是在python3.5之后,安装了lxml也无法使用etree 为了就解决这个问题使用如下方法: 1.下载lxml的wheel文件,下载地址:https://www.lfd.uci.edu/~go ...
- 【剑指Offer】47、求1+2+3+...+n
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 题解:递归实现/利用Math //利用短路 ...
- DE1_MSEL
基础的一般实验:01001(现在用的)或10010 马上换linux,做个记录: sd卡启动linux系统时,启动开关0至4位拨至00000
- Chrome 提标 您的浏览器限制了第三方Cookie...解决方法
最近升级Chrome后会出现 您的浏览器限制了第三方Cookie,这将影响您正常登录,您可以更改浏览器的隐私设置,解除限制后重试. 解决方法: chrome://flags/ 把这句复制到浏览器回车 ...
- mysql的优化总结
1,允许数据库适当冗余提高查询效率 2,对于索引的使用要适当
- 并查集路径分裂优化 UnionFind PathSpliting(C++)
/* * UnionFind.h * 有两种实现方式,QuickFind和QuickUnion * QuickFind: * 查找O(1) * 合并O(n) * QuickUnion:(建议使用) * ...
- 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture
4 Controller架构 NVMe over Fabrics使用与NVMe基础规格说明书中定义相同的controller架构.这包括主机和controller之间使用SQ提交队列和CQ完成队列来执 ...
- docker使用nginx实现ssl(https)反向代理其他容器应用
安装nginx容器 搜索nginx镜像 docker search nginx 拉取最新版nginx docker pull nginx:latest 运行容器 docker run --name=n ...