Как создать ортогональный базис на основе двух почти перпендикулярных векторов?

Я пытаюсь создать ортогональную систему координат на основе двух «почти» перпендикулярных векторов, которые выводятся из медицинских изображений. У меня есть два вектора, например:

Z=[-1.02,1.53,-1.63];
Y=[2.39,-1.39,-2.8];

которые почти перпендикулярны, так как их внутренний продукт равен 5e-4.

Затем я нахожу их векторное произведение, чтобы создать третью основу:

X=cross(Y,Z);

Даже этот третий вектор не полностью ортогонален Z и Y, так как их внутренние произведения имеют порядок -15 и -16, но я думаю, что это почти нуль. Чтобы использовать этот набор векторов в качестве ортогональной основы для локальной системы координат, я предполагаю, что они должны быть почти полностью перпендикулярны. Сначала я подумал, что могу сделать это, округлив свои векторы до менее десятичных цифр, но не помогло. Думаю, мне нужно найти способ немного изменить исходные векторы, чтобы сделать их более перпендикулярными, но я не знаю, как это сделать.

Буду признателен за любые предложения.


person roja zak    schedule 01.02.2013    source источник
comment
en.wikipedia.org/wiki/Gram-Schmidt_process может оказаться полезным. Вам не нужно выполнять часть нормализации; в основном, просто вычтите проекцию Y на Z из Z. Обратите внимание, что вы все еще можете не получить точный нуль, потому что числа с плавающей запятой такие.   -  person Danica    schedule 01.02.2013


Ответы (2)


Грам-Шмидт прав, как указывалось выше.

По сути, вы хотите вычесть компонент Y, который находится в направлении Z, из Y (Примечание: в качестве альтернативы вы можете работать с Z вместо Y).

Компонент Y в направлении Z определяется как:

   dot(Y,Z)*Z/(norm(Z)^2)

(проекция Y на Z)

Обратите внимание, что если Y ортогонален Z, то это 0.

So:

   Y = Y - dot(Y,Z)*Z/(norm(Z)^2)

и Z остается неизменным.

person thang    schedule 01.02.2013

пусть V=Y+aZ Z точка V = 0, так что вы можете решить a и получить V Теперь используйте V и Z в качестве основы

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

person Edward    schedule 01.02.2013