Я могу вспомнить пару разных сценариев, о которых вы могли бы спросить.
Дано: Существующая ранее система координат
В 2D-системе ваши оси / основы всегда имеют оси [1,0]
и [0,1]
- x и y .
В трехмерной системе ваши оси / основы всегда [1,0,0]
, [0,1,0]
и [0,0,1]
- x , y и г .
Дано: Одна ось в двумерной системе координат с произвольной базой
Если у вас есть одна ось в двухмерной системе координат произвольного базиса, другая ось является ортогональным вектором.
Чтобы повернуть вектор ортогонально против часовой стрелки :
[x_new, y_new] = [ -y_old, x_old]
Чтобы повернуть вектор ортогонально по часовой стрелке :
[x_new, y_new] = [ y_old, -x_old]
Подведем итог:
Given: x-axis = [ a, b]
Then: y-axis = [-b, a]
Given: y-axis = [ c, d]
Then: x-axis = [ d, -c]
Дано: Две оси в произвольной трехмерной системе координат
Для этого найдите перекрестное произведение.
[a,b,c] x [d,e,f] = [ b*f - c*e, c*d - a*f, a*e - b*d ]
Следуя этим трем рекомендациям:
- ( x ось) x ( y ось) = ( z ось)
- ( y ось) x ( z ось) = ( x ось)
- ( z ось) x ( x ось) = ( y ось)
Дано: Одна ось в произвольной трехмерной системе координат
Недостаточно информации, чтобы найти уникальное решение этой проблемы. Это связано с тем, что если вы посмотрите на второй случай (одна ось в двухмерной системе координат с произвольной базой), вам сначала нужно найти ортогональный вектор. Однако существует бесконечное количество возможных ортогональных векторов для одной оси в трехмерном пространстве!
Однако вы можете найти одно из возможных решений.
Один из способов найти произвольный один из этих ортогональных векторов, найдя любой вектор [d,e,f]
, где:
[a,b,c] = original axis
[d,e,f] = arbitrary orthogonal axis (cannot be [0,0,0])
a*d + b*e + c*f = 0
Например, если ваша исходная ось [2,3,4]
, вы должны решить:
2 * d + 3 * e + 4 * f = 0
То есть любое значение [d,e,f]
, которое удовлетворяет этому, является удовлетворительным ортогональным вектором (при условии, что это не [0,0,0]
). Можно выбрать, например, [3,-2,0]
:
2 * 3 + 3 *-2 + 4 * 0 = 0
6 + -6 + 0 = 0
Как видите, одна "формула", которая работает, - это [d,e,f] = [b,-a,0]
... но есть и много других, которые могут работать; Есть, на самом деле, бесконечность!
Как только вы найдете две оси [a,b,c]
и [d,e,f]
, вы можете уменьшить это до предыдущего случая (случай 3), используя [a,b,c]
и [d,e,f]
в качестве осей x и y (или любых осей, которые вы они нужны для вашей конкретной проблемы).
Нормализация
Обратите внимание, что, поскольку вы постоянно делаете точечные продукты и перекрестные продукты, ваши векторы будут становиться все больше и больше. В зависимости от того, что вы хотите, это может быть нежелательно. Например, вы можете захотеть, чтобы ваши базисные векторы (ваши оси координат) были одинакового размера / длины.
Чтобы превратить любой вектор (кроме [0,0,0]
) в единичный вектор (вектор длиной 1, в том же направлении, что и исходный вектор):
r = [a,b,c]
v = Sqrt(a^2 + b^2 + c^2) <-- this is the length of the original vector
r' = [ a/v , b/v , c/v ]
Где r'
представляет единичный вектор r
- вектор длиной 1, который указывает в том же направлении, что и r
. Пример:
r = [1,2,3]
v = Sqrt(1^2 + 2^2 + 3^2) = Sqrt(13) = 3.60555 <-- this is the length of the original vector
r' = [0.27735, 0.55470, 0.83205]
Теперь, если бы я хотел, например, вектор в том же направлении r
с длиной 5, я бы просто умножил r' * 5
, то есть [a' * 5, b' * 5, c' * 5]
.