2011-09-17 72 views
1

我有三条3D路径,我想“平均”它们,如果有这样的事情。平均3D路径

我在他们取样的时间时戳的XYZ对:

ms x y z 
    3 0.1 0.2 0.6 
    12 0.1 0.2 1.3 
    23 2.1 4.2 0.3 
    55 0.1 6.2 0.3 

事实有关的路径:

  • 他们都开始和结束上/同一XYZ点附近。
  • 我有完成路径所需的总时间以及单个顶点
  • 它们具有不同的长度(即不同数量的xyz对)。

任何帮助,将不胜感激。

+0

PS我想在R中完成所有这些:/ – Jubei

+0

平均值是什么意思?为了获得质量中心,平滑它们,或者将它们插值到其他时间值? – rocksportrocker

回答

1

扩展@ 6502的答案。

如果您希望检索构成平均路径的点列表,可以在各个输入点的实例中对avg函数进行采样。(朝向平均长度拉伸)

def avg2(T1, waypoints1, T2, waypoints2): 
    # Collect the times we want to sample at 
    T = (T1 + T2)/2 
    times = [] 
    times.extend(t*T/T1 for (t,x,y) in waypoints1) # Shift the time towards 
    times.extend(t*T/T2 for (t,x,y) in waypoints2) # the average 
    times.sort() 

    result = [] 
    last_t = None 
    for t in times: 
     # Check if we have two points in close succession 
     if last_t is not None and last_t + 1.0e-6 >= t: 
      continue 
     last_t = t 

     # Sample the average path at this instance 
     x, y = avg(t, T1, waypoints1, T2, waypoints2) 
     yield t, x, y 
2

确实有这样的事情。对于路径A上的每个点,找到与路径B上当前点对应的点,然后找到这些对应点之间的中点。然后,您将在两条路径的“平均”之间获得一条路径。如果在没有采样两条路径相同的情况下出现不匹配,则对于路径A上的内部点(即不是终点),找到路径上具有类似时间采样的两个最接近的采样点B,并找出这三点将会形成的三角形的中点。

现在,由于您已通过采样对路径进行了设置,因此该“平均值”仅仅是一个近似值,而不是“真正的”平均值,就像您可以通过求解定义的两个可微分参数函数之间的平均函数通过r(t) = <x(t), y(t), z(t)>

3

的简单方法是以下...

首先构建给定当前时间t函数interp(t, T, waypoints),总的持续时间的路径和T返回waypoints当前位置的路径。这可以使用线性插值或更复杂的方法来完成,以避免速度或加速度不连续性。

一旦有了interp平均路径可以被定义为(在python示例)

def avg(t, T1, waypoints1, T2, waypoints2): 
    T = (T1 + T2)/2 
    return middlePoint(interp(t*T1/T, T1, waypoints1), 
         interp(t*T2/T, T2, waypoints2)) 

平均路径的持续时间将是两个持续时间的平均T = (T1 + T2)/2

这也很容易改变这种做法加权平均路径。

3

在R,在一系列连续的点之间的距离假设它是在名为数据帧“DAT” 将是:

with(dat, sqrt(diff(x)^2 +diff(y)^2 +diff(z)^2)) 
#[1] 0.700000 4.582576 2.828427 

有几个我可以想到平均距离的平均值,平均每单位时间的距离。取决于你想要的。这给出了在三个区间内的平均速度:

with(dat, sqrt(diff(x)^2 +diff(y)^2 +diff(z)^2) /diff(ms)) 
#[1] 0.07777778 0.41659779 0.08838835