【15分】D. 线段相交----结构体
题目描述
每个线段是用平面上的两个点来描述,用结构体实现对于任意输入的2个线段,判断其是否相交。
提示:两点(x1,y1), (x2,y2) 间直线斜率是k=(y2-y1)/(x2-x1).
输入
判断次数和2条线段的x1、y1、x2、y2
输出
是否相交
输入样例1
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
输出样例1
disjoint
intersect
disjoint
代码
#include <iostream>
using namespace std;
struct SPoint
{
int x, y;
};
struct SLine
{
SPoint p1, p2;
};
int cross(const SLine &ab, const SPoint &c)
{
SPoint v1, v2;
v1.x = ab.p2.x - ab.p1.x;
v1.y = ab.p2.y - ab.p1.y;
v2.x = c.x - ab.p1.x;
v2.y = c.y - ab.p1.y;
int num = v1.x * v2.y - v1.y * v2.x;
return num;
}
bool check(const SLine &l1, const SLine &l2)
{
int t1 = cross(l1,l2.p1);
int t2 = cross(l1,l2.p2);
int t3 = cross(l2,l1.p1);
int t4 = cross(l2,l1.p2);
if(t1 * t2 <= 0 && t3 * t4 <= 0) return true;
else return false;
}
int main( )
{
int t;
cin >> t;
while(t --)
{
SLine myline1, myline2;
cin >> myline1.p1.x >> myline1.p1.y >> myline1.p2.x >> myline1.p2.y;
cin >> myline2.p1.x >> myline2.p1.y >> myline2.p2.x >> myline2.p2.y;
if(check(myline1,myline2)) cout << "intersect" << endl;
else cout << "disjoint" << endl;
}
return 0;
}