2017-06-19 46 views
0

我有一个相对简单的问题,我知道答案,但我似乎无法找到使用Python和Numpy的正确实现。这个想法是,我有两条线,我需要找到虚拟的交点(我使用https://www.youtube.com/watch?v=kCyoaidiXAU&t=313s的例子)。Python与numpy的直线交叉

两条线的形式为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 

现在,我将手动解决这个通过求解L1为X:

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的/蟒蛇如何解决对于x和y。

任何帮助或指导在正确的方向将不胜感激。

+1

相关:https://stackoverflow.com/q/41797953/67579 –

+0

你说“与numpy”,但我没有看到任何numpy在这里。你想要一个numpy解决方案吗?或者这不是必要的? –

+0

如果可能没有,很好,但我已经尝试Numpy.linalg.solve,所以我认为numpy会有功能来做这样的事情。 – Matthie456

回答

0

通过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.]确认正确性。 (第二次打印它真的是多余的。)