Кватернионное деление и тангенс гиперболического танга - PullRequest
6 голосов
/ 19 апреля 2019

Умножение кватернионов хорошо определено и известно мне как «продукт Гамильтона»:

// 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 Ответ

4 голосов
/ 19 апреля 2019

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̅ :

Итак, чтобы получить e q и e –q , вам нужно только вычислить следующие значения: e a , || v̅ || , sin (|| v̅ ||) , cos (|| v̅ ||) .

Для вычисления e –q вы должны взять обратную величину, равную e a и умножить ее на остаток уравнения с знаки перевернуты. Это не займет много времени, поскольку все значения, из которых он состоит, уже вычислены. Один exp() звонок по запросу =)

...