zoukankan      html  css  js  c++  java
  • 判断两个线段是否相交

    判断两条直线是否相交有两步:

                            1:快速排斥(可以筛除大部分)

                            2:跨立试验(下面会有所说明)

    现在开始解释:

        第一步快速排斥,实际上就是先判断一下,假设现在有两条线段ab,cd,现在我们需要判断以ab为对角线的矩形是否和以cd为对角线的矩形是否有重合的部分,如果有则我们可以进行下一步判断,如果没有那么这两条线段肯定不可能相交。

       那么问题来了,我们怎么判断两个矩形是否有重合的部分呢?
       如下图中的两个矩形;

     

    重和的情况:

           对于横向:min(a.x,b.x)<=max(d.x,c.x)&&min(c.x,d.x)<=max(a.x,b.x);

           对于纵向:  min(a.y,b.y)<=max(d.y,c.y)&&min(c.y,d.y)<=max(a.y,b.y);

    只有同时满足横向与纵向才能满足两个矩形重合。

         如果满足上面的重合要求后,我们就可以进行第二步判断了,判断是否相互跨立,注意必须是相互跨立。

    对于什么是跨立?如果两条线段相交,那么某一条线段的两个端点必定分布在另一条线段的两侧,或者这条直线的端点在另一条直线上。具体情况如下:

     

    那么这时候我们就可以用叉乘来判断了,没学过的话可以点这个链接 点击打开链接。

    如图:

     

    若(ca x cd)*(cb x cd)<=0 则说明ca cb先对于cd的方向不同(叉乘的结果),则a b在线段cd的两侧。

    同理若(ac x ab)*(ad x ab)<=0,则可以说明两条线段相互跨立了。

    上代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node{
    double x;
    double y;
    }; 
    node a,b,c,d;
    bool judge(node a,node b,node c,node d)
    {
    if(min(a.x,b.x) <= max(c.x,d.x) && min(c.x,d.x) <= max(a.x,b.x) && min(a.y,b.y) <= max(c.y,d.y) &&min(c.y,d.y)<=max(a.y,b.y))
    {
    
    double u,v,w,z;//保存叉乘 
    u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
    v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
    w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
    z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);
    return (u*v<=0.00000001 && w*z<=0.00000001); //浮点数判断大小
    }
    return false;
    }
    int main()
    {
    cin >> a.x >> a.y;
    cin >> b.x >> b.y;
    cin >> c.x >> c.y;
    cin >> d.x >> d.y;
    if(judge(a,b,c,d))
    {
    printf("相交
    ");
    }
    else
    {
    printf("不相交
    ");
    }
    return 0;
    }


    水波,借鉴某位大佬的图,thanks。
    ---------------------
    作者:白黑菜
    来源:CSDN
    原文:https://blog.csdn.net/qq_36556340/article/details/70039800
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    C puzzles详解【51-57题】
    C puzzles详解【46-50题】
    C puzzles详解【38-45题】
    C puzzles详解【34-37题】
    C puzzles详解【31-33题】
    C puzzles详解【26-30题】
    C puzzles详解【21-25题】
    C puzzles详解【16-20题】
    使用C++模板实现栈的求最小值功能
    模拟求幂运算,考虑的已经很周全了
  • 原文地址:https://www.cnblogs.com/xiaoahui/p/10447686.html
Copyright © 2011-2022 走看看