Designing Geometric Algebras - Rotors
In the first part of this series we learnt how to create geometric algebras that can represent arbitrary objects. In this second part we will learn about how to create the rotors we want to perform translation, rotation and so on.
Rotor Recap
With each pair of basis vectors we can form a bivector. The bivector can be exponentiated which results in a rotor that, when an object is sandwiched with it, will perform one of three operations depending on what the bivector squares to:
Let's take a look at ordinary 3-space GA. We have three basis vectors that each square to +1. We have three bivectors that each square to -1. Thus the bivectors perform a rotation in their planes, meaning, between the components of the two basis vectors they are composed of when applied with the sandwich product to a vector.
Sandwich action on vector | ||
---|---|---|
-1 | Rotates between B's two vectors | |
0 | Translates orthogonal to B's two vectors | |
+1 | Boosts between B's two vectors |
Rotors for different up functions
With a more complicated up function this is no different. The bivectors will still eg. rotate between two components of two basis vectors. The result looks more interesting though. If we have a basis vector for the term and another basis vector for a constant term, we can rotate between a parabola and a straight line! This is demonstrated below with an algebra that has 3 basis vectors and corresponding terms in the up function .Here's another example where we rotate an elliptic curve into vertical lines (the algebra can represent vertical line tuples).
Basis vectors as mirrors
If you've seen Steven De Keninck's presentation on dual quaternions you have seen how the rotors arise naturally from viewing the action of the basis vectors as mirrors in the dual view. For example using ordinary 3-space again, each basis vector when applied with the sandwich product will reflect the components along its axis.
As you might have hoped or expected, nothing changes. If we reflect in a basis vector that has an coefficient in the up function, sandwiching with that basis vector will reflect in a parabola instead of a line. This is hard to visualize, especially for understanding how the rotors arise from these mirrors but it does all work out the same.
Rotor exploration
Here are some things I tried. I might remove this section later or move it to a new page once I figure out a good pattern for constructing our desired rotors. Beware of mistakes.PGA-like rotors for rotation and translation
Depending on what our basis vectors square to we will get different squares for the bivectors. This makes it tricky to get all the transformations we want. For example we can't easily get both rotation between and translation orthogonal to it.
However we can introduce a new basis vector that squares to zero and add it to our up function with a constant coefficient. Assuming our two basis vectors we started with both square to one, we get rotors for rotation between as well as translations in either direction if we sandwich with the exponential of the dual of a vector. For example is a translator (a rotor doing translation) in the 1-direction by when applied with the sandwich product.
Shear rotors
So far this was all relatively specific to the up function used by PGA where the extra basis vector has a constant coefficient. How does the action of such a rotor look like if the coefficient is not a constant?
Let's look at the simple case with two basis vectors and up function and but . We have the bivector which squares to zero. When we exponentiate it and apply it with the sandwich product to a vector we get It does some sort of translation in the direction proportional to the value. For the direction is unaffected. The bigger the component gets the more the direction gets translated. This is a shear in the direction, the vector which squares to zero.
"Opposite-PGA" exploration
Let's try the previous PGA rotor example but instead make and .
Applying to a vector (line) This does translation in the direction and also some kind of shear in proportional to the component. does the same thing but with and swapped.
Applying to a vector (line): This does translation in .
Applying to a bivector (point): This is the identity map.
Applying to a bivector (point): This is a shear in the direction proportional to the component. The last bivector will do the same thing in the but proportional to the component. Since this is a projective point (which follows from inverting the up function, not conjecture!) it's a division of both x and y by or . Also composing the two rotors will give us the following: Interestingly the composed rotor picks up the part for which we already showed that it is the identity map. In different notation, the composed map is Perhaps it is possible to construct scaling rotors for each direction this way if we could change the and in the denominator by adjusting our up function and basis vectors.
Non-isotropic scaling rotor
We want rotors that only scale in one direction, instead of scaling all directions equally. Start with PGA, but for up instead use the logarithm on the coordinates If we try to find the inverse mapping (ie. get the coordinates a bivector represents) we have If we now apply a translator that translates by in the direction (just like in the usual PGA), we get Recovering the coordinates this result represents using the inverse up mapping we get And we have non-isotropic scaling, yay! Of course the same will work for scaling too. There is still a big issue though: and have to be greater than zero since the logarithm is not defined otherwise (or we could just use the complex logarithm? although maybe there's a nicer GA way of avoiding arbitrary complex numbers here).
Translators in any variable for polynomial up functions
This part is flawed / wrong, but I left it up since it still contains some useful ideas.Assume we have an up function which can represent parabolas, lines, points and so on. If we want to have translation as rotors (translators), it's not that easy. In PGA we only have one basis vector with an coefficient so we can do the translation using a single rotor , but if we did with the above up function we would change the coefficient while leaving the coefficient untouched. If we look at the OPNS / VPNS of a point that was only translated in we get three equations that have to vanish Notice the first and second equation together give . But the third equation gives . Both of these together give which can only be true for . and our wrongly translated point does indeed not represent anything useful.
To get something useful again we need to translate all coefficients where appears in the up function. For instance should get translated as First we need to translate the coefficient by which is easy using the rotor . Next we need to translate the part by which is a shear. This is not possible with the current set of basis vectors we have available as we can only translate by constants and not in proportion to as required here.
We introduce a new basis vector with coefficient in the up function. Then we get the rotors we need as (note, no division by 2 as we need twice the amount). This solves the issue of translating the part. However this introduces a new problem. The new basis vector we introduced has coefficient so in order to keep it consistent (non-empty OPNS / VPNS) we need to translate it too.
Again this is not that easy because usually we use the bivectors containing to do translations. We can't do that here to translate because it squares to zero and thus the bivector will result in zero when multiplied with which is the part that usually enables us to do translation for non-zero squaring basis vectors.
The idea in this step is wrong which makes the entire thing not work out. The bivector will give a shearor not a translator, and will also affect the wrong dual basis vector.We introduce a new basis vector with coefficient in the up function. This will allow us to do translations in with the bivector because it squares to zero (ie. does translation) and instead of zero.
Now we can compose all the rotors we just came up with to get a single rotor that does translation in by . In conclusion, we introduced two new basis vectors, one for allowing us to do translation in proportional to and another to allow us to translate the new basis vector by a constant. The composed rotor is a lot more complicated too. However this will work for any polynomial if we apply this idea recursively. For example for we want . Here we could do the same thing:
- Translate
part by - Introduce new basis vector with coeff.
for translation by - Introduce new basis vector for translating the new basis vector by
- Introduce new basis vector for translation relative to
- New basis vector needs to be translated as
so we can apply the same idea - ...
- Tears, lots of new basis vectors, complicated rotors, but it works out