POJ 3384 Feng Shui 半平面交

水题,样例是错的,记得要考虑半平面交缩成一点, 水水就过了。

View Code
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

struct point
{
    double x, y;
}p[105], tp[105], pp[105];

double a, b, c;
int n, m;
double r;

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

point intersect(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 ret;
    ret.x = (v * p1.x + u * p2.x) / (u + v);
    ret.y = (v * p1.y + u * p2.y) / (u + v);
    return ret;
}

void cut()
{
    int i, tm = 0;
    for(i = 1; i <= m; i++)
    {
        if(a * pp[i].x + b * pp[i].y + c >= 0)
            tp[++tm] = pp[i];
        else
        {
            if(a * pp[i-1].x + b * pp[i-1].y + c > 0)
                tp[++tm] = intersect( pp[i-1], pp[i] );
            if(a * pp[i+1].x + b * pp[i+1].y + c > 0)
                tp[++tm] = intersect( pp[i], pp[i+1] );
        }
    }
    for(i = 1; i <= tm; i++)
        pp[i] = tp[i];
    pp[0] = pp[tm];
    pp[tm+1] = pp[1];
    m = tm;
}

void solve()
{
    int i;
    for(i = 1; i <= n; i++)
        pp[i] = p[i];
    pp[0] = pp[n];
    pp[n+1] = pp[1];
    p[n+1] = p[1];
    m = n;
    for(i = 1; i <= n; i++)
    {
        getline(p[i], p[i+1]);
        c -= r * sqrt(a * a + b * b);
        cut();
    }
}

double f(double x)
{
    return x * x;
}

double dis(point a, point b)
{
    return sqrt( f(a.x - b.x) + f(a.y - b.y) );
}

int main()
{
    int i, j;
    while( ~scanf("%d%lf", &n, &r) )
    {
        for(i = 1; i <= n; i++)
            scanf("%lf%lf", &p[i].x, & p[i].y);
        solve();
        double ans = -1.0;
        if(m == 1) { printf("%.5f %.5f %.5f %.5f\n", pp[m].x, pp[m].y, pp[m].x, pp[m].y); continue; } 
        double x1, y1, x2, y2;
        for(i = 1; i <= m; i++)
            for(j = i+1; j <= m; j++)
                if( ans < dis(pp[i], pp[j]) )
                {
                    ans = dis(pp[i], pp[j]);
                    x1 = pp[i].x; y1 = pp[i].y;
                    x2 = pp[j].x; y2 = pp[j].y;
                }
        printf("%.5f %.5f %.5f %.5f\n", x1, y1, x2, y2);
    }
    return 0;
}
posted @ 2012-09-06 18:20  To be an ACMan  Views(203)  Comments(0)    收藏  举报