2011-09-17 115 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