mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-22 09:31:40 +00:00
[gatest] Correct and clean up Hodge calculation
I had a few signs flipped, I think, but this version is much easier to read.
This commit is contained in:
parent
5771cfb2ff
commit
4fd3d972af
1 changed files with 10 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue