计算几何-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 ...
随机推荐
- cURL error 60: SSL certificate problem: unable to get local issuer certificate 解决方法
微信开发的时,请求接口报错如下: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see ...
- 洛谷p1980 计数问题
题目描述 试计算在区间 111 到 nn n的所有整数中,数字x(0≤x≤9) x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 111到11 11 11中,即在 1,2,3,4,5, ...
- 分析器错误消息: Reference.svcmap:未能加载文件
-------------- 缺少了:System.Web.Razor.dll
- layer.open获取弹出层的input框的值
使用top.$('#txtReason').val();获取值: //不通过 function unAuditData(id) { parent.layer.open({ type: , title: ...
- selenium统计网页加载时间
参考网址: https://blog.csdn.net/thlzjfefe/article/details/99712974 https://blog.csdn.net/weixin_43664254 ...
- 微服务读取不到config配置中心配置信息,Spring Boot无法找到PropertySource:找不到标签Could not locate PropertySource: label not found
服务出现报这个错, o.s.c.c.c.ConfigServicePropertySourceLocator - Could not locate PropertySource: label not ...
- VS 2017 mscorlib.dll 加载元数据时发生严重错误,需要终止调试
VS 2017 mscorlib.dll 加载元数据时发生严重错误,需要终止调试 C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0. ...
- 解决 IDEA 无法提示导入 java.util.Date 的问题
之前有一段时间在使用IDEA的时候,发现通过快捷键Alt + Enter导入并没有提示有java.util.Date的包,仅仅只有java.sql.Date的包.于是每次使用都需要通过手写import ...
- 一键安装各个版本boost库(无需编译)
1.NuGet 最简单的,用VS自带的NuGet包管理器安装,一般比较常用的上面都有 2.下载exe安装包 在这里https://sourceforge.net/projects/boost/file ...
- Python_装饰器函数
楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一个函数,就交给其他开发用了. def func1(): print('in func1') 季度末,公司的领导要给大家发绩 ...