• 判断两条线段是否相交


    给定两个点:

    typedef  struct {

      double  x, y;

    } Point;

    Point A1,A2,B1,B2;

    首先引入两个实验:

    a.快速排斥实验

    设以线段A1A2和线段B1B2为对角线的矩形为M,N;

    若M,N 不相交,则两个线段显然不相交;

    所以:满足第一个条件时:两个线段可能相交。

     

    b.跨立实验

    如果两线段相交,则两线段必然相互跨立对方.若A1A2跨立B1B2,则矢量( A1 - B1 ) 和(A2-B1)位于矢量(B2-B1)的两侧,

    即(A1-B1) × (B2-B1) * (A2-B1) × (B2-B1)<0。

    上式可改写成(A1-B1) × (B2-B1) * (B2-B1) × (A2-A1)>0。

    应该判断两次,即两条线段都要为直线,判断另一直线的两端点是否在它两边,若是则两线段相交。

    若积极满跨立实验是不行的,如下面的情况:

    即两条线段在同一条直线上。所以我们要同时满足两次跨立和快速排斥实验。

     

    总体分析:

    当(A1-B1) × (B2-B1)=0时,说明(A1-B1)和(B2-B1)共线,但是因为已经通过快速排斥试验,所以 A1一定在线段 B1B2上;同理,(B2-B1)×(A2-B1)=0 说明A2一定在线段B1B2上。所以判断A1A2跨立B1B2的依据是:(A1-B1) × (B2-B1) * (B2-B1) × (A2-B1) >= 0。

    同理判断B1B2跨立A1A2的依据是:(B1-A1) × (A2-A1) * (A2-A1) × (B2-A1) >= 0。

    如图:

    应用:

    1.       判断两个线段相交

    2.       判断线段与直线相交

    3.       判断点在矩形内

  • 相关阅读:
    【转】Git详解之六 Git工具
    【转】Git详解之五 分布式Git
    【转】Git详解之四 服务器上的Git
    【转】Git详解之三 Git分支
    【转】Git详解之二 Git基础
    【转】Git详解之一 Git起步
    【教】Windows下的Git入门
    <<万物简史>>第三章埃文斯牧师的宇宙
    上班两周
    记录一下
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432081.html
Copyright © 2020-2023  润新知