C ++找到两个点之间的点集

时间:2018-05-02 14:27:18

标签: c++ math point point-clouds

我有三组2d分。我需要做的是找出一个与其他两个相关的位置。 每组都有相同的点,顺序相同。一个是'中立',一个是'最大',第三个是未知的。我需要的是返回0到1之间的单个值,它说明未知集合在其他两个之间的数量。

例如,在图片中:

points

我会以某种方式获得Set A和Set B之间的'distance'或'weight',然后找出Set C在它们之间的位置。在这个例子中,我预计值约为75%,或0.75。

我已经研究过使用点集注册算法来返回一个比例集以匹配Set C到Set B,但我不相信这是最好的方法。什么方法适合这个问题?我应该搜索哪些算法?

1 个答案:

答案 0 :(得分:0)

您可以尝试通过两组之间的简单线性插值来解决这个问题。如果集合之间的过渡确实几乎是线性的,则这是有效的。如果你知道它是其他东西,你可以调整插值函数。

让我们专注于单一点p。我们知道它在所有集p_Ap_Bp_C中的坐标。然后,我们指定p_C或多或少是带有参数p_A的{​​{1}}和p_B之间的线性插值(其中t表示集合A和{{1}代表集B):

t=0

现在的问题是找到一个约为你所有积分的t=1

我们可以通过将问题陈述为线性最小二乘问题来解决这个问题。即我们希望最小化所有点的总和残差(上式的左侧和右侧之间的差异):

      p_C = (1 - t) * p_A + t * p_B
          = p_A - t * p_A + t * p_B
          = p_A + t * (p_B - p_A)
p_C - p_A = t * (p_B - p_A)

最佳t则是:

arg min_t Σ_i (pi_C.x - pi_A.x - t * (pi_B.x - pi_A.x))^2
               + (pi_C.y - pi_A.y - t * (pi_B.y - pi_A.y))^2

如果您的点具有更高的维度,只需使用相同的模式添加新维度。