# Quaternions and Reflections

**Posted:**February 15, 2019

**Filed under:**Geometry, Graphics Leave a comment

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`

and `q`

as:

`p = x+X`

`q = y+Y`

where `x`

and `y`

are scalars and `X`

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 `X.Y`

and `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'`

(overbar `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)`

But `xy + X.Y`

is just the dot product of `p`

and `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 `p`

in `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 `n`

and `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 `n`

and `m`

.

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 `q`

and `r`

(an interesting case arises if `q`

or `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 `n`

and `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 `p`

with `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 `x0`

,`y0`

and wish to rotate them to new vectors `x1`

,`y1`

(assume `|x0| = |x1|, |y0| = |y1|`

, and `|x0-y0| = |x1-y1|`

, first reflect `x0`

to `x1`

along `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`

to `y1`

along `y2-y1`

(this leaves `x1`

unchanged as it is equidistant from from `y1`

and `y2`

):

`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 `x0`

with `y0`

and `x1`

with `y1`

(if `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.