From 4fd3d972af1b4463a3453d5965e5cdfeb6dd60c1 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sun, 23 Jun 2024 13:25:27 +0900 Subject: [PATCH] [gatest] Correct and clean up Hodge calculation I had a few signs flipped, I think, but this version is much easier to read. --- ruamoko/gatest/multivector.r | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ruamoko/gatest/multivector.r b/ruamoko/gatest/multivector.r index 5adb9cee4..949567fd1 100644 --- a/ruamoko/gatest/multivector.r +++ b/ruamoko/gatest/multivector.r @@ -261,21 +261,21 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout) -(MultiVector *) dual:(int) undual { MultiVector *dual = [MultiVector new:algebra]; - unsigned dual_mask = (1 << [algebra dimension]) - 1; + unsigned I_mask = (1 << [algebra dimension]) - 1; int dim = [algebra dim]; for (int i = 0; i < num_components; i++) { if (!components[i]) { continue; } - double lc = components[i]; - BasisBlade *lb = [layout bladeAt:i]; - unsigned lb_mask = [lb mask]; - unsigned mask = lb_mask ^ dual_mask; - double ls = [lb scale]; - double s = count_flips (lb_mask, mask) & 1 ? -1 : 1; - s *= (dim * [lb grade]) & 1 ? -1 : 1; - int ind = [dual.layout bladeIndex:mask]; - dual.components[ind] += s * lc; + BasisBlade *blade = [layout bladeAt:i]; + unsigned d_mask = I_mask ^ [blade mask]; + int flips = undual ? count_flips (d_mask, [blade mask]) + : count_flips ([blade mask], d_mask); + double s = flips & 1 ? -1 : 1; + + double ls = [blade scale]; + int dual_ind = [dual.layout bladeIndex:d_mask]; + dual.components[dual_ind] += s * components[i]; } return dual; }