python - Python 中的线与线相交与 numpy

标签 python numpy vector

我有一个相对简单的问题,我知道答案,但我似乎无法使用 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/

相关文章:

python - 如何计算给定波的频率和时间

C++如何将排序的 vector 合并到排序的 vector 中/从所有 vector 中弹出最少的元素?

python - tkinter 按钮单击启动线程以防止 GUI 卡住

python - 使用 python 3 在 docx 文件中插入注释

python - 将数据框单元格作为变量传递

python - translate() 只接受一个参数(给定 2 个)

python - 创建一个具有时间步长和多个特征的新数组,例如 LSTM

python - Python 中的语法 (.T)

c++ - 无法修改类中的对象 vector

C++ 移入容器