Uva 10652 Board Wrapping(计算几何之凸包+点旋转)
题目大意:给出平面上许多矩形的中心点和倾斜角度,计算这些矩形面积占这个矩形点形成的最大凸包的面积比。
算法:GRAHAM,ANDREW。
题目非常的简单,就是裸的凸包 + 点旋转。这题自己不会的地方就是点旋转,另外,Andrew 算法还没有调试出来 。有一个非常细节的地方:给出的矩形有N个,但是点有4*N个。
直接上代码:GRAHAM
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath> using namespace std; int N,pc,top;
double Tot_s = ,area = ; struct data{
double x,y; data(double x=,double y=):x(x),y(y) {}
};
data pt[],st[];
double cross(data a,data b,data td){
return (a.x-td.x)*(b.y-td.y) - (a.y-td.y)*(b.x-td.x);
}
double dis(data a,data b){
return sqrt(pow(a.x-b.x,)+pow(a.y-b.y,));
}
bool cmp(data a,data b){
if(cross(a,b,pt[]) == )
return dis(a,pt[]) < dis(b,pt[]);
return cross(a,b,pt[]) > ;
}
data Rotate(data a,double rad){
return data(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
}
data operator + (data a,data b){
return data(a.x+b.x,a.y+b.y);
}
double torad(double deg){
return deg/*acos(-);//acos(-1) = PI
}
void Graham(){
int k = ;data tp;
top = ;
for(int i = ;i < *N;++ i)
if(pt[k].x>pt[i].x || (pt[k].x==pt[i].x&&pt[k].y>pt[i].y))
k = i;
tp = pt[k];pt[k] = pt[];pt[] = tp;
sort(pt+,pt+*N,cmp);
st[] = pt[];st[] = pt[];st[] = pt[];
for(int i = ;i < *N;++ i){
while(top && cross(pt[i],st[top],st[top-]) >= )
top --;
st[++ top] = pt[i];
}
st[++ top] = pt[];
for(int i = ;i < top;++ i)
Tot_s += cross(st[],st[i],st[i+]);
Tot_s /= ;
}
void init(){
scanf("%d",&N);
for(int i = ;i < N;++ i){
double x,y,w,h,j,ang; scanf("%lf%lf%lf%lf%lf",&x,&y,&w,&h,&j); data cen(x,y);
ang = -torad(j);
pt[pc ++] = cen + Rotate(data(-w/,-h/),ang);
pt[pc ++] = cen + Rotate(data(w/,h/),ang);
pt[pc ++] = cen + Rotate(data(-w/,h/),ang);
pt[pc ++] = cen + Rotate(data(w/,-h/),ang);
area += w*h;
}
Graham();
pc = ; } int main(){
int tcase;
scanf("%d",&tcase);
while(tcase --){
init();
printf("%.1lf ",area*/Tot_s);
cout << "%" << endl;
area = ;Tot_s = ;
} return ;
}
Uva 10652 Board Wrapping(计算几何之凸包+点旋转)的更多相关文章
- UVA 10652 Board Wrapping 计算几何
多边形凸包.. .. Board Wrapping Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu ...
- UVA 10652 Board Wrapping(二维凸包)
传送门 刘汝佳<算法竞赛入门经典>P272例题6包装木板 题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们抱起来,并计算出木板占整个包装面积的百分比. 输入:t组数据,每组 ...
- uva 10652 Board Wrapping (计算几何-凸包)
Problem B Board Wrapping Input: standard input Output: standard output Time Limit: 2 seconds The sma ...
- UVA 10652 Board Wrapping(凸包)
The small sawmill in Mission, British Columbia, hasdeveloped a brand new way of packaging boards for ...
- 简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping
题目传送门 题意:告诉若干个矩形的信息,问他们在凸多边形中所占的面积比例 分析:训练指南P272,矩形面积长*宽,只要计算出所有的点,用凸包后再求多边形面积.已知矩形的中心,向量在原点参考点再旋转,角 ...
- UVA 10652 Board Wrapping(凸包)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32286 [思路] 凸包 根据角度与中心点求出长方形所有点来,然后就 ...
- ●UVA 10652 Board Wrapping
题链: https://vjudge.net/problem/UVA-10652 题解: 计算几何,Andrew求凸包, 裸题...(数组开小了,还整了半天...) 代码: #include<c ...
- uva 10652 Board Wrapping
主要是凸包的应用: #include <cstdio> #include <cmath> #include <cstring> #include <algor ...
- 【UVA10652】Board Wrapping(求凸包面积)
点此看题面 大致题意: 告诉你若干个矩形的重心坐标.长.宽和相对\(y\)轴的偏转角度,求矩形面积和与能围住这些矩形的最小凸包面积之比. 矩形面积和 这应该是比较好求的吧. 已经给了你长和宽,直接乘起 ...
随机推荐
- 对list代理扩展功能
package 动态代理扩展List; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; imp ...
- iOS archive(归档)的总结
http://www.cnblogs.com/ios8/p/ios-archive.html
- “有箭头的视图”,即程序的Storyboard Entry Point。
设置方法很简单:打开StoryBoard文件,选中要设置为第一视图的ViewController,在右边工具栏勾选Is Initial View Controller就好了,此时你会看到ViewCon ...
- vs2010中出现:程序管理器匹配不正确错误
http://bbs.csdn.net/topics/360074795 这是一篇csdn上的讨论帖,第15楼给出了正解
- 把EXCEL列号数字变成字母
把Excel 列号数字变成字母 private static string ToName(int index) { if (index < 0) { throw new Exception(&q ...
- ecos编译redboot,vmware运行redboot,执行hello world(图形配置)
1- 下载源文件 :~/ecos$ ls -lrt total 80 drwxr-xr-x 7 XXXX XXXX 4096 Mar 27 2009 ecos-3.0 -rw-r--r-- 1 X ...
- Eloquent ORM 学习笔记
最近在学习Laravel,觉得ORM功能很强大,我这里只是简单探索了一点,如果有更好的笔记,还请分享. 因为重点在于Eloquent ORM,所以路由设置,控制器就不详细描述了,这里直接进入Model ...
- HTML+CSS学习
1.彻底弄懂CSS盒子模式(DIV布局快速入门) 2.在CSS中,BOX的Padding属性的数值赋予顺序为padding:10px; 四个内边距都是10px padding:5px 10px; 上下 ...
- linux中如何使用微软鼠标的第4、5键
虽说使用linux的 人大都对微软没什么好感,但不能否认微软确实也出了不少好东西呀,比如微软鼠标(IE系列) icon_smile.gif IE 2.0和以上版本都有5个按钮,除了正常的左中右外,两侧 ...
- perl HTML::TreeBuilder::XPath
HTML::TreeBuilder::XPath 添加XPath 支持HTML::TreeBuilder use HTML::TreeBuilder::XPath; my $tree= HTML: ...