mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-21 11:11:37 +00:00
[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:
parent
c1c77bd64a
commit
008a64ee9b
4 changed files with 34 additions and 7 deletions
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue