【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 ...
随机推荐
- CodeForces 131D【图特性+BFS】
题意: 只有一个环,然后环都是0(环缩点相当于树的根),然后其余的输出到根的距离 思路: 可以从度为1的 开始搜 把那些分支全标记掉,然后再取没有标记掉的,BFS一下搞出距离. 具体这个标记: 倒着搜 ...
- 洛谷P2258 子矩阵
P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ...
- 我的省选 Day -9
Day -9 不知不觉,日子已经变成一位数了,已经到了最后关头了. 早上班主任在上数学课时告诉我们,高校自招的降分政策已经没有以前那么优惠了(这我知道啊) 于是老师间接的暗示了奥赛如果没拿到省一就没什 ...
- EIGRP-4-调整接口度量参数来影响路径选择
从EIGRP度量参数的讨论中可以看出.能够手动配置的EIGRP度量参数只有带宽和延迟. 通过使用bandwidth命令强迫EGIRP使用或不使用某条特定路径.看起来是一个很有吸引力的做法.不过这个问题 ...
- Ubuntu下rsyslog集中收集mysql审计日志
服务端 1.安装最新版本rsyslog sudo apt-get install software-properties-common python-software-properties sudo ...
- GUI的最终选择 Tkinter(一):Tkinter最初体验
EasyGui就是一个简单的文字交互界面模块,从今天开始来开始学习Tkinter Tkinter是Python标准的Gui库,它实际是建立在Tk技术上的,Tk最初是为Tcl(一门工具名语言)所涉及的, ...
- MySQL存储引擎InnoDB,MyISAM
MySQL存储引擎InnoDB,MyISAM1.区别:(1)InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语 ...
- Gym 101047K Training with Phuket's larvae
http://codeforces.com/gym/101047/problem/K 题目:给定n<=2000条绳子,要你找出其中三条,围成三角形,并且要使得围成的三角形面积最小 思路: 考虑一 ...
- $(document).ready(function() { });
l $(document).ready(function() { }); 初始化jsp
- 【Java】在eclipse中使用maven进行项目构建 入门篇
maven配置的简单说明 从\192.168.30.150\103.初级人员培训资料\新建文件夹 (2)\环境下提取apache-maven-3.0.4.zip压缩包,解压缩至E盘下 在E盘下新建&q ...