UVa 191
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 struct point{ 7 int x,y; 8 point(int x = 0,int y = 0){ 9 this->x = x; 10 this->y = y; 11 } 12 }; 13 class Intersec{ 14 private: 15 point ls,lt,c1,c2,c3,c4; 16 //线段端点和矩形的四个端点 17 public: 18 void readData();//读取数据 19 void process();//处理 20 bool isIn(point la,point lb,point c1,point c3);//线段是否在矩形内部 21 bool isCross(point la,point lb,point pa,point pb);//线段是否和矩形相交 22 int dir(point i,point j,point k);//向量叉积 23 bool isInSeg(point a,point la,point lb);//点是否在线段l上 24 }; 25 void Intersec::readData(){//输入数据 26 int x1,y1,x2,y2,x3,y3,x4,y4; 27 scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); 28 ls = point(x1,y1); 29 lt = point(x2,y2); 30 c1 = point(min(x3,x4),max(y3,y4)); 31 c2 = point(min(x3,x4),min(y3,y4)); 32 c3 = point(max(x3,x4),min(y3,y4)); 33 c4 = point(max(x3,x4),max(y3,y4)); 34 } 35 void Intersec::process(){ 36 if(isIn(ls,lt,c1,c3)) 37 cout<<"T"<<endl; 38 else if(isCross(ls,lt,c2,c1)||isCross(ls,lt,c1,c4)|| 39 isCross(ls,lt,c2,c3)||isCross(ls,lt,c3,c4)){ 40 cout<<"T"<<endl; 41 } 42 else 43 cout<<"F"<<endl; 44 } 45 46 bool Intersec::isIn(point la,point lb,point c1,point c3){//判断线段是否在矩形内 47 if((min(c1.x,c3.x) <= la.x && la.x <= max(c1.x,c3.x))&& 48 (min(c1.y,c3.y) <= la.y && la.y <= max(c1.y,c3.y))&& 49 (min(c1.x,c3.x) <= lb.x && lb.x <= max(c1.x,c3.x))&& 50 (min(c1.y,c3.y) <= lb.y && lb.y <= max(c1.y,c3.y))){ 51 return true; 52 } 53 return false; 54 } 55 bool Intersec::isCross(point la,point lb,point pa,point pb){//判断线段是否与矩形相交 56 int dir1 = dir(pa,pb,la);//判断点la在线段pa--pb的哪一侧,0,1代表两侧 57 int dir2 = dir(pa,pb,lb);//判断点lb在线段pa--pb的哪一侧,0,1代表两侧 58 int dir3 = dir(la,lb,pa);//判断点pa在线段la--lb的哪一侧,0,1代表两侧 59 int dir4 = dir(la,lb,pb);//判断点pb在线段la--lb的哪一侧,0,1代表两侧 60 if(dir1 * dir2 < 0 && dir3*dir4 < 0){//线段相交 61 return true; 62 } 63 else if(dir1 == 0){//向量共线,判断是否重合 64 if(isInSeg(pa,pb,la))return true; 65 return false; 66 } 67 else if(dir2 == 0){ 68 if(isInSeg(pa,pb,lb))return true; 69 return false; 70 } 71 else if(dir3 == 0){ 72 if(isInSeg(la,lb,pa))return true; 73 return false; 74 } 75 else if(dir4 == 0){ 76 if(isInSeg(la,lb,pb))return true; 77 return false; 78 } 79 else 80 return false; 81 } 82 int Intersec::dir(point i,point j,point k){//向量叉积 83 return ((j.x - i.x)*(k.y - i.y)-(k.x - i.x)*(j.y - i.y)); 84 } 85 bool Intersec::isInSeg(point la,point lb,point a){ 86 if((min(la.x,lb.x) <= a.x && a.x <= max(la.x,lb.x)) && 87 (min(la.y,lb.y) <= a.y && a.y <= max(la.y,lb.y))) 88 return true; 89 else 90 return false; 91 } 92 int main() 93 { 94 #ifndef ONLINE_JUDGE 95 freopen("D:\\acm.txt","r",stdin); 96 #endif // ONLINE_JUDGE 97 int cases; 98 Intersec intersec; 99 cin>>cases; 100 while(cases--){ 101 intersec.readData(); 102 intersec.process(); 103 } 104 105 return 0; 106 }
Donghua University