线段和矩形相交 POJ 1410
1 // 线段和矩形相交 POJ 1410 2 3 // #include <bits/stdc++.h> 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <algorithm> 8 #include <vector> 9 #include <math.h> 10 using namespace std; 11 #define LL long long 12 typedef pair<int,int> pii; 13 const int inf = 0x3f3f3f3f; 14 const LL MOD =100000000LL; 15 const int N =110; 16 #define clc(a,b) memset(a,b,sizeof(a)) 17 const double eps = 1e-8; 18 void fre() {freopen("in.txt","r",stdin);} 19 void freout() {freopen("out.txt","w",stdout);} 20 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;} 21 22 int sgn(double x){ 23 if(fabs(x) < eps)return 0; 24 if(x < 0)return -1; 25 else return 1; 26 } 27 struct Point{ 28 double x,y; 29 Point(){} 30 Point(double _x,double _y){ 31 x = _x;y = _y; 32 } 33 Point operator -(const Point &b)const{ 34 return Point(x - b.x,y - b.y); 35 } 36 double operator ^(const Point &b)const{ 37 return x*b.y - y*b.x; 38 } 39 double operator *(const Point &b)const{ 40 return x*b.x + y*b.y; 41 } 42 }; 43 44 struct Line{ 45 Point s,e; 46 int inx; 47 Line(){} 48 Line(Point _s,Point _e){ 49 s=_s;e=_e; 50 } 51 }; 52 53 // Line line[N]; 54 bool inter(Line l1,Line l2){ 55 return 56 max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) && 57 max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) && 58 max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) && 59 max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) && 60 sgn((l2.s-l1.s)^(l1.e-l1.s))*sgn((l2.e-l1.s)^(l1.e-l1.s)) <= 0 && 61 sgn((l1.s-l2.s)^(l2.e-l2.s))*sgn((l1.e-l2.s)^(l2.e-l2.s)) <= 0; 62 } 63 bool OnSeg(Point P,Line L){ 64 return 65 sgn((L.s-P)^(L.e-P))==0&& 66 sgn((P.x-L.s.x)*(P.x-L.e.x))<=0&& 67 sgn((P.y-L.s.y)*(P.y-L.e.y))<=0; 68 } 69 70 int inConvexPoly(Point a,Point p[],int n){ 71 for(int i=0;i<n;i++){ 72 if(sgn((p[i]-a)^(p[(i+1)%n]-a))<0) return -1; 73 else if (OnSeg(a,Line(p[i],p[(i+1)%n]))) return 0; 74 } 75 return 1; 76 } 77 78 Point p[4]; 79 int main(){ 80 int T; 81 scanf("%d",&T); 82 while(T--){ 83 double x1,y1,x2,y2; 84 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 85 Line line=Line(Point(x1,y1),Point(x2,y2)); 86 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 87 if(x1>x2) swap(x1,x2); 88 if(y1>y2) swap(y1,y2); 89 p[0]=Point(x1,y1); 90 p[1]=Point(x2,y1); 91 p[2]=Point(x2,y2); 92 p[3]=Point(x1,y2); 93 if(inter(Line(p[0],p[1]),line)){ 94 printf("T\n"); 95 continue; 96 } 97 if(inter(Line(p[1],p[2]),line)){ 98 printf("T\n"); 99 continue; 100 } 101 if(inter(Line(p[2],p[3]),line)){ 102 printf("T\n"); 103 continue; 104 } 105 if(inter(Line(p[3],p[0]),line)){ 106 printf("T\n"); 107 continue; 108 } 109 if(inConvexPoly(line.s,p,4)>=0||inConvexPoly(line.e,p,4)>=0){ 110 printf("T\n"); 111 continue; 112 } 113 else 114 printf("F\n"); 115 } 116 return 0; 117 }