POJ 3130 How I Mathematician Wonder What You Are! 半平面交

Posted Pacify

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3130 How I Mathematician Wonder What You Are! 半平面交相关的知识,希望对你有一定的参考价值。

和POJ3335一样,只不过这题是逆时针

#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[n];
    p[n+1] = p[1];
    cnt = n;
    for(int i=1; i<=n; i++)
    {
        Get_equation(point[i], point[i+1]);
        Cut();
    }
}

int main()
{
    while(~scanf("%d", &n) && n)
    {
        for(int i=1; i<=n; i++)
            scanf("%lf%lf", &point[i].x, &point[i].y);
        solve();
        puts(cnt > 0? "1" : "0");
    }
    return 0;
}

 

以上是关于POJ 3130 How I Mathematician Wonder What You Are! 半平面交的主要内容,如果未能解决你的问题,请参考以下文章

POJ-3130 How I Mathematician Wonder What You Are!

How I Mathematician Wonder What You Are! POJ - 3130(半平面交,多边形内核)

poj 3130 How I Mathematician Wonder What You Are! 半平面交

POJ 3130 How I Mathematician Wonder What You Are!

POJ3335 POJ3130 [半平面交]

poj3130 (半平面交