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); }
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); }
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); }
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); }
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); }
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(); }
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); }
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); }