It’s well known that quaternions can be used to represent rotations in 3- and 4-dimensional space. It seems less well known that they can also be used to represent reflections and, in fact, we can derive the representation of rotations from this in a straightforward way (since all rotations can be constructed as a sequence of rotations).
We shall write quaternions
p = x+X
q = y+Y
y are scalars and
Y are 3-vectors. Now quaternion multiplication can be defined as:
pq = (x+X)(y+Y) = (xy - X.Y) + (xY + yX + XxY)
with brackets in the result indicating the scalar and vector parts (and where
XxY are the usual dot and cross product). Quaternion multiplication is associative:
p(qr) = (pq)r = pqr but not commutative (in fact,
pq = qp just when
XxY is zero).
We also define conjugation, the conjugate of
p, which we write as
p̅ is conventional, but I think is harder to read onscreen), is
p with the vector part negated:
p' = x-X
Combining multiplication and conjugation we have:
pq' = (x+X)(y-Y) = (xy + X.Y) + (-xY + yX - XxY)
qp' = (y+Y)(x-X) = (xy + X.Y) + (+xY - yX + XxY) (since
YxX = -XxY)
and adding both equations, the vector parts cancel and we have:
pq' + qp' = 2(xy + X.Y)
xy + X.Y is just the dot product of
q, considered as normal 4-dimensional vectors, so we can write:
pq' + qp' = 2p.q
This nicely relates quaternion algebra directly to the geometry of 4-space and we can now rewrite expressions using dot product purely in terms of quaternion arithmetic (quaternion addition and subtraction and operations with scalars are the same as for ordinary vectors, of course).
So, the usual definition, valid in any dimension, for a reflection in a (hyper)plane with normal
n (assumed to be a unit vector) is:
p → p - 2(p.n)n
we can rewrite as:
p → p - (pn' + np')n = p - pn'n - np'n = p - p - np'n = -np'n
ie. reflection of
n is just
-np'n. Note that a 4-dimensional reflection is in a 3-dimensional hyperplane (or perhaps it is clearer to think of the reflection as being along the normal vector), so vectors parallel to the normal are reversed, vectors orthogonal to the normal (ie. in the normal hyperplane) are unchanged.
Interestingly, the relation
pq' + qp' = 2p.q is also true for complex numbers (with the usual complex multiplication and conjugation) and we have exactly the same represention for a 2-dimensional reflection, but we can further simplify using the commutativity of complex multiplication:
z → z - 2(z.n)n = -nz'n = -n²z'
Returning to quaternions, we can combine two reflections, with normals n and m, say, to get a (simple) rotation:
p → -m(-np'n)'m = mn'pn'm
and geometry tells us that the rotation is about an angle twice that between the the planes of reflection.
In 4-space, this rotation can be thought of as in the plane spanned by
m (ie. vectors in that plane rotate to other vectors in the plane), or around an axis of another plane, orthogonal to the first, in fact the intersection of the two hyperplanes normal to
A general 4-dimensional rotation needs 4 reflections:
p → j(l(mn'pn'm)'l)'j = jl'mn'pn'ml'j
and we lose any simple relation between the left and right quaternion – in fact
p → qpr is a rotation for any unit quaternions
r (an interesting case arises if
r is the identity – a Clifford translation).
We can derive expressions for reflections and rotations in 3-space from this, with 3-space points represented as pure quaternions, ie. with zero scalar part, so if
m are pure, then
n' = -n and
nm = (mn)'
A reflection now is:
p → -np'n = npn
and a rotation is:
p → mn'pn'm = mnp(mn)'
and we have the usual definition of a rotation in 3-space:
p → qpq'
Representing rotations as compositions of reflections also has practical uses. Consider the problem of finding a rotation to take a vector
p to a vector
q (assumed to both be of unit length) – we can do this as two reflections, first reflect
p in the (hyper)plane normal to
p+q, this aligns
q, but in the opposite direction, so reflect again in the plane orthogonal to
q (it may help to sketch a picture – the construction makes sense in 2 or more dimensions). Using the 3-space formulation above, and the fact that
qq = -1 for pure
q, we have:
p → qpq' where
q = -q(p+q)/|p+q| = (-qp-qq)/|p+q| = (1-qp)/|p+q|
and since we know that the result is of unit length, we can just use:
p → normalize(1-qp)
(with a special case when
qp = 1, ie when
q = -p, when the rotation is not uniquely defined).
Also, if we have two vectors
y0 and wish to rotate them to new vectors
|x0| = |x1|, |y0| = |y1|, and
|x0-y0| = |x1-y1|, first reflect
x1-x0 (ie. in the plane orthogonal to
x1-x0), this also reflects
y0 to a new point
y2, but we can then reflect
y2-y1 (this leaves
x1 unchanged as it is equidistant from from
n = x1-x0
y2 = y1 - 2(y1.n/n.n)n
m = y2-y1
r = normalize(mn)
There is always a unique rotation, but two special cases are: if
x0 = x1, then swap
y0 = y1 as well, there is nothing to do); and if
y2 = y1, then reflect along
cross(x1,y1) rather than y2-y1.
A similar construction is also possible in 4-dimensional space: 3 point pairs define a general rotation (the first three reflections map the 3 points, the last reflection, in the hyperplane containing those points, ensures we have a proper rotation).
Much of this is taken from Coxeter’s 1946 paper, “Quaternions and Reflections”, https://www.jstor.org/stable/2304897, which of course goes into much more depth and with much greater rigour.