Эффективный способ хранения трехмерного нормального вектора с использованием двух поплавков

Мне нужно хранить нормальные векторы 3D, то есть векторы (x, y, z) такой, что x^2 + y^2 + z^2 = 1, Но из-за нехватки места я могу использовать только 2 поплавка для его хранения. Таким образом, сохраняя только x а также yтретий компонент может быть вычислен как sqrt(1 - x^2 - y^2)один квадратный корень, два произведения и два вычитания.

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

редактировать

Теперь используя значения (a, b) с a = x - y а также b = x + y,

1 ответ

Решение

Вы можете удовлетворить ваши ограничения пространства, сохраняя векторы через сферические координаты. Как хорошо известно, каждая точка на единичной сфере, т. Е. Каждый единичный вектор, имеет по меньшей мере одну пару сферических координат, характеризующих ее.


Или, если вы хотите что-то запутанное: функция сложного квадрата отображает единичный диск на двойную крышку. Таким образом, вы можете использовать левый полудиск для верхней полусферы и правый полудиск для нижней полусферы.

SphereFromDisk(a,b)
    a2=a*a; b2=b*b; r2=a2+b2; // assert r2 <= 1
    x = a2 - b2;
    y = 2*a*b
    z = sqrt(1-r2*r2)
    if(a<0 or (a=0 and b<0) z=-z
    return (x,y,z)
Другие вопросы по тегам