Beispiel #1
0
 public double this[Blade blade]
 {
     get
     {
         return(blade.Value * this[blade.Basis]);
     }
     set
     {
         this[blade.Basis] = blade.Value * value;
     }
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 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));
             }
         }
     }
 }
Beispiel #5
0
        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;
        }
Beispiel #6
0
 public double this[Blade blade]
 {
     get
     {
         return blade.Value * this[blade.Basis];
     }
     set
     {
         this[blade.Basis] = blade.Value * value;
     }
 }
Beispiel #7
0
 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));
         }
     }
 }
Beispiel #8
0
 public static Blade InnerProduct(Blade b1, Blade b2)
 {
     return((b1.Value * b2.Value) * Basis.InnerProduct(b1.Basis, b2.Basis));
 }
Beispiel #9
0
 public static MultiVector GeometricProduct(Blade b1, Blade b2)
 {
     return((b1.Value * b2.Value) * Basis.GeometricProduct(b1.Basis, b2.Basis));
 }
Beispiel #10
0
 public static Blade operator ^(Blade b1, Blade b2)
 {
     return(Blade.OuterProduct(b1, b2));
 }
Beispiel #11
0
 public static MultiVector operator *(Blade b1, Blade b2)
 {
     return(Blade.GeometricProduct(b1, b2));
 }
Beispiel #12
0
 public static Blade OuterProduct(Blade b1, Blade b2)
 {
     return (b1.Value * b2.Value) * Basis.OuterProduct(b1.Basis, b2.Basis);
 }
Beispiel #13
0
 public static MultiVector GeometricProduct(Blade b1, Blade b2)
 {
     return (b1.Value * b2.Value) * Basis.GeometricProduct(b1.Basis, b2.Basis);
 }