Symmetries in Projective Geometric Algebra

Eric Lengyel   •   October 19, 2020

This is a continuation of the post Projective Geometric Algebra Done Right from earlier this year. That post introduces the geometric antiproduct and the notation ⟑ and ⟇ used in this post. As before, everything in this post assumes familiarity with Chapter 4 of FGED1.

A large reference poster containing a ton of information related to this post and the previous post is available here.

I have been thinking about the geometric product and geometric antiproduct on a low-priority thread for most of 2020, and I have discovered a number of interesting properties that highlight beautiful symmetries in projective geometric algebra (PGA). This post summarizes a lot of my findings for those who’d like further insight into the pervasive duality that geometric algebra has to offer. There have been arguments that only one product is necessary in geometric algebra, but it’s my intention to demonstrate in part of this post that there exist elegant concepts that are complete only if both products are working together in harmony.

Antiscalars

I have been using the symbol \(\mathbf E_4\) to represent the volume element of the 4D exterior algebra, also known as the unit antiscalar. \(\mathbf E_4\) is the wedge product of all the basis vectors \(\mathbf e_1 \wedge \mathbf e_2 \wedge \mathbf e_3 \wedge \mathbf e_4.\) I have recently decided that the symbol \(\mathbf E_4\) was inadequately conveying the fact that scalars and antiscalars are two sides of the same coin. I wanted to emphasize that they are equal and opposite within the algebra, with neither one having a place of greater importance, so after much searching and thought, I’ve come to the conclusion that the best symbol for the unit antiscalar is 𝟙, the number one in blackboard bold. I will use the symbol 1, an ordinary bold number one, as the unit scalar. These two symbols balance each other nicely, and both of them will show up throughout this post.

Bulk and Weight

A homogeneous point is represented by the vector \(\mathbf p = p_x \mathbf e_1 + p_y \mathbf e_2 + p_z \mathbf e_3 + p_w \mathbf e_4.\) The w coordinate is sometimes called the weight of the point, and the point is projected into 3D space by scaling so that the w coordinate is one. For a line given by \(\mathbf L = v_x \mathbf e_{41} + v_y \mathbf e_{42} + v_z \mathbf e_{43} + m_x \mathbf e_{23} + m_y \mathbf e_{31} + m_z \mathbf e_{12},\) the weight is the magnitude of the direction vector \((v_x, v_y, v_z),\) and the line is projected into 3D space by scaling so that this magnitude is one. For a plane given by \(\mathbf g = g_x \mathbf e_{423} + g_y \mathbf e_{431} + g_z \mathbf e_{412} + g_w \mathbf e_{321},\) the weight is the magnitude of the normal vector \((g_x, g_y, g_z),\) and the plane is projected into 3D space by scaling so that this magnitude is one. We use the term unitization to refer to the projection operation that causes the weight of any object to have magnitude one.

In general, the components of an object in the algebra can be separated into those that include the basis vector \(\mathbf e_4\) and those that do not. The parts that do include \(\mathbf e_4\) represent the extent of the object into the fourth dimension, and these components are collectively called the weight of the object. An object is projected into 3D space by normalizing its weight to unit magnitude, and I will have much more to say about this when I discuss norms below. The remaining parts of an object, those that do not include the basis vector \(\mathbf e_4,\) are collectively called the bulk of the object.

I will use a solid circle as a subscript to represent the bulk of an object, and I will use an empty circle as a subscript to represent the weight. Then the notation \(\mathbf a_\unicode{x25CF}\) means the sum of the components of a that exclude the basis vector \(\mathbf e_4,\) and the notation \(\mathbf a_\unicode{x25CB}\) means the sum of the components of a that include the basis vector \(\mathbf e_4.\) We will never have a need to use these directly in a calculation, but their complements actually arise in an interesting way when we perform projections, as discussed below.

I’ve always considered it to be somewhat artificial whenever we have to pick off components of some value in order to create another quantity. It generally indicates that something has been overcalculated, and a simpler or more natural operation can be used instead. I was pleasantly surprised to discover that the complements of the bulk and weight can be directly calculated in the algebra with the following formulas:

\(\overline{\mathbf a_\unicode{x25CF}} = \mathbf{\tilde a} \mathbin{\unicode{x27D1}} \unicode{x1D7D9}\)      (bulk right complement)

\(\overline{\mathbf a_\unicode{x25CB}} = \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}} \mathbin{\unicode{x27C7}} \mathbf 1\)      (weight right complement)

\(\underline{\smash{\mathbf a_\unicode{x25CF}}} = \unicode{x1D7D9} \mathbin{\unicode{x27D1}} \mathbf{\tilde a}\)      (bulk left complement)

\(\underline{\smash{\mathbf a_\unicode{x25CB}}} = \mathbf 1 \mathbin{\unicode{x27C7}} \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}}\)      (weight left complement)

These equations possess an elegant symmetry that relates the reverse and antireverse to the right and left complements and makes use of both the geometric product and geometric antiproduct with the multiplicative identity of the other product.

Since the bulk and weight are disjoint, so are their complements, and we can add them to obtain full complements:

\(\overline{\mathbf a} = \overline{\mathbf a_\unicode{x25CF}} + \overline{\mathbf a_\unicode{x25CB}} = \mathbf{\tilde a} \mathbin{\unicode{x27D1}} \unicode{x1D7D9} + \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}} \mathbin{\unicode{x27C7}} \mathbf 1\)      (right complement)

\(\underline{\mathbf a} = \underline{\smash{\mathbf a_\unicode{x25CF}}} + \underline{\smash{\mathbf a_\unicode{x25CB}}} = \unicode{x1D7D9} \mathbin{\unicode{x27D1}} \mathbf{\tilde a} + \mathbf 1 \mathbin{\unicode{x27C7}} \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}}\)      (left complement)

What this really means is that the combination of both the product and antiproduct allows us to calculate a complete complement of any element using only the multiplication and reversion operations of the algebra. This task is impossible in a degenerate algebra when only the geometric product is recognized because it always annihilates components containing \(\mathbf e_4\). The geometric antiproduct is required in order to fill in the other half.

The bulk of an object stores information about its position, encoding the object’s location relative to the origin. The weight of an object stores information about its attitude, encoding the spatial direction that the object faces. The weight is particularly useful in projection calculations because its complement provides directional information in a form that can be conveniently joined with the geometry being projected.

Norms

In many algebras, the Euclidean norm of some element a is routinely calculated using the formula \(\Vert \mathbf a \Vert = \sqrt{\mathbf a \cdot \mathbf a^*},\) where \(\cdot\) is the multiplication in the algebra and \(^*\) represents some kind of conjugate operation. In the geometric algebra, this becomes \(\Vert \mathbf a \Vert = \sqrt{\mathbf a \mathbin{\unicode{x27D1}} \mathbf{\tilde a}}.\) Because \(\mathbf e_4^2 = 0\), this formula ends up calculating the magnitude of only the bulk part of a. However, when we recognize that geometric algebra has two products, we can also calculate a different norm using the formula \(\Vert \mathbf a \Vert = \sqrt{\mathbf a \mathbin{\unicode{x27C7}} \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}}},\) where we are taking the square root with respect to the antiproduct. Whereas the product \(\mathbf a \mathbin{\unicode{x27D1}} \mathbf{\tilde a}\) results in a scalar quantity, the antiproduct \(\mathbf a \mathbin{\unicode{x27C7}} \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}}\) results in an antiscalar quantity. (The square root of an antiscalar simply follows the identity \(\sqrt{x \unicode{x1D7D9}} = \unicode{x1D7D9}\sqrt{x \vphantom{\unicode{x1D7D9}}}.\)) This second norm calculates the magnitude of the weight part of a, demonstrating another way in which the product and antiproduct work together to form a whole. The two norms are summarized as follows:

\(\Vert \mathbf a \Vert_\unicode{x25CF} = \sqrt{\mathbf a \mathbin{\unicode{x27D1}} \mathbf{\tilde a}}\)      (bulk norm)

\(\Vert \mathbf a \Vert_\unicode{x25CB} = \sqrt{\mathbf a \mathbin{\unicode{x27C7}} \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}}}\)      (weight norm)

I’m introducing a new definition for the norm of an element a, with no qualifier, to be the sum of the bulk norm and the weight norm:

\(\Vert \mathbf a \Vert = \Vert \mathbf a \Vert_\unicode{x25CF} + \Vert \mathbf a \Vert_\unicode{x25CB} = \sqrt{\mathbf a \mathbin{\unicode{x27D1}} \mathbf{\tilde a}} + \sqrt{\mathbf a \mathbin{\unicode{x27C7}} \smash{\mathbf{\underset{\Large\unicode{x7E}}{a}}} \vphantom{\mathbf{\tilde a}}}\)      (total geometric norm)

Unlike conventional norms, this norm is a two-component homogeneous magnitude consisting of a pair of numbers, a scalar and an antiscalar, which we could write as \(x \mathbf 1 + y \unicode{x1D7D9}.\) As with all things homogeneous, we project into 3D space by requiring the weight part (y in this case) to have unit magnitude. Unitizing the norm by taking the quotient of the bulk part and the weight part (technically, division with respect to the antiproduct) produces a concrete Euclidean distance measure. In the case of a point, the unitized norm is the distance from the point to the origin. In the case of a line, the unitized norm is the perpendicular distance from the line to the origin. In the case of a plane, the unitized norm is the perpendicular distance from the plane to the origin.

We can also talk about the norm of a motion operator (motor)

\(\mathbf Q = r_x \mathbf e_{41} + r_y \mathbf e_{42} + r_z \mathbf e_{43} + r_w \unicode{x1D7D9} + u_x \mathbf e_{23} + u_y \mathbf e_{31} + u_z \mathbf e_{12} + u_w.\)

The bulk norm of Q is given by \(\Vert \mathbf Q \Vert_\unicode{x25CF} = \sqrt{u_x^2 + u_y^2 + u_z^2 + u_w^2},\) and although it isn’t even remotely obvious, this is equal to exactly half of the weight-scaled distance that a point at the origin is moved by the motor Q, accounting for both rotation in the plane perpendicular to the axis and translation along the axis. I will show one way to arrive at this fact below.

The weight norm of Q is the magnitude of the four components making up the rotational part of the dual quaternion. As with everything else, it’s these components that include a factor of \(\mathbf e_4\) that we want to unitize in order to project into 3D space. This nicely consistent rule means that purely rotational motors are the unit quaternions that we would expect.

Projections

When all we have to worry about is vectors, the formula \((\mathbf a \cdot \mathbf{\hat b})\mathbf{\hat b}\) is not too hard to understand as the projection of the vector a onto the vector b, where the notation means that b has been normalized. It is possible to generalize this formula in geometric algebra for the projection of points, lines, and planes onto other points, lines, and planes, but I find it difficult to form an intuitive understanding of what’s happening when we take the dot product between a point and a line, for example, and then multiply the result by the line again using one of the geometric products. Fortunately, projections can be broken down into simpler operations that make a lot of sense when you understand that a wedge product performs a join operation, and an antiwedge product performs a meet operation.

I’m first going to introduce the interior products because they allow me to express projections in an interesting form, but keep in mind that you ultimately will not need to use them directly if you don’t want to. [Edit: The results presented in this section are correct as written, but a better treatment of interior products in PGA Illuminated supersedes this one.] The right and left interior products are defined as follows (using Browne's notation):

\(\mathbf a \mathbin{\unicode{x22A2}} \mathbf b = \mathbf a \vee \overline{\mathbf b}\)      (right interior product)

\(\mathbf a \mathbin{\unicode{x22A3}} \mathbf b = \underline{\mathbf a} \vee \mathbf b\)      (left interior product)

Up to sign, these produce the same results as what some authors call the right and left contraction products, and both types of products can be used as the basis for defining a dot product. In previous works by other authors, the left interior product has been defined using \(\overline{\mathbf a}\) instead of \(\underline{\mathbf a},\) but this introduces an asymmetry that causes some problems. Using the above definitions, \(\mathbf a \mathbin{\unicode{x22A2}} \mathbf a = \mathbf a \mathbin{\unicode{x22A3}} \mathbf a = +1\) for all basis elements a of all grades, and the following relationship holds independently of the number of dimensions:

\(\mathbf a \mathbin{\unicode{x22A3}} \mathbf b = (-1)^{\operatorname{gr}(\mathbf a)[\operatorname{gr}(\mathbf a) + \operatorname{gr}(\mathbf b)]}\mathbf b \mathbin{\unicode{x22A2}} \mathbf a\)

Using the interior products, the general projection of a blade a onto a blade b is given by this peculiar-looking formula:

\(\mathbf{\hat b} \mathbin{\unicode{x22A2}} \mathbf a \mathbin{\unicode{x22A3}} \mathbf{\hat b}\)      (projection of a onto b)

This expression is associative in the sense that it doesn’t matter if we calculate \((\mathbf{\hat b} \mathbin{\unicode{x22A2}} \mathbf a) \mathbin{\unicode{x22A3}} \mathbf{\hat b}\) or \(\mathbf{\hat b} \mathbin{\unicode{x22A2}} (\mathbf a \mathbin{\unicode{x22A3}} \mathbf{\hat b})\) because they both give the same answer. This formula for the projection is non-metric and thus cannot handle positional information. In order to project our points, lines, and planes onto one another, we need to make a small tweak that implicitly accounts for the fact that \(\mathbf e_4^2 = 0.\) This is done by taking only the weight part of b in one of the interior products (and it doesn’t matter which one) as follows:

\((\mathbf b_\unicode{x25CB} \mathbin{\unicode{x22A2}} \mathbf a) \mathbin{\unicode{x22A3}} \mathbf b\)   or   \(\mathbf b \mathbin{\unicode{x22A2}} (\mathbf a \mathbin{\unicode{x22A3}} \mathbf b_\unicode{x25CB})\)      (geometric projection of a onto b)

Now, we need to parenthesize so that the product with \(\mathbf b_\unicode{x25CB}\) is done first. Since the projective algebra is homogeneous, that hats on b have also been dropped. When we expand the first of these expressions using the definitions of the right and left interior products, we get this:

\((\underline{\smash{\mathbf b_\unicode{x25CB}}} \wedge \mathbf a) \vee \mathbf b\)      (geometric projection of a onto b)

In this form, we can derive some geometric intuition about what’s going on. As mentioned above, the expression \(\underline{\smash{\mathbf b_\unicode{x25CB}}}\) tends to extract the attitude of the object b in a perpendicular form while throwing away information about the position. The wedge product joins things together, so the expression \(\underline{\smash{\mathbf b_\unicode{x25CB}}} \wedge \mathbf a\) means “create an object perpendicular to b that contains a.” Taking the antiwedge product of this object with the original b then performs a meet operation that projects a perpendicularly onto b.

In the case that we are projecting a point p onto a plane g, the weight complement \(\underline{\smash{\mathbf g_\unicode{x25CB}}}\) gives us the vector \(g_x \mathbf e_1 + g_y \mathbf e_2 + g_z \mathbf e_3\) corresponding to the plane’s normal direction. The wedge product \(\underline{\smash{\mathbf g_\unicode{x25CB}}} \wedge \mathbf p\) then creates a line passing through p and perpendicular to the plane. Taking the antiwedge product between this line and the plane calculates the meet, essentially moving p along the perpendicular line until it hits the plane.

The case in which we are projecting a point p onto a line L is similar. The weight complement \(\underline{\smash{\mathbf L_\unicode{x25CB}}}\) gives us the line at infinity \(v_x \mathbf e_{23} + v_y \mathbf e_{31} + v_z \mathbf e_{12}\) corresponding to all the points at infinity in directions perpendicular to the direction of the original line L. The wedge product \(\underline{\smash{\mathbf L_\unicode{x25CB}}} \wedge \mathbf p\) then creates a plane containing p and perpendicular to the original line. Taking the antiwedge product between this plane and the original line calculates the meet, essentially moving p in the perpendicular plane until it hits the line.

The above projection formulas work when we are projecting an object of lower dimensionality onto an object of equal or higher dimensionality. (When you project onto something of equal dimensionality, you always end up with a scaled version of the point, line, or plane that you’re projecting onto.) Although it takes a little getting used to, we can also go the other way and antiproject an object of higher dimensionality onto an object of lower dimensionality. It sounds a bit weird to say you’re going to do something like project a plane onto a point, but all it really does is move the plane in its normal direction so that it contains the point. This happens in the opposite sense that projecting a point onto a plane moves the point in the normal direction so that it lies in the plane.

The formula for an antiprojection is the same as the formula for a projection, except the interior products are replaced by interior antiproducts. We don’t really need to bother getting into a silly exposition of interior antiproducts because what ends up happening is that the wedge and antiwedge products are simply exchanged as follows:

\((\underline{\smash{\mathbf b_\unicode{x25CB}}} \vee \mathbf a) \wedge \mathbf b\)      (geometric antiprojection of a onto b)

This formula projects planes onto lines, planes onto points, and lines onto points.

Motors

Now for a few notes about the exponential form of a motor Q under the geometric antiproduct ⟇. Suppose that we have a unitized line L and we want to construct the motor that performs a rotation about L through an angle \(2\theta\) followed by a translation along L by a distance \(2d\). Such a motor is given by the exponential of \((d + \theta \unicode{x1D7D9}) \mathbin{\unicode{x27C7}} \mathbf L\) with respect to the geometric antiproduct, which expands to the following:

\(\mathbf Q = \exp_\unicode{x27C7}[(d + \theta \unicode{x1D7D9}) \mathbin{\unicode{x27C7}} \mathbf L] = \cos_\unicode{x27C7}(d + \theta \unicode{x1D7D9}) + \sin_\unicode{x27C7}(d + \theta \unicode{x1D7D9}) \mathbin{\unicode{x27C7}} \mathbf L\)

The subscript ⟇ on the exponential, cosine, and sine functions means that the multiplication on which these are based is the antiproduct. If you’d like to work things out with power series, keep in mind that \(x^0 = \unicode{x1D7D9}\) under the antiproduct ⟇, not 1 as it would be under the product ⟑. We can expand this formula further so it becomes an expression involving ordinary sines and cosines of the angle \(\theta\) as follows:

\(\mathbf Q = \exp_\unicode{x27C7}[(d + \theta \unicode{x1D7D9}) \mathbin{\unicode{x27C7}} \mathbf L] = \unicode{x1D7D9} \cos \theta − d \sin \theta + (d \mathbin{\unicode{x27C7}} \mathbf L) \cos \theta + \mathbf L \sin \theta\)

When we take the weight norm of the right side of this equation, we always get \(\Vert \mathbf Q \Vert_\unicode{x25CB} = \unicode{x1D7D9},\) which is nice because it means that the motor is always unitized. (Remember that the direction part of L has been assumed to be unit length.) When we take the bulk norm, we get the following:

\(\Vert \mathbf Q \Vert_\unicode{x25CF} = \sqrt{d^2 + (m_x^2 + m_y^2 + m_z^2) \sin^2 \theta}\)

The \(d^2\) appearing in this equation clearly corresponds to half the distance moved along the line L. For a unitized line, the square of the moment appearing in the equation is the squared perpendicular distance from the line to the origin, but it’s rather oddly multiplied by \(\sin^2 \theta\) without any accompanying cosine in sight. Making sense out of this requires a little trig fu:

\(\sin^2 \theta = \frac{1}{2}(1 − \cos 2\theta)\)

   \(= \frac{1}{4}(2 − 2\cos 2\theta)\)

   \(= \frac{1}{4}(\sin^2 2\theta + \cos^2 2\theta + 1 − 2\cos 2\theta)\)

   \(= \frac{1}{4}[\sin^2 2\theta + (1 − \cos 2\theta)^2]\)

This last line is the square of precisely half the distance that a point one unit away from the line would move in the plane perpendicular to the line under the rotation through the angle \(2\theta\) performed by the motor Q. Multiplying this by the square of the line’s moment tells us how far any point the same distance from the line as the origin moves in the perpendicular plane. Adding the \(d^2\) to account for the motion parallel to the line, we conclude that the norm of a motor is equal to exactly half the distance that the origin is moved when we apply the motor Q to it.

Conclusion

Symmetries abound in PGA, and they should be embraced whenever possible. Algebraically, a model in which vectors are planes and we only use the geometric product is absolutely identical to a model in which vectors are points and we only use the geometric antiproduct. Any claim that one of these models is somehow more natural or better in any way from a mathematical perspective of any kind is categorically wrong. That said, it is still valid to argue about which model departs from established conventions the most and whether both the geometric product and geometric antiproduct should be recognized within the algebra. My opinion is that the model in which vectors are points not only sticks to established conventions to a much greater degree but is also more intuitive geometrically. Based on what I’ve written above, it should be clear that I think a complete understanding and clean implementation of PGA requires us to welcome both the geometric product and geometric antiproduct and take advantage of the symmetries they provide.

The following table compares a variety of the properties of the two models to help you form your own opinion.

Direct homogeneous model
Vectors are points
Both the products ⟑ and ⟇ are available
Dual homogeneous model
Vectors are planes
Only the geometric product ⟑ is available
The grade of a projective k-dimensional object is \(k + 1.\) The grade of a projective k-dimensional object is \(3 - k.\)
A point p is a vector \(p_x \mathbf e_1 + p_y \mathbf e_2 + p_z \mathbf e_3 + p_w \mathbf e_4.\) A point p is a trivector \(p_x \mathbf e_{423} + p_y \mathbf e_{431} + p_z \mathbf e_{412} + p_w \mathbf e_{321}.\)
A direction v is a vector \(v_x \mathbf e_1 + v_y \mathbf e_2 + v_z \mathbf e_3.\) A direction v is a trivector \(v_x \mathbf e_{423} + v_y \mathbf e_{431} + v_z \mathbf e_{412}.\)
A plane g is a trivector \(g_x \mathbf e_{423} + g_y \mathbf e_{431} + g_z \mathbf e_{412} + g_w \mathbf e_{321}.\) A plane g is a vector \(g_x \mathbf e_1 + g_y \mathbf e_2 + g_z \mathbf e_3 + g_w \mathbf e_4.\)
The wedge product ∧ performs the join operation. The wedge product ∧ performs the meet operation.
The antiwedge product ∨ performs the meet operation. The antiwedge product ∨ performs the join operation.
The weight of an object is the magnitude of the components that include the projective basis element \(\mathbf e_4.\) The weight of an object is the magnitude of the components that do not include the projective basis element \(\mathbf e_4.\)
Norms with respect to the geometric product ⟑ correspond to Euclidean distances for points, lines, planes, and motors. Norms with respect to the geometric product ⟑ correspond to weights.
Norms with respect to the geometric antiproduct ⟇ correspond to weights. The geometric antiproduct is not available, but there is something called an infinity-norm with a janky definition. It is able to produce Euclidean distances.
The dot product between two directions v and w satisfies the formula \(\mathbf v \cdot \mathbf w = \Vert \mathbf v \Vert \Vert \mathbf w \Vert \cos \theta.\) The dot product between two directions v and w is always 0. Recovering the conventional dot product formula requires an antidot product, which is not available in this model. If it were available, it would produce an antiscalar.

Additional Resources