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;

}

 

posted @ 2012-04-13 07:23  yejinru  阅读(369)  评论(0编辑  收藏  举报