Bounding box POJ - 2504 计算几何
2017-08-16 10:27
316 查看
Bounding box 题目链接
题意:给你一个正n边形的三个点,让你求出能够包含这个多边形所有点的矩形的最小面积,矩形平行于坐标轴。
思路: 首先通过三点确定多边形的外接圆心,然后用到向量旋转公式,求出多边形的每个点,找到最大和最小的坐标
然后算出面积。
公式我也不知道怎么推 ,记一下模板吧: x' ,y' 已知的某一点, x0 ,y0 外接圆心。
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const double pi=acos(-1);
struct Node{
double x,y;
}a1,b1,c1;
int n;
Node calu(Node a,Node b,Node c) { Node ret; ret.x = ((b.y-c.y) * (pow(a.x,2)-pow(b.x,2)+pow(a.y,2)-pow(b.y,2)) - (a.y-b.y) * (pow(b.x,2)-pow(c.x,2)+pow(b.y,2)-pow(c.y,2))) / ((a.x-b.x)*(b.y-c.y)-(b.x-c.x)*(a.y-b.y)) / 2; ret.y = -(a.x-b.x) / (a.y-b.y) * (ret.x - (a.x+b.x)/2) + (a.y+b.y) / 2; return ret; }
double solve(Node a,Node d)
{
double r=2*pi/n;
double mxx,mnx,mxy,mny;
mxx=mnx=a.x,mxy=mny=a.y;
for(int i=0;i<n;i++)
{
double mx=(a.x-d.x)*cos(r*i)-(a.y-d.y)*sin(r*i)+d.x;
double my=(a.x-d.x)*sin(r*i)-(a.y-d.y)*cos(r*i)+d.y;
mxx=max(mx,mxx);
mnx=min(mnx,mx);
mxy=max(mxy,my);
mny=min(mny,my);
}
return (mxx-mnx)*(mxy-mny);
}
int main()
{
int kase=1;
while(scanf("%d",&n)&&n)
{
scanf("%lf%lf%lf%lf%lf%lf",&a1.x,&a1.y,&b1.x,&b1.y,&c1.x,&c1.y);
Node d=calu(a1,b1,c1);
printf("Polygon %d: %.3f\n",kase++,solve(a1,d));
}
return 0;
}
模板 由三个点求外接圆面积:
Node calu(Node a,Node b,Node c) { Node ret; ret.x = ((b.y-c.y) * (pow(a.x,2)-pow(b.x,2)+pow(a.y,2)-pow(b.y,2)) - (a.y-b.y) * (pow(b.x,2)-pow(c.x,2)+pow(b.y,2)-pow(c.y,2))) / ((a.x-b.x)*(b.y-c.y)-(b.x-c.x)*(a.y-b.y)) / 2; ret.y = -(a.x-b.x) / (a.y-b.y) * (ret.x - (a.x+b.x)/2) + (a.y+b.y) / 2; return ret; }
模板 由外接圆求正 n 边形 的每个顶点。
double solve(Node a,Node d)
{
double r=2*pi/n;
double mxx,mnx,mxy,mny;
mxx=mnx=a.x,mxy=mny=a.y;
for(int i=0;i<n;i++)
{
double mx=(a.x-d.x)*cos(r*i)-(a.y-d.y)*sin(r*i)+d.x;
double my=(a.x-d.x)*sin(r*i)-(a.y-d.y)*cos(r*i)+d.y;
mxx=max(mx,mxx);
mnx=min(mnx,mx);
mxy=max(mxy,my);
mny=min(mny,my);
}
return (mxx-mnx)*(mxy-mny);
}
相关文章推荐
- uva 10173 Smallest Bounding Rectangle (计算几何-凸包)
- uva 10173 Smallest Bounding Rectangle (计算几何-凸包)
- 【POJ2504】Bounding box(计算几何)
- 计蒜客 16951 Out-out-control cars(计算几何)
- Hdu 3365 New Ground(计算几何)
- 51nod--1298 (计算几何基础)
- POJ 2954-Triangle(计算几何+皮克定理)
- poj 1408(计算几何)
- 计算几何之凸包_卷包裹算法
- 计算几何二维。
- hdu 5128 The E-pang Palace(计算几何,暴力枚举)
- HDU 5784- How Many Triangles-计算几何-two-pointer-数锐角三角形个数
- 2016.2.18 水污染管理 [计算几何] [三角剖分]
- 【bzoj 1043】下落的圆盘(计算几何)
- hdu 4305 Lightning 高斯消元 计算几何
- POJ 3347(计算几何)
- 【April Fools Day Contest 2014E】【简单计算几何】Dome 四棱锥内切圆半径为r
- POJ3304 Segments(计算几何,线段和直线的交点)
- hdu2108Shape of HDU 计算几何
- hihoCoder - 1040 - 矩形判断 (简单计算几何~)