Как преобразовать координату в одной декартовой системе координат в другую декартову систему координат

Я начинаю с одной системы координат и точки вдоль оси Z, заданной как P1 = [0 0 h], и точки в плоскости XY, заданной как P2 = [h * tan (A), h * tan (B), 0] Затем я решаю уравнение плоскости, перпендикулярной вектору, который указывает от P2 к P1, так что Vector = P1 - P2. Я получаю следующее уравнение плоскости:

Х * ч * загар (А) -У * ч * загар (В) + Z * ч = 0.

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

Четыре точки образуют прямоугольник:

[L*tan(C), L*tan(D), 0]
[L*tan(C), -L*tan(D), 0]
[-L*tan(C), -L*tan(D), 0]
[-L*tan(C), L*tan(D), 0]

Как именно мне преобразовать эти точки в исходную систему координат? Я знаю, что здесь задействованы перевод и вращение, и когда я изумленно посмотрел на свою проблему, я смог найти только отдельные случаи перевода и вращения, и ни один из них не был комбинацией этих двух.

Как именно работает вращательное преобразование? Что, если я уже знаю, что он вращается вокруг оси X на A градусов и вокруг оси Y на B градусов? Могу ли я тогда просто выполнить простой триггер для обратного отслеживания значения? Или это не так просто, и мне нужно повернуть его вокруг оси, которую он должен вращать, чтобы вернуться к исходной системе координат?

Есть ли в MATLAB функция, в которую я могу вставить, скажем, 3 точки, которые определяют одну систему координат, и еще 3 точки для второй системы координат, которая затем дала бы мне матрицы преобразования?

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


person Niseonna    schedule 14.01.2014    source источник
comment
Можем ли мы упростить вопрос? Возможно: учитывая точку в системе координат, определяемой началом O1 и 3 ортогональными единичными векторами X1, Y1 и Z1 (так что Z1 = X1 x Y1), как я могу выразить эту точку в другой системе координат, задаваемой O2, X2, Y2 и Z2 (где X2, Y2 и Z2 также определяют правый ортонормированный базис)? Если вы зададите вопрос, похожий на этот, нам не нужно вдаваться в подробности вашего варианта использования, и этот вопрос может помочь другим читателям. Это близко к тому, что вам нужно?   -  person Codie CodeMonkey    schedule 15.01.2014
comment
Да, я думаю, этого будет достаточно.   -  person Niseonna    schedule 16.01.2014


Ответы (1)


Отвечая на урезанную версию вопроса (см. Комментарии):

Точка, выраженная в системе координат, заданной начальной точкой O1 с векторами осей X1, Y1 и Z1, имеет координаты P=(x1, y1, z1) в этой системе координат. Точно так же во второй координате с началом O2 и векторами осей X2, Y2 и Z2 одна и та же точка выражается P=(x2, y2, z2). (Обратите внимание на нижний регистр для координат, верхний регистр для точек и векторов).

На самом деле это означает:

P = O1 + x1 X1 + y1 Y1 + z1 Z1   and
P = O2 + x2 X2 + y2 Y2 + z2 Z2

Устанавливая их равными друг другу и записывая их в матричной форме:

[ O11 ]   [ X11  X12  X13 ][ x1 ]   [ O21 ]   [ X21  X22  X23 ][ x2 ]
[ O12 ] + [ Y11  Y12  Y13 ][ y1 ] = [ O22 ] + [ Y21  Y22  Y23 ][ y2 ]
[ O13 ]   [ Z11  Z12  Z13 ][ z1 ]   [ O23 ]   [ Z21  Z22  Z23 ][ z2 ]

Давайте назовем матрицы на каждой стороне M1 и M2 соответственно, будем использовать исходные точки в качестве векторов столбцов и назовем векторы точек столбцов p1 и p2. Тогда мы можем записать предыдущее уравнение как:

O1 + M1 p1 = O2 + M2 p2

Если ваши оси координат для каждой системы линейно независимы, то M1 и M2 обратимы. Если к тому же они ортогональны, то обратное для каждого из них просто транспонировано! Получаем:

p1 = Transpose[M1] (O2 - O1 + M2 p2)   and similarly going the other way
p2 = Transpose[M2] (O1 - O2 + M1 p1)

Вы можете прочитать более общее описание смены основы здесь, но я думаю, что мое упрощенное лечение поможет вам писать код быстрее.

person Codie CodeMonkey    schedule 16.01.2014