• poj 1269 Intersecting Lines 判断两线段是否相交并求其交点


    /*

     

    题目:

       求两线段是否重合、平行或相交

     

    分析:

       利用叉积运算很容易算出来,我们可以先判断是否是平行的,只需将每一段线段向量化,再与另一个

       向量做叉积运算,若为0即平行或重合,判断是否重合,只需找其中一个向量与该向量的一端与另一向量

       的一端组成的向量做叉积运算,为0即为重合。

       不平行的话,那么在本题中有一个交点,可以求到两线段分别所在的直线(ax+by+c=0),然后联立方程解出

       x,y即可(这是我自己做的方法,可能有些漏洞,网上有很多模板)

     

    */

    #include <iostream>

    #include <cstdio>

    #include <cmath>

    using namespace std;

    struct point //点

    {

       int x,y;

    };

    struct line     //线

    {

       point a,b;

    }Line[2];

    int det(int x1,int y1,int x2,int y2)//叉积运算

    {

       return x1*y2-x2*y1;

    }

    bool parallel(line u,line v)   //判断是否平行

    {

       if(det( u.b.x-u.a.x , u.b.y-u.a.y , v.b.x-v.a.x , v.b.y-v.a.y )==0)

          return true;

       return false;

    }

    bool same_line(line u,line v)  //判断是否重合

    {

       if(det( v.a.x-u.a.x , v.a.y-u.a.y ,u.b.x-u.a.x , u.b.y-u.a.y )==0)

          return true;

       return false;

    }

    void cal(int a1,int b1,int c1,int a2,int b2,int c2)//两线段所在直线的一般方程分别的3个系数

    {

       double x,y;

       y = (a1*c2-c1*a2*1.0)/(a2*b1-a1*b2);

       if(a1==0)

          x = (-c2-b2*y)/a2;

       else

          x = (-c1-b1*y)/a1;

       printf("POINT %.2lf %.2lf\n",x,y);

    }

    void intersect(line u,line v)  //相交的情况

    {

       int a1 = u.b.y-u.a.y;

       int b1 = u.a.x-u.b.x;

       int c1 = -u.b.y*b1-u.b.x*a1;

     

       int a2 = v.b.y-v.a.y;

       int b2 = v.a.x-v.b.x;

       int c2 = -v.b.y*b2-v.b.x*a2;

       cal(a1,b1,c1,a2,b2,c2);

    }

    int main()

    {

       freopen("sum.in","r",stdin);

       freopen("sum.out","w",stdout);

       int t;

       cin>>t;

       cout<<"INTERSECTING LINES OUTPUT"<<endl;

       while(t--)

       {

          for(int i=0;i<2;i++)

             cin>>Line[i].a.x>>Line[i].a.y>>Line[i].b.x>>Line[i].b.y;

          if(parallel(Line[0],Line[1]))

          {

             if(same_line(Line[0],Line[1]))

                cout<<"LINE"<<endl;

             else

                cout<<"NONE"<<endl;

          }

          else

             intersect(Line[0],Line[1]);

       }

       cout<<"END OF OUTPUT"<<endl;

       return 0;

    }

  • 相关阅读:
    如何找出阻塞的线程正在等待哪个线程
    探索Windows 10的CFG机制
    异常0xc000041d的抛出过程
    异常STATUS_FATAL_USER_CALLBACK_EXCEPTION(0xc000041d)
    VisualStudio中集成扩展调试SOS
    clr调试扩展和DAC
    WinDbg常用命令系列---sx, sxd, sxe, sxi, sxn, sxr, sx- (设置异常)
    CLR调试时的sos.dll/clr.dll/mscorwks.dll/mscordacwks.dll等动态库的版本对应
    WinDbg常用命令系列---!runaway
    WinDbg常用命令系列---!findstack
  • 原文地址:https://www.cnblogs.com/yejinru/p/2445136.html
Copyright © 2020-2023  润新知