poj 3130 How I Mathematician Wonder What You Are!

http://poj.org/problem?id=3130

这道题和poj 3335基本上一样,就是输入顺序不一样,这个是逆时针。这道题就是求多边形是不是有核,用半平面交求。

半平面交定义:对于任何平面,任何直线都能将平面划分成两部分,即两个半平面。半平面交既是多个半平面的交集。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define maxn 1000000
using namespace std;

const double eps=(1e-8);
struct point
{
    double x,y;
};
double a,b,c;
int n,cutt=0,m;
point p1[maxn];
point p2[maxn];
point p3[maxn];

void get(point c1,point c2)
{
    a=c2.y-c1.y;
    b=c1.x-c2.x;
    c=c1.y*c2.x-c1.x*c2.y;
}

point insertsect(point c1,point c2)
{
    double u=fabs(a*c1.x+b*c1.y+c);
    double v=fabs(a*c2.x+b*c2.y+c);
    point p;
    p.x=(c1.x*v+c2.x*u)/(u+v);
    p.y=(c1.y*v+c2.y*u)/(u+v);
    return p;
}

void cut()
{
    int cutnum=0;
    for(int i=1; i<=m; i++)
    {
        if(a*p3[i].x+b*p3[i].y+c>=0)
            p2[++cutnum]=p3[i];
        else
        {
            if(a*p3[i-1].x+b*p3[i-1].y+c>0)
                p2[++cutnum]=insertsect(p3[i-1],p3[i]);
            if(a*p3[i+1].x+b*p3[i+1].y+c>0)
                p2[++cutnum]=insertsect(p3[i+1],p3[i]);
        }
    }
    for(int i=1; i<=cutnum; i++)
        p3[i]=p2[i];
    p3[cutnum+1]=p2[1]; p3[0]=p2[cutnum];
    m=cutnum;
}


int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        for(int i=1; i<=n; i++)
        {
            scanf("%lf%lf",&p1[i].x,&p1[i].y);
        }
        for(int i=1; i<(n+1)/2; i++)
        {
            swap(p1[i],p1[n-i]);
        }
        for(int i=1; i<=n; i++)
        {
            p3[i]=p1[i];
        }
        p1[n+1]=p1[1];
        p3[n+1]=p3[1];
        p3[0]=p3[n];
        m=n;
        for(int i=1; i<=n; i++)
        {
            get(p1[i],p1[i+1]);
            cut();
        }
        if(m==0) printf("0\n");
        else printf("1\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值