public double this[Blade blade] { get { return(blade.Value * this[blade.Basis]); } set { this[blade.Basis] = blade.Value * value; } }
public static MultiVector InnerProduct(MultiVector v1, MultiVector v2) { MultiVector result = new MultiVector(); foreach (Blade b1 in v1.Blades) { foreach (Blade b2 in v2.Blades) { result += Blade.InnerProduct(b1, b2); } } return(result); }
public static MultiVector GeometricProduct(Basis e1, Basis e2) { int hashPair = Basis.GetHashPair(e1, e2); if (geometricProductCache.ContainsKey(hashPair)) { return(geometricProductCache[hashPair]); } MultiVector result; if (e1.IsNullMetric || e2.IsNullMetric) { MultiVector m1 = e1.ToMinkowskiMetric(); MultiVector m2 = e2.ToMinkowskiMetric(); result = (m1 * m2).ToNullMetric(); } else { int rBitMask = e1.bitMask ^ e2.bitMask; double rValue = Basis.Order(e1, e2); int common = e1.bitMask & e2.bitMask; int i = 0; while (common != 0) { if ((common & 0x1) != 0) { rValue *= Basis.minkowskiSignature[i]; } common >>= 1; i++; } result = new Blade(new Basis(rBitMask, false), rValue); } geometricProductCache.Add(hashPair, result); return(result); }
public double this[Basis basis] { get { if (blades.ContainsKey(basis)) { return(blades[basis].Value); } else { return(0.0); } } set { // HACK if (Math.Abs(value) < 1E-3) { if (blades.ContainsKey(basis)) { blades.Remove(basis); } } else { if (blades.ContainsKey(basis)) { blades[basis] = new Blade(basis, value); } else { blades.Add(basis, new Blade(basis, value)); } } } }
public static MultiVector GeometricProduct(Basis e1, Basis e2) { int hashPair = Basis.GetHashPair(e1, e2); if (geometricProductCache.ContainsKey(hashPair)) return geometricProductCache[hashPair]; MultiVector result; if (e1.IsNullMetric || e2.IsNullMetric) { MultiVector m1 = e1.ToMinkowskiMetric(); MultiVector m2 = e2.ToMinkowskiMetric(); result = (m1 * m2).ToNullMetric(); } else { int rBitMask = e1.bitMask ^ e2.bitMask; double rValue = Basis.Order(e1, e2); int common = e1.bitMask & e2.bitMask; int i = 0; while (common != 0) { if ((common & 0x1) != 0) rValue *= Basis.minkowskiSignature[i]; common >>= 1; i++; } result = new Blade(new Basis(rBitMask, false), rValue); } geometricProductCache.Add(hashPair, result); return result; }
public double this[Blade blade] { get { return blade.Value * this[blade.Basis]; } set { this[blade.Basis] = blade.Value * value; } }
public double this[Basis basis] { get { if (blades.ContainsKey(basis)) return blades[basis].Value; else return 0.0; } set { // HACK if (Math.Abs(value) < 1E-3) { if (blades.ContainsKey(basis)) blades.Remove(basis); } else { if (blades.ContainsKey(basis)) blades[basis] = new Blade(basis, value); else blades.Add(basis, new Blade(basis, value)); } } }
public static Blade InnerProduct(Blade b1, Blade b2) { return((b1.Value * b2.Value) * Basis.InnerProduct(b1.Basis, b2.Basis)); }
public static MultiVector GeometricProduct(Blade b1, Blade b2) { return((b1.Value * b2.Value) * Basis.GeometricProduct(b1.Basis, b2.Basis)); }
public static Blade operator ^(Blade b1, Blade b2) { return(Blade.OuterProduct(b1, b2)); }
public static MultiVector operator *(Blade b1, Blade b2) { return(Blade.GeometricProduct(b1, b2)); }
public static Blade OuterProduct(Blade b1, Blade b2) { return (b1.Value * b2.Value) * Basis.OuterProduct(b1.Basis, b2.Basis); }
public static MultiVector GeometricProduct(Blade b1, Blade b2) { return (b1.Value * b2.Value) * Basis.GeometricProduct(b1.Basis, b2.Basis); }