(线段判交的一些注意。。。)nyoj 1016-德莱联盟

1016-德莱联盟


内存限制:64MB 时间限制:1000ms 特判: No
通过数:9 提交数:9 难度:1

题目描述:

欢迎来到德莱联盟。。。。

德莱文。。。

德莱文在逃跑,卡兹克在追。。。。

我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和 终点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线。

输入描述:

几组数据,一个整数T表示T组数据
每组数据 8个实数,分别表示德莱文的起点和终点坐标,以及卡兹克的起点和终点坐标

输出描述:

如果可能 输出 Interseetion,否则输出 Not Interseetion

样例输入:

复制
2
-19.74 7.14 22.23 -27.45 -38.79 -5.08 47.51 34.01
-8.61 9.91 -32.47 6.47 -3.81 -16.1 7.82 -6.37

样例输出:

Interseetion
Not Interseetion
 
参考链接:https://www.cnblogs.com/sytu/articles/3876585.html

这个是线段判交问题,其实线段重合符合这个题的要求。同时需要先进行快速排斥实验,先将两条会在同一条直线上的线段并不重合的情况排除,比如(0 0 1 1 2 2 3 3)这个情况。然后进行跨立实验。并不相交和重合的线段排除。
C++代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Point{
    double x1,y1,x2,y2;
}point[2];
int cmp(const Point& a,const Point& b){
    double k1 = (a.x2 - a.x1)*(b.y1 - a.y1) - (b.x1 - a.x1)*(a.y2 - a.y1);
    double k2 = (a.x2 - a.x1)*(b.y2 - a.y1) - (b.x2 - a.x1)*(a.y2 - a.y1);
    if(k1 * k2 <= 0){    //k1*k2 == 0是指的是线段重合。 
        return true;
    }
    else{
        return false;
    }
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&point[0].x1,&point[0].y1,
                                         &point[0].x2,&point[0].y2,
                                         &point[1].x1,&point[1].y1,
                                         &point[1].x2,&point[1].y2);
        //快速排斥实验。 只要其中一个为真,那两条线段一定不相交。 
        if(!(max(point[0].x1,point[0].x2) < min(point[1].x1,point[1].x2) || 
             max(point[0].y1,point[0].y2) < min(point[1].y1,point[1].y2) || 
             max(point[1].x1,point[1].x2) < min(point[0].x1,point[0].x2) ||
             max(point[1].y1,point[1].y2) < min(point[0].y1,point[0].y2))){
            if(cmp(point[0],point[1]) && cmp(point[1],point[0])){
                printf("Interseetion\n");
            }
            else{
                printf("Not Interseetion\n");
            }
        }
        else{
            printf("Not Interseetion\n");
        }
    
    }
    return 0;
}

 


 

 

请使用手机"扫一扫"x

转载于:https://www.cnblogs.com/Weixu-Liu/p/10599278.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值