Как мне перевести положение движущейся точки в соответствии с контрольной точкой? - PullRequest
0 голосов
/ 06 апреля 2020

Учитывая две движущиеся точки / частицы с позициями в декартовых координатах x, y, z в зависимости от времени, как показано ниже, как мне отцентрировать одну из точек и вычислить результирующие положения второй точки при сохранении их относительного расстояния а ориентация постоянная?

# Given the absolute positions of point 1 (p1) and point 2 (p2): 
p1 = [
    [7.74, 9.48, 9.61],
    [7.02, 8.83, 9.42],
    [7.91, 9.08, 9.56],
    [8.61, 8.92, 9.50],
    [8.87, 9.35, 9.63],
    [7.77, 9.83, 9.86]
]

p2 = [
    [7.90, 10.48, 10.2],
    [8.30, 10.74, 9.59],
    [8.23, 10.24, 9.86],
    [8.15, 10.42, 9.91],
    [8.05, 10.44, 9.92],
    [8.4, 10.78, 10.04]
]

# Center p1. It does not necessarily have to be at (0, 0, 0). 
p1 = [
    [0, 0, 0], 
    [0, 0, 0], 
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0], 
    [0, 0, 0]
]

# Translate p2 so its relative position (distance & orientation) relative to p1 remains constant. 
p2 = []

Интуитивно я бы попытался найти матрицы преобразования и поворота для преобразования. Я посмотрел на scipy.spatial, но не смог найти решение своей проблемы (по крайней мере, которое я мог бы понять).

Как бы я попытался решить эту проблему?

Редактировать 1: Оба точки движутся предположительно независимо друг от друга, поэтому их расстояние + ориентация не должны быть постоянными. Моя цель состоит в том, чтобы проверить это предположение: оказывают ли точки какое-либо влияние друг на друга.
В частности, я хочу вычислить плотность точки 2 относительно точки 1, но для этого вычисления, чтобы иметь смысл, мне нужно, чтобы точка 1 была зафиксирована первой , Надеюсь, что это еще больше проясняет проблему.

1 Ответ

1 голос
/ 06 апреля 2020

Это может быть немного крипти c, если вы не знакомы с линейной алгеброй, но по сути вы можете манипулировать векторами, чтобы вычислить длину и цилиндрическое вращение вектора между двумя точками. Было бы go так:

import numpy as np
from scipy import linalg

p1 = [
    [7.74, 9.48, 9.61],
    [7.02, 8.83, 9.42],
    [7.91, 9.08, 9.56],
    [8.61, 8.92, 9.50],
    [8.87, 9.35, 9.63],
    [7.77, 9.83, 9.86]
]

p2 = [
    [7.90, 10.48, 10.2],
    [8.30, 10.74, 9.59],
    [8.23, 10.24, 9.86],
    [8.15, 10.42, 9.91],
    [8.05, 10.44, 9.92],
    [8.4, 10.78, 10.04]
]

# Transform lists to arrays
a1, a2 = np.array(p1), np.array(p2)
# Get vector from p1 to p2
v = a2 - a1

# Get the norm of all vectors p1p2, i.e. the distance between p1 and p2
n = linalg.norm(v, axis=1)
# Normalize the vectors if need be
unit_v = v / n[:, None]

# Normalize the vectors in xy plane
unit_v_xy = (v / linalg.norm(v[:, 0:2], axis=1)[:, None])[:, 0:2]
# Get angles modulo pi in xy plane
xy_angles = np.column_stack((np.arccos(unit_v_xy[:, 0]), np.arcsin(unit_v_xy[:, 1])))

# Get pitch angle, i.e. angle between vector and z axis
pitch_angles = np.arccos(np.dot(unit_v, np.array([0, 0, 1])))
...