3rd. 【计算几何】直线与直线相交

                                   直线与直线相交

【题目描述】:

给出两条直线(每条直线给出其上两个点),要求判断出这两条直线的关系:平行,同线或相交。如果相交还要求出交点坐标。

【输入描述】:

第一行一个数T,表示T组数据;

每组数据输入一行,8个数,分别表示ax,ay,bx,by,cx,cy,dx,dy,四个点的横纵坐标,其中前两个点表示一条直线,后两个点表示另一条直线。

【输出描述】:

对于每组数据输出一行;

如果平行输出“NONE”;如果共线输出“LINE”;如果相交输出交点的横纵坐标(精确到小数点后两位)。

【样例输入】:

5
0 0 4 4 0 4 4 0
5 0 7 6 1 0 2 3
5 0 7 6 3 -6 4 -3
2 0 2 27 1 5 18 5
0 3 4 0 1 2 2 5

【样例输出】:

2.00 2.00
NONE
LINE
2.00 5.00
1.07 2.20

【时间限制、数据范围及描述】:

时间:1s 空间:64M

T<=10,000

-10000<=所有点坐标<=10000

直线与直线有三种关系,相交平行和共线。
        

那么首先应该需要判断关系,就是跨立实验。用叉积判断两条直线是否相交(先取一条直线,看另外两点是否在其两边,再取另一条直线操作) 如果两次实验结果都是0,说明点相互在一条直线上,完成共线判断。
      不然的话如果通过叉积算出两条直线极角相等,则说明两线平行,完成平行判断。
       所以最后不平行不共线,就一定相交了!

算个解析式,求个交点即可了!
        但这里有一点需要特别注意,直线有可能和y轴平行(这样算k的时候分母为0,会炸掉),所以需要特别判断一下。当然与X轴平行时无所谓的
因为k可以为0,就不用管了。 

具体可以参考本蒟蒻写的程序

#include
#include
using namespace std;
int t;
int x1,y1,x2,y2,x3,y3,x4,y4;

int chaji(int a,int  b,int  c,int d)
{  return a*d-b*c;  }  //算叉积 

void jiaodian(){//计算解析式并找交点 
  double k1,k2,b1,b2,x,y;// (x1,y1)和(x2,y2)--y=k1x+b1 (x3,y3)和(x4,y4)--y=k2x+b2 
  k1=(double)(((y2-y1)*1.0)/((x2-x1)*1.0));//解析式 
  b1=(double)(y1-k1*x1);
  k2=(double)(((y4-y3)*1.0)/((x4-x3)*1.0));
  b2=(double)(y3-k2*x3);   
  x=(double)((b2-b1)/(k1-k2));//求交点 
  y=(double)(x*k1+b1);
  if(x1==x2)//特殊判断  
  {x=(double)(x1);
   y=(double)(k2*x1+b2);}
  if(x3==x4)
   {x=(double)(x3);
    y=(double)(k1*x3+b1);}
    printf("%.2f %.2f\n",x,y);
   return;
    }
int main(){
    //freopen("test2.in","r",stdin);
    //freopen("test2.out","w",stdout);
    cin>>t;
    while(t--)
    {  cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
       if(chaji(x2-x1,y2-y1,x3-x1,y3-y1)==0&&chaji(x2-x1,y2-y1,x4-x1,y4-y1)==0)
        cout<<"LINE"<



你可能感兴趣的:(计算几何,计算几何,叉积,直线,相交)