Кватернионное деление и тангенс гиперболического танга
Умножение кватернионов четко определено и известно мне как "произведение Гамильтона":
// hamilton product
vec4 qmul(in vec4 q1, in vec4 q2) {
return vec4(
q1.w * q2.xyz + q2.w * q1.xyz - cross(q1.xyz, q2.xyz),
q1.w*q2.w - dot(q1.xyz, q2.xyz)
);
}
Однако для реализации qtanh()
кватернионная функция, нам нужно деление. Пока я нашел это, и это работает хорошо. Не могли бы вы помочь мне понять, откуда это?
// division
// https://www.boost.org/doc/libs/1_67_0/boost/math/quaternion.hpp
vec4 qdiv(in vec4 q1, in vec4 q2) {
float denominator = dot(q2,q2);
return vec4(
vec3(
-q1.w*q2.x+q1.x*q2.w-q1.y*q2.z+q1.z*q2.y,
-q1.w*q2.y+q1.x*q2.z+q1.y*q2.w-q1.z*q2.x,
-q1.w*q2.z-q1.x*q2.y+q1.y*q2.x+q1.z*q2.w
),
q1.w*q2.w + dot(q1.xyz, q2.xyz)
) / denominator;
}
Кроме того, насколько я пытаюсь реализовать tanh().. знаете ли вы больше о вычислительном НДС, чем о делении sinh и cosh? Для реалов я использовал следующую формулу: tanh(x)=-1+2/(1+exp(-x))
, И это включает только одно экспоненциальное исчисление, а не два..
1 ответ
1. Отдел
Разделение кватерниона с именем p на кватернион с именем q является не чем иным, как умножением p на обратную величину q.
Это эквивалентно умножению p на сопряжение q (которое по определению равно a - bi - cj - dk) и делению произведения на скаляр, равный квадрату q нормы:
Отсюда очевидно, где это denominator
часть исходит от:
Теперь давайте изменим условия в vec3
суммы для лучшей читаемости:
vec3(
-q1.w*q2.x + q1.x*q2.w - (q1.y*q2.z - q1.z*q2.y),
-q1.w*q2.y + q1.y*q2.w - (q1.z*q2.x - q1.x*q2.z),
-q1.w*q2.z + q1.z*q2.w - (q1.x*q2.y - q1.y*q2.x)
)
И теперь внезапно становится ясно, что происходит:
vec3(
-q1.w * q2.x + q1.x * q2.w - (q1.y*q2.z - q1.z*q2.y),
-q1.w * q2.y + q1.y * q2.w - (q1.z*q2.x - q1.x*q2.z),
-q1.w * q2.z + q1.z * q2.w - (q1.x*q2.y - q1.y*q2.x)
)
...
-q1.w * q2.xyz + q1.xyz * q2.w - (cross(q1.xyz, q2.xyz))
Так что да, кватернионное деление - это просто обычное умножение, с умножением, являющимся взаимным. Вот откуда берутся минусы, см. Определение выше.
2. Гиперболический тангенс
Во-первых, определения. Для каждого q = a + bi + cj + dk = a + v̅:
Итак, чтобы получить eq и e–q, вам нужно только вычислить следующие значения: ea, || v̅ ||, грех (|| v̅ ||), cos (|| v̅ ||).
Чтобы вычислить e–q, вы должны взять обратную величину ea и умножить ее на остаток уравнения с инвертированными знаками. Это не займет много времени, поскольку все значения, из которых он состоит, уже вычислены. Один exp()
звоните, как и просили =)