I was interested in how scaling should work in geometric algebra. I read this post: Scaling with PGA?
which was very informative.
I’ve seen “use an outermorphism” pop up a few times as the answer to “how do you do this some linear transform that isn’t an obvious versor in GA(p,q,n)?”
So how should one implement this?
Here’s my take:
factor into unit 1-blades
convert to coordinates
apply the transform to coordinate vector
wedge and add everything together to get back to the object type you started with? i.e. wedge blades back together ( the outermorphism ) then use addition to compose back into multivectors/k-vectors?
here’s what I came up with. Aside from obvious optimizations, does this seem correct?
function outermorphism(L, b::B) where B<:Blade
sb = factor(b) # (scalar, followed by all 1-blades)
𝐼 = pseudoscalar(b) # need this for making KVector out of coordinates
mapreduce(bᵢ->KVector(L*coords(one(bᵢ)), 𝐼), ∧, sb[2:end])*sb[1]
end
outermorphism(L, k::K) where K<:KVector = mapreduce(b->outermorphism(L, b), +, k)
outermorphism(L, M::MT) where MT<:Multivector = scalar(M) + mapreduce(k->outermorphism(L, k), +, M)
seems to work for scaling. although I get covariant ( inverse scaling ) behaviour when applied to PGA points ( but that is to be expected, see the related post )