计算几何-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 ...
随机推荐
- jupyter CSS
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- go语言 base58编码解码
package main import ( "bytes" "encoding/hex" "fmt" "math/big" ...
- window.location.herf传值问题
各个值之间用&&&&&&连接 新版本的tomcat不支持其他字符,需要通过encodeURIComponent编码 变量名数字后不能直接加字母 such ...
- 微信小程序中如何上传图片
本篇文章给大家带来的内容是关于微信小程序中如何上传图片(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.wxml文件 <text>上传图片</text ...
- 阿里云部署JeecgBoot
阿里云部署JeecgBoot 首先贴出官网教程:http://jeecg-boot.mydoc.io/?t=345682 自己在部署的时候遇到了各种各样的问题,其实一步一步的按照官网给出的步骤来是没问 ...
- 机器学习作业(四)神经网络参数的拟合——Python(numpy)实现
题目下载[传送门] 题目简述:识别图片中的数字,训练该模型,求参数θ. 出现了一个问题:虽然训练的模型能够有很好的预测准确率,但是使用minimize函数时候始终无法成功,无论设计的迭代次数有多大,如 ...
- [HAOI2011] 向量 - 裴蜀定理
给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y) ...
- PHP实现推送微信小程序模板消息
这边只会写如何实现,至于在公众号管理后台添加模板消息可以参考这篇文章: https://www.cnblogs.com/txw1958/p/wechat-template-message.html,当 ...
- Linux C/C++ 字符串逆序
/*字符串逆序*/ #include <stdio.h> #include <string.h> void nixu(char *str) { ; char tmp; for( ...
- tp3.2框架关闭日志记录
在config.php中阿计入如下配置: 'LOG_RECORD' => false, // 默认不记录日志 'LOG_TYPE' => 'File', // 日志记录类型 默认为文件方式 ...