python求两条线段的交点

本来想找一段求线段交点的代码,但是网上很多的代码都没有考虑除0的特殊情况,所以自己写了一份。具体原理:

一般方程法:

直线的一般方程为F(x) = ax + by + c = 0。既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0。

因此我们可以将两条直线分别表示为

F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0

那么两条直线的交点应该满足

a0*x + b0*y +c0 = a1*x + b1*y + c1

由此可推出

x = (b0*c1 – b1*c0)/D

y = (a1*c0 – a0*c1)/D

D = a0*b1 – a1*b0, (D为0时,表示两直线重合)

二者实际上就是连立方程组F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0的叉积应用

原理参考了:https://blog.csdn.net/hktkfly6/article/details/69218777?utm_source=copy

 

    def _calulate_corss_lines(line0_pos0, line0_pos1, line1_pos0, line1_pos1):

        """

        求两条直线直接的交点

        :param line0_pos0: 第一条直接的第一个点的坐标

        :param line0_pos1: 第一条直接的第二个点的坐标

        :param line1_pos0: 第二条直接的第一个点的坐标

        :param line1_pos1: 第二条直接的第二个点的坐标

        """

        # x = (b0*c1 – b1*c0)/D

        # y = (a1*c0 – a0*c1)/D

        # D = a0*b1 – a1*b0, (D为0时,表示两直线重合)

        line0_a =line0_pos0.y - line0_pos1.y

        line0_b = line0_pos1.x - line0_pos0.x

        line0_c = line0_pos0.x *line0_pos1.y - line0_pos1.x * line0_pos0.y

        line1_a =line1_pos0.y - line1_pos1.y

        line1_b = line1_pos1.x - line1_pos0.x

        line1_c = line1_pos0.x *line1_pos1.y - line1_pos1.x * line1_pos0.y

        d = line0_a * line1_b - line1_a * line0_b

        if d == 0:

            # 重合的边线没有交点

            return None

        x = (line0_b * line1_c - line1_b * line0_c) * 1.0 / d

        y = (line0_c * line1_a - line1_c * line0_a) * 1.0 / d

        pt = cc.Vec2(x, y)

        print 'pt=', pt

        if (pt.x - line0_pos0.x) * (pt.x - line0_pos1.x) <= 0 and (pt.x - line1_pos0.x) * (pt.x - line1_pos1.x) <= 0:

            # 判断交点是否在两条线段上

            return pt

        else:

            # 交点不在两条线段上除外

            return None


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部