我有两条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
关于路径的事实:
任何帮助都将不胜感激。
答案 0 :(得分:3)
一个简单的方法如下......
首先构建一个给定当前时间interp(t, T, waypoints)
的函数t
,总路径持续时间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
。
更改此方法以制作加权平均路径也很容易。
答案 1 :(得分: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
答案 2 :(得分:2)
肯定有这样的事情。对于路径A上的每个点,找到与路径B上的当前点相对应的点,然后找到这些相应的顶点之间的中点。然后,您将获得两者之间的路径,即两条路径的“平均值”。如果你有一个不匹配的地方,你没有采样相同的两条路径,那么对于路径A上的一个内部点(即,不是终点),找到两个最接近的采样点,在路径上采用类似的时间采样B,找到三点将产生的三角形的中点。
既然你已经通过采样对你的路径进行了抹黑,那么这个“平均值”只会是一个近似值,而不是一个“真实”的平均值,就像通过求解两个可微分参数函数之间的平均函数一样。 r(t) = <x(t), y(t), z(t)>
。
答案 3 :(得分: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