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