线段相交----结构体
题目描述
每个线段是用平面上的两个点来描述,用结构体实现对于任意输入的2个线段,判断其是否相交。
提示:两点(x1,y1), (x2,y2) 间直线斜率是k=(y2-y1)/(x2-x1).
输入
判断次数和2条线段的x1、y1、x2、y2
输出
是否相交
示例输入
3
1 5 2 9
1 3 2 4
5 6 7 8
5 7 7 7
2 5 1 0
9 4 2 9
示例输出
disjoint
intersect
disjoint
#include<iostream>
using namespace std;
struct line
{
int x1,y1;
int x2,y2;
}line1,line2;
int main()
{
int t,i,line1max,line1min,line2max,line2min;
double k1,k2,b1,b2,c;
cin>>t;
for(i=0;i<t;i++)
{
cin>>line1.x1>>line1.y1>>line1.x2>>line1.y2;
cin>>line2.x1>>line2.y1>>line2.x2>>line2.y2;
k1=(line1.y2-line1.y1)/(line1.x2-line1.x1);
k2=(line2.y2-line2.y1)/(line2.x2-line2.x1);
if(line1.x1>line1.x2)
{
line1max=line1.x1;
line1min=line1.x2;
}
else
{
line1max=line1.x2;
line1min=line1.x1;
}
if(line2.x1>line2.x2)
{
line2max=line2.x1;
line2min=line2.x2;
}
else
{
line2max=line2.x2;
line2min=line2.x1;
}
if(k1!=k2)
{
b1=line1.y1-k1*line1.x1;
b2=line2.y1-k2*line2.x1;
c=(b2-b1)/(k1-k2);
if(c>line1max||c<line1min||c>line2max||c<line2min)
cout<<"disjoint"<<endl;
else
cout<<"intersect"<<endl;
}
else
{
if(line1.x1<line2max&&line1.x1>line2min||line2.x1>line1min&&line2.x1<line2max)
{
cout<<"intersect"<<endl;
}
else
cout<<"disjoint"<<endl;
}
}
return 0;
}