POJ 1410 Intersection

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1410 Intersection相关的知识,希望对你有一定的参考价值。

和矩形某一条边相交,则输出T

在内部,则输出T

题目描述不对,后台数据的矩形坐标不保证是左上角和右下角,也可能是左下角和右上角,所以预先处理一下。

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<list>
#include<algorithm>
using namespace std;

int T;
double xstart,ystart,xend,yend;
double X1,Y1,X2,Y2;
double a,b,c,d;

const double eps=1e-8;
#define zero(x)(((x)>0?(x):(-x))<eps)

struct point
{
    double x;
    double y;
    point (double a,double b){x=a;y=b;}
};

double xmult(point p1,point p2,point p0)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

int dots_inline(point p1,point p2,point p3)
{
    return zero(xmult(p1,p2,p3));
}

int same_side(point p1,point p2,point l1,point l2)
{
    return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps;
}

int dot_online_in(point p,point l1,point l2)
{
    return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
}

int intersect_in(point u1,point u2,point v1,point v2)
{
    if(!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2)) return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2);
    return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2);
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf%lf%lf%lf",&xstart,&ystart,&xend,&yend);
        scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
        bool fail=0;
        point la(xstart,ystart);
        point lb(xend,yend);
        X1=min(a,c);
        X2=max(a,c);
        Y1=max(b,d);
        Y2=min(b,d);
        point pa(X1,Y1);
        point pb(X2,Y1);
        point pc(X1,Y2);
        point pd(X2,Y2);

        //和矩形某一条边相交,则输出T
        if(intersect_in(la,lb,pa,pb)) fail=1;
        if(intersect_in(la,lb,pa,pc)) fail=1;
        if(intersect_in(la,lb,pd,pb)) fail=1;
        if(intersect_in(la,lb,pd,pc)) fail=1;

        //在内部,则输出T
        if(X1<=xstart&&xstart<=X2&&X1<=xend&&xend<=X2&&Y2<=ystart&&ystart<=Y1&&Y2<=yend&&yend<=Y1) fail=1;
        if(fail) printf("T\n");
        else printf("F\n");
    }
    return 0;
}

 

以上是关于POJ 1410 Intersection的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1410 Intersection (线段和矩形相交)

POJ 1410 Intersection(计算几何)

POJ1410线段相交快速排斥实验跨立实验

poj1410(判断线段和矩形是否相交)

线段和矩形相交 POJ 1410

判线段和矩形交+神坑——poj1410