Средние 3D пути - PullRequest
       31

Средние 3D пути

1 голос
/ 17 сентября 2011

У меня есть два пути в 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).

Любая помощь будет оценена.

Ответы [ 4 ]

3 голосов
/ 17 сентября 2011

В 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
3 голосов
/ 17 сентября 2011

Простой метод заключается в следующем ...

Сначала создайте функцию 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 из двух длительностей.

Также легко изменить этот подход, чтобы получить средневзвешенный путь.

2 голосов
/ 17 сентября 2011

Есть определенно такая вещь. Для каждой точки на пути A найдите точку, которая соответствует вашей текущей точке на пути B, а затем найдите среднюю точку между этими соответствующими вершинами. Затем вы получите путь между двумя, который является «средним» из двух путей. Если у вас есть несоответствие, когда вы не сэмплировали два пути одинаково, то для внутренней точки на пути A (т. Е. Не для конечной точки) найдите две ближайшие выборочные точки с одинаковой временной выборкой на пути B, и найдите среднюю точку треугольника, который составят эти три точки.

Теперь, поскольку вы разделили свой путь, выбрав его, это «среднее» будет только приблизительным, а не «истинным» средним, как вы могли бы сделать, решая для функции среднего между двумя дифференцируемыми параметрическими функциями, определенными как r(t) = <x(t), y(t), z(t)>.

1 голос
/ 17 сентября 2011

Расширение ответа @ 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
...