Эффективный способ хранения трехмерного нормального вектора с использованием двух поплавков
Мне нужно хранить нормальные векторы 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)