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; }