找到与一组3D线的最近点



这个问题使我陷入困境。

我有一组线,这些线是从某些数据产生形式的3D行的数据中形成的:

p = a d t

而a是位置向量,d是单位方向向量。

基本上,我想使用最小二乘拟合,从而找到与所有这些线的最近点。我一直无法在线找到算法或如何在Java中实施它。我使用vector3D或realvector的Apache Commons数学库来计算行方程。因此,对解决此问题的算法或示例代码的任何帮助将有所帮助。

假设您想最大程度地减少平方距离的总和,并假设wlog wlog为单位 d 是单位,则总平方距离为

σ(( AP )²-( AP d

当总和接管所有( a d )行。

该表达式的梯度为

σ(2 ap -2( ap

通过取消它,我们在 p 中获得了一个线性系统。

@yvesdaoust的扩展版本答案:

给定参数线:

L(t) = A + t D

其中d是单位向量,即d•d = 1

点P到线L的距离为:

t = D • (P - A)

在最小二乘意义上,最接近一组线的点P是最小化误差之和e:

E = (P - L(t))^2
E = (P - (A + tD))^2
E = (P - A - tD)^2
E = (P - A - (D • (P - A))D)^2
E = (P - A - (D•P - D•A)D)^2
E = (P - A - (D•P)D + (D•A)D)^2
E = (P - (D•P)D - A + (D•A)D)^2
E = (P - (D D^T)P - A + (D•A)D)^2
E = ((I - (D D^T)) P - A + (D•A)D)^2
E = (C x - b)^2

其中

C = I - (D D^T)
x = P
b = A - (D•A)D

其中" i"是3x3身份矩阵。最小二乘解决方案是:

C^T C x = C^T b

衍生同一系统的其他方法是采用方程式的导数:

E = (P - A - tD)^2
E = P•P - 2 P•A - 2t P•D + A•A + 2t A•D + t^2

采用有关p的导数并简化我们得到的(请记住在服用" t"的导数时应用链条规则,因为它是p的函数):

dE/dP = 2(P - A  - ((P - A) • D) D)

将其等于零:

dE/dP = 0
2(P - A  - ((P - A)•D) D) = 0
P - ((P - A)•D) D = A
P - (P•D) D + (A•D) D = A
P - (P•D) D = A - (A•D) D
P - (D D^T) P = A - (A•D) D
(I - D D^T) P = A - (A•D) D

其中" i"是3x3身份矩阵。这再次是形式c x = b的线性系统。

请记住,您仍然需要将总和应用于等式的两侧,所以确实是:

Sum(C^T C) x = Sum(C^T b)

所以最后:

x = Sum(C^T C)^-1 Sum(C^T b)

最新更新