美文网首页
线段判定相交(规范相交)

线段判定相交(规范相交)

作者: laochonger | 来源:发表于2018-06-11 14:18 被阅读0次

    可以用线段的两点式求出线性规划,代入另外两点
    但鉴于代码风格的统一性,这里还是使用书上使用向量外积进行判断的代码,两种方法本质上是一样的,都是分别以一条边为标准(所以需要判断两次),判断另外两个点是否在该边的两侧。

    bool segmentpropersection(Point a1, Point a2, Point b1, Point b2){
        double c1 = Cross(a2-a1, b1-a1), c2 = Cross(a2-a1, b2-a1),
        c3 = Cross(b2-b1, a1-b1), c4 = Cross(b2-b1, a2-b1);
        return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4) < 0;
    }
    

    如果允许出现在端点处呢?那就需要再进一步的讨论:
    如果c1,c2都等于0,则两线段共线,有可能部分重叠;若不都为0,则必然只有一种相交情况,即某个端点再另一条线段上,用如下代码进行判断(不含端点,因为端点重合的话可以直接看出来...):

    bool onsegment(Point P, Point a1, Point a2){
        return dcmp(Cross(a1-P, a2-P)) == 0 && dcmp(Dot(a1-P, a2-P)) < 0;
        //第一个条件用来判断点在直线上,第二个条件用来判断点在被两天垂足为AB端点的直线围成的区域内
        //合在一起用来判断点在线段上 
    }
    

    相关文章

      网友评论

          本文标题:线段判定相交(规范相交)

          本文链接:https://www.haomeiwen.com/subject/bffheftx.html