我有一个相对简单的问题,我知道答案,但我似乎无法使用 Python 和 Numpy 找到正确的实现。我的想法是,我有两条线,我需要找到虚拟交点(我使用了 https://www.youtube.com/watch?v=kCyoaidiXAU&t=313s 中的示例)。
两条线的形式都是 r = r0 + t*V,其中 r0 是位置向量(线经过的点),t 是变量,V 是方向向量。方向向量 V 可以简单地通过找到通过直线的两个点的向量来找到,例如V = A - B。
这样,就可以将该行表示为:
L1 = r0(已知点)+ t(未知变量)* V(方向向量)
现在,我可以轻松地手动找到 t,但我不知道如何告诉 Python。我尝试了 numpy.linalg.solve,但这给了我一个矩阵,而我需要一个值。
例如:
# Line A and Line B that intersect somewhere
A = LineString([(4., 0.), (4., -3.)])
B = LineString([(6., 2.), (10., 2.)])
# direction vectors for line A and B
v1 = (A[0].x - A[1].x, A[0].y, A[1].y) # --> [0,3]
v2 = (B[0].x - B[1].x, B[0].y, B[1].y) # --> [-4,0]
L1 = A[1] + x * v1
L2 = B[1] + y * v2
现在,我将通过求解 x 的 L1 来手动解决此问题:
L1 = [4, 0] + x * [0, 3] = [4, 3x]
L2 = [6, 2] + y * [-4, 0] = [6-4y, 2]
# finding intersection point by solving L1 = L2
4 = 6-4y & 3x = 2
y = 1/2 & x = 2/3
但我不知道如何告诉 numpy/python 如何求解 x 和 y。
任何正确方向的帮助或指导将不胜感激。
最佳答案
通过 A0 和 A1 的直线具有参数方程 (1-t)*A0 + t*A1
,其中 t 是参数。
通过 B0 和 B1 的直线具有参数方程 (1-s)*A0 + s*A1
,其中 s 是参数。将它们设置为相等,我们得到系统 (A1-A0)t + (B0-B1)s == B0-A0
。因此,右侧是 B0-A0,矩阵具有列 A1-A0 和 B0-B1。该系统可以用np.linalg.solve
解决。完整示例:
A = np.array([[4, 0], [4, -3]])
B = np.array([[6, 2], [10, 2]])
t, s = np.linalg.solve(np.array([A[1]-A[0], B[0]-B[1]]).T, B[0]-A[0])
print((1-t)*A[0] + t*A[1])
print((1-s)*B[0] + s*B[1])
两个打印命令输出 [4., 2.]
确认正确性。 (第二个打印确实多余。)
关于python - Python 中的线与线相交与 numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44631259/