diff --git a/ruamoko/gatest/main.r b/ruamoko/gatest/main.r index 11ddeb2e7..2c195cb47 100644 --- a/ruamoko/gatest/main.r +++ b/ruamoko/gatest/main.r @@ -89,7 +89,7 @@ main () MultiVector *origin = [alg group:3 values:origin_vals]; MultiVector *line = [plane1 wedge:plane2]; - MultiVector *point = [[line dot:origin] product:line]; + MultiVector *point = [[line dot:origin] product:[line reverse]]; printf ("plane1:%@\nplane2:%@\nline:%@\norigin:%@\n", plane1, plane2, line, origin); printf ("point:%@\n", point); diff --git a/ruamoko/gatest/multivector.h b/ruamoko/gatest/multivector.h index c17cebef6..7b06b0695 100644 --- a/ruamoko/gatest/multivector.h +++ b/ruamoko/gatest/multivector.h @@ -23,6 +23,7 @@ -(MultiVector *) wedge:(MultiVector *) rhs; -(MultiVector *) dot:(MultiVector *) rhs; -(MultiVector *) dual; +-(MultiVector *) reverse; @end #endif//__multivector_h diff --git a/ruamoko/gatest/multivector.r b/ruamoko/gatest/multivector.r index a6a0f0b4a..19588085d 100644 --- a/ruamoko/gatest/multivector.r +++ b/ruamoko/gatest/multivector.r @@ -198,4 +198,22 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout) } return dual; } + +-(MultiVector *) reverse +{ + MultiVector *reverse = new_mv (algebra, nil); + for (int i = 0; i < num_components; i++) { + if (!components[i]) { + continue; + } + double c = components[i]; + BasisBlade *b = [layout bladeAt:i]; + int g = [b grade]; + unsigned mask = [b mask]; + double s = g & 2 ? -1 : 1;//FIXME do in BasisBlade? + int ind = [layout bladeIndex:mask]; + reverse.components[ind] += s * c; + } + return reverse; +} @end