POJ 1410 几何 浙大模板

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)

struct point{double x,y;};
struct line{point a,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 dot_online_in(point p,line l){
	return zero(xmult(p,l.a,l.b))&&(l.a.x-p.x)*(l.b.x-p.x)<eps&&(l.a.y-p.y)*(l.b.y-p.y)<eps;
}
int same_side(point p1,point p2,line l){
	return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>eps;
}
int dots_inline(point p1,point p2,point p3){
	return zero(xmult(p1,p2,p3));
}
int intersect_in(line u,line v){
	if (!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b))
		return !same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u);
	return dot_online_in(u.a,v)||dot_online_in(u.b,v)||dot_online_in(v.a,u)||dot_online_in(v.b,u);
}
int main(){
    int n;
    scanf("%d",&n);
    double xstart,ystart,xend,yend,xleft,ytop,xright,ybottom;
    while(n--){
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&xstart,&ystart,&xend,¥d,&xleft,&ytop,&xright,&ybottom);
        //并不一定能够保证xleft<xright&&ytop>ybottom 
        if(xleft>xright){double tmp=xleft;xleft=xright;xright=tmp;}
        if(ytop<ybottom){double tmp=ytop;ytop=ybottom;ybottom=tmp;}
        if(xstart>=xleft&&xstart<=xright&&ystart>=ybottom&&ystart<=ytop&&xend>=xleft&&xend<=xright&¥d>=ybottom&¥d<=ytop)
            printf("T\n");
        else{
            point p1,p2,p3,p4,p5,p6;
            p1.x=xleft,p1.y=ytop;
            p2.x=xright,p2.y=ytop;
            p3.x=xright,p3.y=ybottom;
            p4.x=xleft,p4.y=ybottom;
            p5.x=xstart,p5.y=ystart;
            p6.x=xend,p6.y=yend;
            line l1,l2,l3,l4,l5;
            l1.a=p1,l1.b=p2;
            l2.a=p2,l2.b=p3;
            l3.a=p3,l3.b=p4;
            l4.a=p4,l4.b=p1;
            l5.a=p5,l5.b=p6;
            if(intersect_in(l1,l5)||intersect_in(l2,l5)||intersect_in(l3,l5)||intersect_in(l4,l5))
                printf("T\n");
            else
                printf("F\n");
        }
    }
    //system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值