您的位置:首页 > 其它

POJ 1474 Video Surveillance 半平面交

2017-08-31 17:17 351 查看
和POJ 3130,POJ 3335一样。求多边形的核

#include <iostream>
#include <cstdio>
#include <cmath>
#define eps 1e-18
using namespace std;

const int MAXN = 105;
double a, b, c;
int n, cnt;

struct Point
{
double x, y;
}point[MAXN], p[MAXN], tp[MAXN];

void Get_equation(Point p1, Point p2)
{
a = p2.y - p1.y;
b = p1.x - p2.x;
c = p2.x * p1.y - p1.x * p2.y;
}

Point Intersection(Point p1, Point p2)
{
double u = fabs(a * p1.x + b * p1.y + c);
double v = fabs(a * p2.x + b * p2.y + c);
Point t;
t.x = (p1.x * v + p2.x * u) / (u + v);
t.y = (p1.y * v + p2.y * u) / (u + v);
return t;
}

void Cut()
{
int tmp = 0;
for(int i=1; i<=cnt; i++)
{
//顺时针是>-eps和>eps,逆时针是<eps和<-eps
if(a * p[i].x + b * p[i].y + c > -eps) tp[++tmp] = p[i];
else
{
if(a * p[i-1].x + b * p[i-1].y + c > eps)
tp[++tmp] = Intersection(p[i-1], p[i]);
if(a * p[i+1].x + b * p[i+1].y + c > eps)
tp[++tmp] = Intersection(p[i], p[i+1]);
}
}
for(int i=1; i<=tmp; i++)
p[i] = tp[i];
p[0] = p[tmp];
p[tmp+1] = p[1];
cnt = tmp;
}

void solve()
{
for(int i=1; i<=n; i++)
p[i] = point[i];
point[n+1] = point[1];
p[0] = p
;
p[n+1] = p[1];
cnt = n;
for(int i=1; i<=n; i++)
{
Get_equation(point[i], point[i+1]);
Cut();
}
}

int main()
{
int Case = 0;
while(~scanf("%d", &n) && n)
{
for(int i=1; i<=n; i++)
scanf("%lf%lf", &point[i].x, &point[i].y);
solve();
printf("Floor #%d\nSurveillance is %spossible.\n\n", ++Case, cnt>0? "":"im");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: