本文使用 Zhihu On VSCode 创作并发布
本文主要介绍如何求解多条线的交点(如果没有共同的交点,则寻找离多条线最近的点)。本文将分为以下几个部分:
- 求解思路
- 代码实现
- 总结
一、求解思路
在空间中确定一条直线只需要两个点
其中
其实两者是等价的。
1.1 两条直线的交点
先从简单的问题讲起,对于求解两根线的交点:
假设
这是个超定方程,通过最小二乘的方式则可以求解
其中:
得到
1.2 两条直线的交点,另外一种表达方式
同样对于两条直线:
假设
我们假设
那么我们定义
通过矩阵运算,我们可以求解
1.3 多条直线的交点
这一部分描述的方法来自论文 "Nearest approaches to multiple lines in n-dimensional space"。
上面描述的解释方式可以很好的扩展到任意大于两条直线的情况,同时也可以扩展到更高维度的情况下,接下来将描述一下求解三条直线求解交点的情况:
在这种情况下
对于
二、代码实现
了解了数学原理之后,代码实现则非常简单,本文提供上述思路的python实现版本,只需要numpy依赖库。
import numpy as np
def intersection_of_multi_lines(strt_points, directions):
'''
strt_points: line start points; numpy array, nxdim
directions: list dierctions; numpy array, nxdim
return: the nearest points to n lines
'''
n, dim = strt_points.shape
G_left = np.tile(np.eye(dim), (n, 1))
G_right = np.zeros((dim*n, n))
for i in range(n):
G_right[i*dim:(i+1)*dim, i] = -directions[i, :]
G = np.concatenate([G_left, G_right], axis=1)
d = strt_points.reshape((-1, 1))
m = np.linalg.inv(np.dot(G.T, G)).dot(G.T).dot(d)
# return m[0:dim]
return m
if __name__ == '__main__':
##########################################################################################
##test case
strt_point = np.zeros((2, 3))
strt_point[0, :] = np.array([0, 0, -10])
strt_point[1, :] = np.array([-10, 0, 0])
directions = np.zeros((2, 3))
directions[0, :] = np.array([1, 0, 0])
directions[1, :] = np.array([0, 1, 0])
inters = intersection_of_multi_lines(strt_point, directions)
print('[DEBUG] intersection {}'.format(inters))
读者可以自己尝试一下,使用不同的数量的直线,求解相邻最近的点。下图展示了一些求解结果,结果图来自[1].
三、总结
本文主要描述了一下怎么求解与多条直线相邻最近的点的方法,从最简单的两条直线引入问题的基础解法,然后描述了一种可以扩展到多条直线,更高维度的方法,并且提供了代码实现。
参考
[1] https://books.google.co.kr/
[2] https://www.crewes.org/ForOurSponsors/ResearchReports/2010/CRR201032.pdf