POJ1410 Intersection 计算几何

题目大意:给出一个线段的两端,和矩形两端(不一定是左上和右下),问线段是否与矩形相交(若线段在矩形内也算相交)。这题蒸鹅心……

题目思路:判断所有情况:线段是否在矩形内,线段内一点是否在矩形内,线段是否与四边相交(叉积),线段的两端是否在矩形上,矩形的四点是否在线段上。

要注意的是:

1.如果两条线段的叉积为0,也可能共线但不相交。

2.判断点在线段上的方法:叉积为0,且到两点的距离与线段等长。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define MAXSIZE 100005
#define INF 0x3f3f3f3f
#define LL long long

using namespace std;

//给出一个线段的两端,和矩形两端(不一定是左上和右下),问线段是否与矩形相交(若线段在矩形内也算相交)。这题蒸鹅心……

int px1,py1,px2,py2,lx,ly,rx,ry;

int Cross(int x1,int y1,int x2,int y2,int x3,int y3)
{
    return (x1-x2)*(y2-y3)-(x2-x3)*(y1-y2);
}

int Check(int x1,int y1,int x2,int y2)
{
    int op1=Cross(px1,py1,x1,y1,x2,y2)*Cross(px2,py2,x1,y1,x2,y2);
    int op2=Cross(x1,y1,px1,py1,px2,py2)*Cross(x2,y2,px1,py1,px2,py2);
    if(op1<0 && op2 <0)
        return 1;
    return 0;
}

int Dist(int x1,int y1,int x2,int y2,int x3,int y3)
{
    double d1=sqrt((x2-x1)*(x2-x1)*1.0+(y2-y1)*(y2-y1)*1.0);
    double d2=sqrt((x3-x1)*(x3-x1)*1.0+(y3-y1)*(y3-y1)*1.0);
    double d3=sqrt((x3-x2)*(x3-x2)*1.0+(y3-y2)*(y3-y2)*1.0);
    if(fabs(d1+d2-d3) < 1e-10)
        return 1;
    return 0;
}

int Solve()
{
    //线段是否在圆内
    if(px1>=lx && px1<=rx && py1<=ly && py1>=ry)
        return 1;
    if(px2>=lx && px2<=rx && py2<=ly && py2>=ry)
        return 1;
    //四角是否在线段上
    if(Cross(lx,ly,px1,py1,px2,py2)==0 && Dist(lx,ly,px1,py1,px2,py2))
        return 1;
    if(Cross(lx,ry,px1,py1,px2,py2)==0 && Dist(lx,ry,px1,py1,px2,py2))
        return 1;
    if(Cross(rx,ry,px1,py1,px2,py2)==0 && Dist(rx,ry,px1,py1,px2,py2))
        return 1;
    if(Cross(rx,ly,px1,py1,px2,py2)==0 && Dist(rx,ly,px1,py1,px2,py2))
        return 1;
    //线段是否平行与边且覆盖
    if(Cross(px1,py1,lx,ly,lx,ry)==0 && Cross(px2,py2,lx,ly,lx,ry)==0 && Dist(lx,ly,px1,py1,px2,py2))
        return 1;
    if(Cross(px1,py1,lx,ry,rx,ry)==0 && Cross(px2,py2,lx,ry,rx,ry)==0 && Dist(lx,ry,px1,py1,px2,py2))
        return 1;
    if(Cross(px1,py1,rx,ry,rx,ly)==0 && Cross(px2,py2,rx,ry,rx,ly)==0 && Dist(rx,ry,px1,py1,px2,py2))
        return 1;
    if(Cross(px1,py1,rx,ly,lx,ly)==0 && Cross(px2,py2,rx,ly,lx,ly)==0 && Dist(rx,ly,px1,py1,px2,py2))
        return 1;
    //线段是否与矩形边相交
    if(Check(lx,ry,lx,ly))
        return 1;
    if(Check(lx,ry,rx,ry))
        return 1;
    if(Check(rx,ry,rx,ly))
        return 1;
    if(Check(rx,ly,lx,ly))
        return 1;
    return 0;
}

int main()
{
    int T,x1,y1,x2,y2;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d%d%d%d%d",&px1,&py1,&px2,&py2,&x1,&y1,&x2,&y2);
        lx=min(x1,x2);
        ly=max(y1,y2);
        rx=max(x1,x2);
        ry=min(y1,y2);
        int op=Solve();
        if(!op)
            printf("F\n");
        else
            printf("T\n");
    }
    return 0;
}
View Code

 

posted @ 2016-11-01 10:35  声声醉如兰  阅读(248)  评论(0编辑  收藏  举报