• 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
  • 相关阅读:
    springBoot从入门到源码分析
    MQ疑难杂症小记
    dubbo学习思路梳理
    Zookeeper
    分布式系统理论概述
    mysql,存储引擎,事务,锁,慢查询,执行计划分析,sql优化
    tomcat学习步骤,附带打破双亲委派模型企业应用实战
    使用UtraISO为U盘制作系统启动盘
    洛谷P3369 splay或treap
    gym 101982 B题 Coprime Integers
  • 原文地址:https://www.cnblogs.com/ohxiaobai/p/4523428.html
Copyright © 2020-2023  润新知