Python:已知两条直线求其交点

什么?两直线求交点?这不是初中数学吗??还需要专门写一个算法?
我第一看到这个问题也是这样想的,觉得简直不要太简单,相信如果是在试卷上用笔算一定是半分钟解决的问题,可就是这简简单单的初中题目想要呈现在程序中却足足花了我两个小时。
我第一次遇到这个问题是在做线性拟合模型的时候,两条线性模型交汇于一点,只要求出交点就可以精确的求出影响转折点:(我觉得可能这个算法的应用都在这个领域吧)
20201126232408854.png
python中还没有能直接表示一条线的类型,因此我们要表示一条直线,应该用什么方法呢?我首先想到的是用两点,因为两点确定一条直线,那么只需要两个坐标,我们就可以确定一条直线。所以我首先把两条直线的x轴和y轴的所有点都打印了出来,随便选两个坐标(最笨的方法)
A,B表示蓝色直线上的两点,可以确定这条线
C,D表示红色直线上的两点,可以确定这条线
20201126232859753.png
接下来就是核心算法了,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#已知两直线(直线上的两点)求交点的算法:
def line_intersection(line1, line2): #传入元组
xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1])

def det(a, b):
return a[0] * b[1] - a[1] * b[0]

div = det(xdiff, ydiff)
if div == 0:
raise Exception('lines do not intersect')

d = (det(*line1), det(*line2))
x = det(d, xdiff) / div
y = det(d, ydiff) / div
return x, y

需要注意的是,传入的两个点要用元组的形式表示。

1
2
3
#得出交点:
intersection_point = line_intersection((A,B),(C,D))
print(line_intersection((A, B), (C, D)))

20201126233526766.png