Повернуть одну 3D систему координат в другую - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть набор точек в одной системе координат, и я хочу повернуть их в другую систему координат в Python. На основе этого ответа я написал следующую Python функцию:

def change_of_basis(points, initial, final):
    '''
    rotate points/vectors in a 3D coordinate system to a new coordinate system

        input: m x 3 array of points or vectors that have to be transformed from the initial to the final csys
        initial: sequence of sequences of floats representing the normalized axis of the csys that has to be transformed
        final: sequence of sequences of floats representing the normalized axis of the csys to which has to be transformed

        return: the points/vectors in the new coordinate system
    '''
    x1, y1, z1 = initial
    x2, y2, z2 = final

    M11, M12, M13 = np.dot(x1, x2), np.dot(x1, y2), np.dot(x1, z2)
    M21, M22, M23 = np.dot(y1, x2), np.dot(y1, y2), np.dot(y1, z2)
    M31, M32, M33 = np.dot(z1, x2), np.dot(z1, y2), np.dot(z1, z2)

    # set up rotation matrix
    R = np.array([[M11, M12, M13],
                  [M21, M22, M23],
                  [M31, M32, M33]])

    return np.linalg.inv(R).dot(points)

Рабочий пример:

  initial =  [[ 0.98078528  0.         -0.19509032]
             [-0.19509032  0.         -0.98078528]
             [ 0.          1.          0.        ]]

  final =  [[ 0.83335824 -0.08626633 -0.54595986]
            [-0.55273325 -0.13005679 -0.82314712]
            [ 0.          0.98774564 -0.15607226]]


   new_cys = change_of_basis(initial, initial, final )

Построение графика дает результат, представленный ниже. Намерение состоит в том, чтобы преобразовать красно-оранжевую систему координат в желтую, но в результате получается синяя система координат. Кто-нибудь может увидеть, какую ошибку я совершаю и как это исправить?

enter image description here

РЕДАКТИРОВАТЬ: Он работал для преобразования системы координат. Я сменил функцию выше на ту, что имею сейчас. Это позволяет мне преобразовать красный в желтую систему координат. Теперь мне нужно преобразовать набор точек в первой (красной) системе координат в набор точек во второй (желтой) системе координат. Я думал, что эта функция будет работать, но это не так, отличается ли преобразование для набора точек?

1 Ответ

0 голосов
/ 03 апреля 2020

Я не специалист по линейной алгебре, но я думаю, что ваша ошибка в том, что вы не инвертировали исходную систему координат.

Если A и B - ваши базисные матрицы, вы вычисляете A * B, но что вам нужно вычислить A ^ {- 1} * B.

Что имеет смысл - вы умножаете на A ^ {- 1}, чтобы преобразовать в стандартную основу из A, а затем умножаете на B, чтобы преобразовать в из стандартное основание для B.

Вот еще один SO-ответ, в котором говорится о реализации этого: Изменение базиса в numpy

EDIT: специфично, что эта версия работала для система координат. Это не R, вам нужно инвертировать. Вы вычисляете R = A * B, поэтому, инвертируя R, вы получаете A ^ {- 1} * B ^ {- 1}. Сначала нужно инвертировать A, , а затем умножить.

...