[gatest] Add multivector constructors to Algebra

This makes it much easier to create vectors of a specific grade or
grouping. It even found some mistakes in the multivector product
implementations.
This commit is contained in:
Bill Currie 2023-05-19 11:15:29 +09:00
parent c1c77bd64a
commit 008a64ee9b
4 changed files with 34 additions and 7 deletions

View file

@ -6,6 +6,7 @@
@class Metric;
@class BasisGroup;
@class BasisLayout;
@class MultiVector;
@interface Algebra : Object
{
@ -23,6 +24,11 @@
-(Metric *) metric;
-(int)count;
-(int)dimension;
-(MultiVector *) group:(int)group;
-(MultiVector *) group:(int)group values:(double *)values;
-(MultiVector *) ofGrade:(int)grade;
-(MultiVector *) ofGrade:(int)grade values:(double *)values;
@end
#endif//__algebra_h

View file

@ -5,6 +5,7 @@
#include "basisblade.h"
#include "basisgroup.h"
#include "basislayout.h"
#include "multivector.h"
#include "util.h"
@implementation Algebra
@ -119,6 +120,26 @@
return dimension;
}
-(MultiVector *) group:(int)group
{
return [MultiVector new:self group:[layout group:group]];
}
-(MultiVector *) group:(int)group values:(double *)values
{
return [MultiVector new:self group:[layout group:group] values:values];
}
-(MultiVector *) ofGrade:(int)grade
{
return [MultiVector new:self group:grades[grade]];
}
-(MultiVector *) ofGrade:(int)grade values:(double *)values
{
return [MultiVector new:self group:grades[grade] values:values];
}
-(void) print
{
int count = [layout count];

View file

@ -83,10 +83,10 @@ main ()
Algebra *alg = [Algebra R:3, 0, 1];
double vals1[32] = {1, 0, 0, 8};
static double vals2[32] = {0, 1, 0, 8};//FIXME qfcc bug (static)
static double origin_vals[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
MultiVector *plane1 = [MultiVector new:alg values:vals1];
MultiVector *plane2 = [MultiVector new:alg values:vals2];
MultiVector *origin = [MultiVector new:alg values:origin_vals];
static double origin_vals[32] = {0, 0, 0, 1};
MultiVector *plane1 = [alg group:0 values:vals1];
MultiVector *plane2 = [alg group:0 values:vals2];
MultiVector *origin = [alg group:3 values:origin_vals];
MultiVector *line = [plane1 wedge:plane2];
MultiVector *point = [[line dot:origin] product:line];

View file

@ -109,7 +109,7 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout)
if (!s) {
continue;
}
int ind = [rhs.layout bladeIndex:[b mask]];
int ind = [prod.layout bladeIndex:[b mask]];
prod.components[ind] += s * lc * rc;
}
}
@ -136,7 +136,7 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout)
if (!s) {
continue;
}
int ind = [rhs.layout bladeIndex:[b mask]];
int ind = [prod.layout bladeIndex:[b mask]];
prod.components[ind] += s * lc * rc;
}
}
@ -172,7 +172,7 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout)
if (!s) {
continue;
}
int ind = [rhs.layout bladeIndex:[b mask]];
int ind = [prod.layout bladeIndex:[b mask]];
prod.components[ind] += s * lc * rc;
}
}