Intersection--poj1410(判断线段与矩形的关系)

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

题目大意:给你一个线段和矩形的对角两点  如果相交就输出'T'  不想交就是'F'

注意:

1,给的矩形有可能不是左上 右下  所以要先判断的

2,线段在矩形的内部输出T

3,如果交点是矩形的顶点的话 是不相交的

 

情况有点多  刚开始考虑的太少   wa的我心疼    

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<iostream>

using namespace std;
#define N 20
const double ESP = 1e-8;
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))

struct Point
{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y) {}
    Point operator - (const Point &temp)const
    {
        return Point(x-temp.x,y-temp.y);
    }
    int operator * (const Point &temp)const
    {
        double t=(x*temp.y)-(y*temp.x);
        if(t>ESP)
            return 1;
        if(fabs(t)<ESP)
            return 0;
        else
            return -1;
    }
} p[N],j;

Point line(Point u1,Point u2,Point v1,Point v2)///求交点模板
{
    Point ret=u1;
    double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));

    ret.x+=(u2.x-u1.x)*t;
    ret.y+=(u2.y-u1.y)*t;

    return ret;
}


int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        j.x=j.y=INF;
        memset(p,0);
        double x1,x2,y1,y2;
        double a,b,c,d;
        scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
        scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
        if(a>c)
            swap(a,c),swap(b,d);
        int u,D;
        u=max(b,d);
        D=min(b,d);
        if(x1>=a && x1<=c && x2>=a && x2<=c && y1>=D && y1<=u && y2>=D && y2<=u)
        {
            printf("T\n");
            continue;
        }
        ///判断线段与矩形的一条边是否相交
        p[1]=Point(x1,y1);
        p[2]=Point(x2,y2);
        p[3]=Point(a,b);
        p[4]=Point(c,b);
        p[5]=Point(c,b);
        p[6]=Point(c,d);
        p[7]=Point(a,b);
        p[8]=Point(a,d);
        p[9]=Point(a,d);
        p[10]=Point(c,d);
        int k,kk;
        int flag=0;
        for(int i=2; i<=5; i++)
        {
            k=abs((p[1]-p[i*2-1])*(p[i*2]-p[i*2-1])+(p[2]-p[i*2-1])*(p[i*2]-p[i*2-1]));
            kk=abs((p[i*2-1]-p[1])*(p[2]-p[1])+(p[i*2]-p[1])*(p[2]-p[1]));
            if(k!=2 && kk!=2)///如果相交
            {
                if((p[1]-p[i*2-1])*(p[i*2]-p[i*2-1])==0 && (p[2]-p[i*2-1])*(p[i*2]-p[i*2-1])==0)///共线
                {
                    if(i==2 || i==5)
                    {
                        if((p[1].x>a && p[1].x<c)||(p[2].x>a && p[2].x<c) || (p[1].x<=a && p[2].x>=c) || (p[2].x<=a && p[1].x>=c))
                        {
                            flag=1;
                            break;
                        }
                    }
                    else
                    {
                        if((p[1].y>D && p[1].y<u)||(p[2].y>D && p[2].y<u) || (p[1].y<=D && p[2].y>=u) || (p[2].y<=D && p[1].y>=u))
                        {
                            flag=1;
                            break;
                        }
                    }
                }
                j=line(p[1],p[2],p[i*2],p[i*2-1]);
                if(i==2)
                if(j.x>a && j.x<c && j.y==b)///如果交点在a和c之间(不包括a c)
                {
                    flag=1;
                    break;
                }
                if(i==3)
                {
                    if(j.x==c && j.y>D && j.y<u)
                    {
                        flag=1;
                        break;
                    }
                }
                if(i==4)
                {
                    if(j.x==a && j.y>D && j.y<u)
                    {
                        flag=1;
                        break;
                    }
                }
                if(i==5)
                {
                    if(j.x>a && j.x<c && j.y==d)
                    {
                        flag=1;
                        break;
                    }
                }
            }
        }
        if(flag==0)
            printf("F\n");
        else
            printf("T\n");
    }
    return 0;
}

 

posted @ 2016-04-26 17:35  啦咯  阅读(283)  评论(0编辑  收藏  举报