【UVA10652】Board Wrapping(求凸包面积)
大致题意: 告诉你若干个矩形的重心坐标、长、宽和相对\(y\)轴的偏转角度,求矩形面积和与能围住这些矩形的最小凸包面积之比。
矩形面积和
这应该是比较好求的吧。
已经给了你长和宽,直接乘起来累加即可。
最小凸包面积
这道题关键还是在于求凸包面积。
首先,我们要注意将题目中给出的角度转换成弧度,还要记得取相反数,不然调死你。
这段代码可以与旋转函数放在一起:
inline Point Rotate(Vector A,double deg)
{
register double rad=deg*acos(-1)/180;dcmp(rad)<0&&(rad+=2*acos(-1)),rad=-rad;//将角度转换成弧度,并取相反数
return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));//返回旋转后的点的坐标
}
则我们就可以很方便地求出每个矩形四个顶点的坐标了。
枚举四个方向,分别将对应的向量(\(±\frac{s1}2\),\(±\frac{s2}2\))进行旋转,然后加上原先点的坐标即可(\(s1,s2\)分别为长和宽)。
这段代码如下:
A=Point(x,y),
P.p[++P.n]=A+Rotate(Point(s1/2,s2/2),deg),
P.p[++P.n]=A+Rotate(Point(s1/2,-s2/2),deg),
P.p[++P.n]=A+Rotate(Point(-s1/2,s2/2),deg),
P.p[++P.n]=A+Rotate(Point(-s1/2,-s2/2),deg);
这样,我们就可以得到\(4n\)个点,然后将这些点求一个凸包,然后作出凸包面积即可。
这段过程比较板子,可以参考这篇博客:初学计算几何(四)——初识凸包。
具体实现详见代码吧。
代码
#include<bits/stdc++.h>
#define N 600
using namespace std;
int n;
namespace ComputationGeometry
{
#define eps 1e-10
inline int dcmp(double x) {return fabs(x)<eps?0:(x>0?1:-1);}
struct Point
{
double x,y;
Point(double nx=0,double ny=0):x(nx),y(ny){}
};
typedef Point Vector;
inline Vector operator + (Point A,Point B) {return Vector(A.x+B.x,A.y+B.y);}
inline Vector operator - (Point A,Point B) {return Vector(A.x-B.x,A.y-B.y);}
inline Vector operator * (Vector A,double x) {return Vector(A.x*x,A.y*x);}
inline Vector operator / (Vector A,double x) {return Vector(A.x/x,A.y/x);}
inline bool operator < (Vector A,Vector B) {return fabs(A.x-B.x)>eps?A.x<B.x:A.y<B.y;}
inline double Cro(Vector A,Vector B) {return A.x*B.y-A.y*B.x;}
inline Point Rotate(Vector A,double deg)//旋转
{
register double rad=deg*acos(-1)/180;dcmp(rad)<0&&(rad+=2*acos(-1)),rad=-rad;
return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}
struct Polygon
{
int n;Point p[(N<<2)+5];
Polygon() {n=0;}
};
typedef Polygon ConvexHull;
inline double PolygonArea(Polygon P)//求多边形(凸包)面积
{
register int i;register double res=0;
for(i=2;i<P.n;++i) res+=Cro(P.p[i]-P.p[1],P.p[i+1]-P.p[1])/2;
return res;
}
inline ConvexHull GetConvexHull(Polygon P)//求凸包
{
register int i,t;register Polygon S=P;register ConvexHull res;
for(sort(S.p+1,S.p+S.n+1),i=1;i<=S.n;++i)
{
while(res.n>1&&dcmp(Cro(res.p[res.n]-res.p[res.n-1],S.p[i]-res.p[res.n-1]))<=0) --res.n;
res.p[++res.n]=S.p[i];
}
for(t=res.n,i=S.n-1;i;--i)
{
while(res.n>t&&dcmp(Cro(res.p[res.n]-res.p[res.n-1],S.p[i]-res.p[res.n-1]))<=0) --res.n;
res.p[++res.n]=S.p[i];
}
return res;
}
};
using namespace ComputationGeometry;
int main()
{
register int test_tot,i;register double x,y,s1,s2,deg,sum;register Point A;register Polygon P;register ConvexHull H;scanf("%d",&test_tot);
while(test_tot--)
{
for(scanf("%d",&n),P.n=sum=0,i=1;i<=n;++i)
{
scanf("%lf%lf%lf%lf%lf",&x,&y,&s1,&s2,°),A=Point(x,y),sum+=s1*s2,//同时统计矩形面积和
P.p[++P.n]=A+Rotate(Point(s1/2,s2/2),deg),P.p[++P.n]=A+Rotate(Point(s1/2,-s2/2),deg),P.p[++P.n]=A+Rotate(Point(-s1/2,s2/2),deg),P.p[++P.n]=A+Rotate(Point(-s1/2,-s2/2),deg);//存储点
}
printf("%.1lf %%\n",100*sum/PolygonArea(GetConvexHull(P)));//计算答案
}
return 0;
}
【UVA10652】Board Wrapping(求凸包面积)的更多相关文章
- poj 3348:Cows(计算几何,求凸包面积)
Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6199 Accepted: 2822 Description ...
- poj3348(求凸包面积)
题目链接:https://vjudge.net/problem/POJ-3348 题意:转换题意后即是求凸包的面积. 思路: 套模板,求凸包面积即转换为多个三角形面积之和,用叉积求,然后除2,因为本题 ...
- poj 3348 Cows 求凸包面积
题目链接 大意: 求凸包的面积. #include <iostream> #include <vector> #include <cstdio> #include ...
- uva109求凸包面积,判断点是不是在凸包内
自己想了一个方法判断点是不是在凸包内,先求出凸包面积,在求由点与凸包上每两个点之间的面积(点已经排好序了),如果两者相等,则点在凸包内,否则不在(时间复杂度可能有点高)但是这题能过 #include& ...
- UVA 10652 Board Wrapping(凸包)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32286 [思路] 凸包 根据角度与中心点求出长方形所有点来,然后就 ...
- UVA10652 Board Wrapping
题意 PDF 分析 就是一个裸的凸包. 如何确定点?就用中心向四边连垂直的向量然后旋转,加上中心点,即可得出旋转后的点. 时间复杂度\(O(T n \log n)\) 代码 #include<i ...
- POJ 3348 - Cows 凸包面积
求凸包面积.求结果后不用加绝对值,这是BBS()排序决定的. //Ps 熟练了template <class T>之后用起来真心方便= = //POJ 3348 //凸包面积 //1A 2 ...
- poj3348凸包面积
用叉积求凸包面积 如图所示,每次找p[0]来计算,(叉积是以两个向量构成的平行四边形的面积,所以要/2) #include<map> #include<set> #includ ...
- (模板)poj1113(graham扫描法求凸包)
题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是kuangbin的. AC code ...
随机推荐
- 关于写PPT
如果你要给别人讲东西,要记得你的受众的不同,你的讲法也应该有不同,侧重点应该有所区别. 如果作为一个老师,你的PPT应该是让人看懂,把人讲懂,这是你的最终目的所在.如果你是一个毕业生,你要围绕你要解决 ...
- jmeter - 函数:Random 随机函数的使用
场景:在做接口测试时,比如说要求用户的手机号码不允许重复,那此时可以通过Random 随机函数来解决此问题: 1.在JMeter 工具中,选择{选项-函数助手对话框-} 函数助手中选择 Random ...
- Java基础--常用API--java.lang.Object
一.简述 1.Object类是所有类的父类,即直接或间接的继承java.lang.Object类.省略了extends Object. 2.方法 (1)protected native Object ...
- SP375 QTREE - Query on a tree
题意大意 给定\(n\)个点的树,边按输入顺序编号为\(1,2,...n-1\),要求作以下操作: CHANGE \(i\) \(t_i\) 将第\(i\)条边权值改为\(t_i\),QUERY \( ...
- Python之PIP安装
Python有两个著名的包管理工具easy_install.py和pip.Python2.7的安装包中自带了easy_install.py,而pip需要手动安装.而在Python3.5之后都是默认安装 ...
- TFS如何强制撤销别人的机器签出的文件
原文:http://blog.csdn.net/jxian2009/article/details/50331955 用过TFS的都知道,没有比同事离职了,剩下一堆签出的文件更蛋疼的. 试过各种方法, ...
- 华东交通大学2017年ACM“双基”程序设计竞赛 1008
Problem Description 长度为 n 的序列,把它划分成两段非空的子序列,定义权值为:两段子序列的最大值的差的绝对值.求可能的最大的权值.数据范围:2 <= n <= 10^ ...
- Django基础(1)
昨日内容回顾: 1. socket创建服务器 2. http协议: 请求协议 请求首行 请求方式 url?a=1&b=2 协议 请求头 key:value 请求体 a=1&b=2(只有 ...
- 【ACM】括号配对问题 - 栈
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- vue——做了一个幼稚的小页面
我的小花花没有转起来,不开心  ̄へ ̄