1

This question is closely related to angle and plane of rotation in 3D geometric algebra. For example, Doran & Lasenby already showed a proof for the 3D case, but things are a bit different in 4D.

In general, a rotor in 4D consists of a scalar, 6 bivectors and one four-vector (in 3D, a rotor is just composed of a scalar and 3 bivectors). Then, assume that we already know two 4-dimensional vectors and one is a rotated version of the other. How is it possible to derive a similar expression for the rotor? does it exist? If so, could a general expression for n dimensions be obtained?

cqfd
  • 12,974
  • See https://math.stackexchange.com/q/3312044/472818 – mr_e_man Dec 09 '20 at 01:36
  • The solution was provided in https://www.researchgate.net/post/4D_rotations_and_rotors_can_a_general_expression_be_derived Edited 20-jan-22: the right solution was updated in researchgate. – paketecuento Dec 09 '20 at 22:44

1 Answers1

0

Yes, this is possible, and it does generalize to N dimensions with geometric algebra.

First, calculate the geometric algebra vector product of the two vectors, which results in scalar and bivector parts (1 scalar number and 6 bivector numbers). The scalar is the dot product of the two vectors, and the bivector is formed by the wedge product, which looks similar to the cross product (ex: xy = a.x * b.y - a.y * b.x). We call the combination of scalar and bivector a rotor.

This operation gives us a rotor that rotates by twice the angle between the two vectors. Therefore, if we want a rotor that rotates from one to the other, we need to get a rotor with half the angle. You can compute the normalized bivector and rotation angle from the rotor, then multiply that angle by 0.5 and construct a new rotor. Here is some C++ code for how to do that part:

Rotor4D Rotor4D::half_angle() const {
    double_t angle = Math::acos(scalar);
    double_t sin_angle = Math::sin(angle);
    double_t fractional_angle = 0.5 * angle;
    double_t new_scalar = Math::cos(fractional_angle);
    double_t new_sin_angle = Math::sin(fractional_angle);
    Bivector4D new_bivector = bivector * (new_sin_angle / sin_angle);
    return Rotor4D(new_scalar, new_bivector).normalized();
}

This formula is dimension-agnostic, and works in any dimension. The resulting rotor can be used to rotate any 4D vector.