0
点赞
收藏
分享

微信扫一扫

【15分】D. 线段相交----结构体

舍予兄 2022-03-26 阅读 78
算法c++

【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;
}
举报

相关推荐

0 条评论