问题 A: 线段相交----结构体

问题 A: 线段相交----结构体

时间限制: 1 Sec  内存限制: 128 MB
提交: 477  解决: 158
[提交][状态][讨论版]

题目描述

每个线段是用平面上的两个点来描述,用结构体实现对于任意输入的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


线段相交原理分析具体见博客,建议先仔细看懂原理之后再服用代码
https://www.cnblogs.com/shengshouzhaixing/archive/2013/03/17/2964950.html

#include <iostream>
using namespace std;
struct Point{
    double x;
    double y;
};
struct Vector{
    double x;
    double y;
};
struct MBR{
    double xmax;
    double xmin;
    double ymax;
    double ymin;
 
};
Vector Create_vector(Point A,Point B){
    Vector v;
    //从A点到B点的向量
    v.x=B.x-A.x;
    v.y=B.y-A.y;
    return v;
}
 
double Cross_product(Vector a,Vector b){
//求出向量的叉积
    return (a.x*b.y-a.y*b.x);
}
MBR Creat_mbr(Point A,Point B){
    MBR m;
    if (A.x>B.x) {
        m.xmin=B.x;
        m.xmax=A.x;
    } else{
        m.xmin=A.x;
        m.xmax=B.x;
    }
    if (A.y>B.y) {
        m.ymin=B.y;
        m.ymax=A.y;
    } else{
        m.ymax=B.y;
        m.ymin=A.y;
    }
    return m;
}
double MAX(int a,int b){
    if (a>b) {
        return a;
    } else{
        return b;
    }
}
double MIN(int a,int b){
    if (a>b) {
        return b;
    } else{
        return a;
    }
}
 
int MBR_cross(MBR m1,MBR m2){
    //判断两个矩形之间是否跨交
    double xmin,xmax,ymin,ymax;
    xmin=MAX(m1.xmin,m2.xmin);
    xmax=MIN(m1.xmax,m2.xmax);
 
    ymin=MAX(m1.ymin,m2.ymin);
    ymax=MIN(m1.ymax,m2.ymax);
    return (xmax>=xmin&&ymax>=ymin);
    //返回0 不同时成立,两个矩形相互排斥
}
 
 
int function(Point A,Point B,Point C,Point D){
 
    MBR m1=Creat_mbr(A,B);
    MBR m2=Creat_mbr(C,D);
 
    if (MBR_cross(m1,m2)==0) {
        return 0;//相互排斥,直接返回,线段不相交
    } else{
        Vector CA=Create_vector(C,A);
        Vector CB=Create_vector(C,B);
        Vector CD=Create_vector(C,D);
 
        Vector AC=Create_vector(A,C);
        Vector AB=Create_vector(A,B);
        Vector AD=Create_vector(A,D);
 
        if (Cross_product(CD,CA)*Cross_product(CD,CB)<=0 && Cross_product(AC,AB)*Cross_product(AD,AB)<=0 ) {
            return 1;//相交
        } else{
            return 0;
        }
    }
 
}
 
//需要创建三个结构体
//   点的结构体
//   向量的结构体
//   矩形的结构体
int main() {
    int t;
    cin>>t;
    while (t--) {
        Point A;
        Point B;
        Point C;
        Point D;
        cin>>A.x>>A.y;
        cin>>B.x>>B.y;
        cin>>C.x>>C.y;
        cin>>D.x>>D.y;
        if(function(A,B,C,D)){
            cout<<"intersect"<<endl;
        } else{
            cout<<"disjoint"<<endl;
        }
    }
    return 0;
}

 

上一篇:Linux下数据无损动态修改MBR分区表格式为GPT


下一篇:肖特基二极管发展趋势,里面有你不知道奥秘