public static GaPoTNumRotorsSequence CreateFromOrthonormalFrames(GaPoTNumFrame sourceFrame, GaPoTNumFrame targetFrame)
        {
            Debug.Assert(targetFrame.Count == sourceFrame.Count);
            Debug.Assert(sourceFrame.IsOrthonormal() && targetFrame.IsOrthonormal());
            Debug.Assert(sourceFrame.HasSameHandedness(targetFrame));

            var rotorsSequence = new GaPoTNumRotorsSequence();

            var sourceFrameVectors = new GaPoTNumVector[sourceFrame.Count];

            for (var i = 0; i < sourceFrame.Count; i++)
            {
                sourceFrameVectors[i] = sourceFrame[i];
            }

            for (var i = 0; i < sourceFrame.Count - 1; i++)
            {
                var sourceVector = sourceFrameVectors[i];
                var targetVector = targetFrame[i];

                var rotor =
                    sourceVector.GetRotorToVector(targetVector);

                rotorsSequence.AppendRotor(rotor);

                for (var j = i + 1; j < sourceFrame.Count; j++)
                {
                    sourceFrameVectors[j] = sourceFrameVectors[j].ApplyRotor(rotor);
                }
            }

            return(rotorsSequence);
        }
Beispiel #2
0
        public static GaPoTNumFrame CreateFromColumns(double[,] matrix)
        {
            var rowsCount = matrix.GetLength(0);
            var colsCount = matrix.GetLength(1);

            var frame = new GaPoTNumFrame();

            for (var j = 0; j < colsCount; j++)
            {
                var vector = new GaPoTNumVector();

                for (var i = 0; i < rowsCount; i++)
                {
                    var value = matrix[i, j];

                    if (value == 0)
                    {
                        continue;
                    }

                    vector.AddTerm(i + 1, value);
                }

                frame.AppendVector(vector);
            }

            return(frame);
        }
Beispiel #3
0
        public static GaPoTNumFrame CreateFbdFrame4D()
        {
            var c = Math.Sqrt(0.75d);

            var frame = new GaPoTNumFrame();

            var v1 = new GaPoTNumVector(
                c * Math.Sqrt(8.0d / 9.0d),
                0.0d,
                c / 3.0d
                );

            var v2 = new GaPoTNumVector(
                c * -Math.Sqrt(2.0d / 9.0d),
                c * Math.Sqrt(2.0d / 3.0d),
                c / 3.0d
                );

            var v3 = new GaPoTNumVector(
                -c * Math.Sqrt(2.0d / 9.0d),
                c * -Math.Sqrt(2.0d / 3.0d),
                c / 3.0d
                );

            var v4 = new GaPoTNumVector(
                0.0d,
                0.0d,
                -c
                );

            frame.AppendVectors(v1, v2, v3, v4);

            return(frame);
        }
Beispiel #4
0
        public static GaPoTNumFrame CreateBasisFrame(int vectorsCount)
        {
            var frame = new GaPoTNumFrame();

            for (var i = 0; i < vectorsCount; i++)
            {
                var vector = new GaPoTNumVector().AddTerm(i + 1, 1.0d);

                frame.AppendVector(vector);
            }

            return(frame);
        }
        public GaPoTNumVector GetProjectionOnFrame(GaPoTNumFrame frame)
        {
            var vector = new GaPoTNumVector();

            foreach (var term in _termsDictionary.Values)
            {
                var i = term.TermId - 1;
                var v = term.Value;

                vector += v * frame[i];
            }

            return(vector);
        }
Beispiel #6
0
        public static GaPoTNumFrame CreateFbdFrame3D()
        {
            var frame = new GaPoTNumFrame();

            var v1 = new GaPoTNumVector(
                1.0d,
                0.0d
                );

            var v2 = new GaPoTNumVector(
                -0.5d,
                0.5d * Math.Sqrt(3.0d)
                );

            var v3 = new GaPoTNumVector(
                -0.5d,
                -0.5d * Math.Sqrt(3.0d)
                );

            frame.AppendVectors(v1, v2, v3);

            return(frame);
        }
Beispiel #7
0
        public static GaPoTNumFrame CreateFbdFrame(int vectorsCount, out GaPoTNumFrame kirchhoffFrame)
        {
            //var uPseudoScalar = new GaPoTNumMultivector()
            //    .SetTerm(
            //        (1 << vectorsCount) - 1,
            //        1.0d
            //    );

            //kirchhoffFrame = CreateKirchhoffFrame(vectorsCount, vectorsCount - 1);

            //kirchhoffFrame = CreateBasisFrame(vectorsCount)
            //    .GetProjectionOnFrame(kirchhoffFrame)
            //    .GetSubFrame(0, vectorsCount - 1);

            //var cFrame = kirchhoffFrame.GetOrthogonalFrame(true);

            //cFrame.AppendVector(
            //    -GaPoTNumUtils
            //        .OuterProduct(cFrame)
            //        .Gp(uPseudoScalar.CliffordConjugate())
            //        .GetVectorPart()
            //);

            //Debug.Assert(
            //    cFrame.IsOrthonormal()
            //);

            //Debug.Assert(
            //    CreateBasisFrame(vectorsCount).HasSameHandedness(cFrame)
            //);

            //return cFrame;

            var basisFrame = CreateBasisFrame(vectorsCount);
            var diffFrame  = CreateKirchhoffFrame(vectorsCount);
            var projFrame  = basisFrame.GetProjectionOnFrame(diffFrame);

            var projMatrix = projFrame.GetMatrix(vectorsCount);

            var rowsCount = projMatrix.GetLength(0);
            var colsCount = projMatrix.GetLength(1);

            for (var j = 0; j < colsCount; j++)
            {
                var djj = projMatrix[j, j];

                for (var j1 = j + 1; j1 < colsCount; j1++)
                {
                    var d = projMatrix[0, j1] / djj;

                    for (var i = 0; i <= j1; i++)
                    {
                        projMatrix[i, j1] = 0;
                    }

                    for (var i = j1; i < rowsCount; i++)
                    {
                        projMatrix[i, j1] = projMatrix[i, j1] - d * projMatrix[i, j];
                    }
                }
            }

            kirchhoffFrame = diffFrame;

            var fbdFrame = GaPoTNumFrame.CreateFromColumns(projMatrix).Normalize();

            return(fbdFrame);

            if (vectorsCount == 3)
            {
                return(CreateFbdFrame3D());
            }

            if (vectorsCount == 4)
            {
                return(CreateFbdFrame4D());
            }

            throw new InvalidOperationException();
        }
Beispiel #8
0
        public static GaPoTNumFrame CreateGramSchmidtFrame(int vectorsCount, int refVectorIndex, out GaPoTNumFrame kirchhoffFrame)
        {
            kirchhoffFrame = CreateKirchhoffFrame(vectorsCount, refVectorIndex);

            var uPseudoScalar = new GaPoTNumMultivector()
                                .SetTerm(
                (1 << vectorsCount) - 1,
                1.0d
                );

            var cFrame = kirchhoffFrame.GetOrthogonalFrame(true);

            cFrame.AppendVector(
                -GaPoTNumUtils
                .OuterProduct(cFrame)
                .Gp(uPseudoScalar.CliffordConjugate())
                .GetVectorPart()
                );

            Debug.Assert(
                cFrame.IsOrthonormal()
                );

            Debug.Assert(
                CreateBasisFrame(vectorsCount).HasSameHandedness(cFrame)
                );

            return(cFrame);
        }
Beispiel #9
0
 public static GaPoTNumFrame CreateGramSchmidtFrame(int vectorsCount, out GaPoTNumFrame kirchhoffFrame)
 {
     return(CreateGramSchmidtFrame(vectorsCount, 0, out kirchhoffFrame));
 }
        public static GaPoTNumRotorsSequence CreateFromFrames(int baseSpaceDimensions, GaPoTNumFrame sourceFrame, GaPoTNumFrame targetFrame)
        {
            Debug.Assert(targetFrame.Count == sourceFrame.Count);
            //Debug.Assert(IsOrthonormal() && targetFrame.IsOrthonormal());
            Debug.Assert(sourceFrame.HasSameHandedness(targetFrame));

            var rotorsSequence = new GaPoTNumRotorsSequence();

            var pseudoScalar =
                GaPoTNumMultivector
                .CreateZero()
                .SetTerm((1 << baseSpaceDimensions) - 1, 1.0d);

            var sourceFrameVectors = new GaPoTNumVector[sourceFrame.Count];
            var targetFrameVectors = new GaPoTNumVector[targetFrame.Count];

            for (var i = 0; i < sourceFrame.Count; i++)
            {
                sourceFrameVectors[i] = sourceFrame[i];
                targetFrameVectors[i] = targetFrame[i];
            }

            for (var i = 0; i < sourceFrame.Count - 1; i++)
            {
                var sourceVector = sourceFrameVectors[i];
                var targetVector = targetFrameVectors[i];

                var rotor =
                    sourceVector.GetRotorToVector(targetVector);

                rotorsSequence.AppendRotor(rotor);

                pseudoScalar = targetVector.ToMultivector().Lcp(pseudoScalar.Inverse());

                for (var j = i + 1; j < sourceFrame.Count; j++)
                {
                    sourceFrameVectors[j] =
                        sourceFrameVectors[j].ApplyRotor(rotor).GetProjectionOnBlade(pseudoScalar);

                    targetFrameVectors[j] =
                        targetFrameVectors[j].GetProjectionOnBlade(pseudoScalar);
                }
            }

            return(rotorsSequence);
        }