POJ 1410 Intersection 判断矩形和线段相交

诶,题目太坑爹。

注意点:

1. 给出的矩形的两个点是随意的,可能是左上,右下 或 左下,右上。

2. 如果线段在矩形里面算相交;

3. 判断线段相交的模版必须完善 (考虑所有情况):共线,规范相交,非规范相交。

View Code
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define eps 10e-8
struct point
{
    double x, y;
    point(){}
    point(double xx, double yy) : x(xx), y(yy){}
};
struct seg
{
    point a, b;
    seg(){}
    seg(point aa, point bb) : a(aa), b(bb){}
};

seg pp;
seg s[5];

double cross(point o ,point a, point b)//叉积
{
    return (a.x - o.x)*(b.y - o.y) - (a.y - o.y)*(b.x - o.x);
}
bool seg_cross(seg s1, seg s2)//判断两线段是否相交
{
        if(min(s1.a.x, s1.b.x) <= max(s2.a.x, s2.b.x)
        && min(s1.a.y, s1.b.y) <= max(s2.a.y, s2.b.y)
        && min(s2.a.x, s2.b.x) <= max(s1.a.x, s1.b.x)
        && min(s2.a.y, s2.b.y) <= max(s1.a.y, s1.b.y)
        //前4个是判断共线的时候 是否相交
        && cross(s1.a, s1.b, s2.a) * cross(s1.a, s1.b, s2.b) <= 0
        && cross(s2.a, s2.b, s1.a) * cross(s2.a, s2.b, s1.b) <= 0
        )return 1;
    return 0;
}
bool judge()//判断线段是否在矩形里面
{
        if(max(pp.a.x, pp.b.x) < max(s[1].a.x, s[3].a.x)
        && max(pp.a.y, pp.b.y) < max(s[1].a.y, s[1].b.y)
        && min(pp.a.x, pp.b.x) > min(s[1].a.x, s[3].a.x)
        && min(pp.a.y, pp.b.y) > min(s[1].a.y, s[1].b.y)
        )return 1;
    return 0;
}
int main()
{
    int cas, i, j;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%lf%lf%lf%lf", &pp.a.x, &pp.a.y, &pp.b.x, &pp.b.y);
        scanf("%lf%lf%lf%lf", &s[1].a.x, &s[1].a.y, &s[3].a.x, &s[3].a.y);
        s[1].b.x = s[1].a.x; s[1].b.y = s[3].a.y;
        s[3].b.x = s[3].a.x; s[3].b.y = s[1].a.y;

        s[2] = seg(s[1].b, s[3].a);s[4] = seg(s[3].b, s[1].a);

        bool ok = 0;
        for(i=1;i<=4;i++)
            if(seg_cross(s[i], pp)){ok = 1; break;}
        if(judge())ok = 1;
        puts(ok ? "T" : "F");
    }
    return 0;
}

 

posted @ 2012-08-17 18:00  To be an ACMan  Views(222)  Comments(0)    收藏  举报