您的位置:首页 > 其它

poj3130 How I Mathematician Wonder What You Are!【半平面交】

2017-04-28 20:27 387 查看
题目链接:http://poj.org/problem?id=3130

题意:给你一个多边形,让你判断是否是星星,星星的定义是如果有两个点ab属于多边形里面,那么线段ab也属于多边形里面

解析:仔细想想,如果是星星的话,那么也就相当于这个多边形存在核,所以直接套半平面交的模板,记住输入时逆时针的

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const double eps = 0;
const int maxn = 12+100;
struct point
{
double x,y;
point() {}
point(double _x,double _y)
{
x = _x;
y = _y;
}
};
point points[maxn],p[maxn],q[maxn];
int cCnt,curCnt;
void init(int n)
{
for(int i=1;i<=n;i++)
p[i] = points[i];
p[n+1] = p[1];
p[0] = p
;
cCnt = n;
}
void getline(point s,point e,double &a,double &b,double &c)
{
a = e.y-s.y;
b = s.x-e.x;
c = e.x*s.y-s.x*e.y;
}
point cross(point p1,point p2,double a,double b,double c)
{
double u = fabs(a*p1.x+b*p1.y+c);
double v = fabs(a*p2.x+b*p2.y+c);
return point((p1.x*v+p2.x*u)/(u+v),(p1.y*v+p2.y*u)/(u+v));
}
void cut(double a,double b,double c)
{
curCnt = 0;
for(int i=1;i<=cCnt;i++)
{
if(a*p[i].x+b*p[i].y+c>=eps)
q[++curCnt] = p[i];
else
{
if(a*p[i-1].x+b*p[i-1].y+c > eps)
q[++curCnt] = cross(p[i],p[i-1],a,b,c);
if(a*p[i+1].x+b*p[i+1].y+c > eps)
q[++curCnt] = cross(p[i],p[i+1],a,b,c);
}
}
for(int i=1;i<=curCnt;i++)
p[i] = q[i];
p[curCnt+1] = q[1];
p[0] = p[curCnt];
cCnt = curCnt;
}
void slove(int n)
{
init(n);
for(int i=1;i<=n;i++)
{
double a,b,c;
getline(points[i],points[i+1],a,b,c);
cut(a,b,c);
}
}
void adjust(int n)
{
for(int i=1;i<=n;i++)
q[i]=points[n-i+1];
for(int i=1;i<=n;i++)
points[i]=q[i];
}
int main(void)
{
int n;
while(~scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
scanf("%lf %lf",&points[i].x,&points[i].y);
adjust(n);
points[n+1] = points[1];
slove(n);
if(cCnt<1)
puts("0");
else
puts("1");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐