private void CreateTwistMaps() { PermByMatr perm = new PermByMatr(Axes.Length, Faces.Length); foreach (PBaseAxis Ax in BaseAxes) { foreach (PBaseTwist tw in Ax.Twists) { double[,] matr = PGeom.ApplyTwist(tw.Dir, PGeom.MatrixIdentity(Dim)); int[][] R = ConvertStickersFromLayers(Ax, matr, perm); int[][] R1 = new int[Ax.NLayers][]; for (int i = 0; i < Ax.NLayers; i++) { if (R[i] != null) { R1[i] = new int[R[i].Length]; for (int j = 0; j < R[i].Length; j++) { int h = Array.BinarySearch <int>(Ax.Layers[i], R[i][j]); if (h < 0) { throw new Exception("Can't find sticker image in twist"); } R[i][j] = h; R1[i][h] = j; } } } tw.Map = R; tw.InvMap = R1; } } }
internal PAxis(PAxis src, double [] tw) { Base = src.Base; Dir = PGeom.ApplyTwist(tw, src.Dir); Matrix = PGeom.ApplyTwist(tw, src.Matrix); int ntw = src.Twists.Length; Twists = new double[ntw][]; for (int i = 0; i < ntw; i++) { Twists[i] = PGeom.ApplyTwist(tw, src.Twists[i]); } }
private void ExpandFaces() { PFace[] CFaces = new PFace[MaxNVert]; int NRefl = Group.Length; int p, q = BaseFaces.Length; for (int i = 0; i < q; i++) { BaseFaces[i].Id = i; CFaces[i] = new PFace(BaseFaces[i]); } for (p = 0; p < q; p++) { foreach (double [] G in Group) { double[] v = PGeom.ApplyTwist(G, CFaces[p].Pole); int j; for (j = 0; j < q; j++) { if (PGeom.VertEqual(v, CFaces[j].Pole)) { double[,] mf = PGeom.ApplyTwist(G, CFaces[p].Matrix); CFaces[p].Base.AddSMatrix(mf, CFaces[j].Matrix); break; } } if (j == q) { if (q == MaxNVert) { throw new Exception("Too many vertices"); } CFaces[q] = new PFace(CFaces[p], G); q++; } } } Faces = new PFace[q]; for (int i = 0; i < q; i++) { Faces[i] = CFaces[i]; Faces[i].Id = i; } foreach (PBaseFace BF in BaseFaces) { BF.CloseSMatrixSet(); } }
private void ExpandAxes() { int q = BaseAxes.Length; PAxis[] CAxes = new PAxis[MaxNAxes]; for (int i = 0; i < q; i++) { PBaseAxis ax = BaseAxes[i]; ax.Id = i; ax.ExpandPrimaryTwists(); CAxes[i] = new PAxis(ax); // matrix=id } for (int p = 0; p < q; p++) { double[] R = CAxes[p].Dir; foreach (double [] G in Group) { double[] v = PGeom.ApplyTwist(G, R); int j; bool qr; for (j = 0; j < q; j++) { if (PGeom.AxisEqual(v, CAxes[j].Dir, out qr)) { break; } } if (j == q) { if (q == MaxNAxes) { throw new Exception("Too many axes"); } CAxes[q] = new PAxis(CAxes[p], G); q++; } } } Axes = new PAxis[q]; for (int i = 0; i < q; i++) { Axes[i] = CAxes[i]; Axes[i].Id = i; } }
internal void ExpandPrimaryTwists() { const int MaxNTwists = 256; NPrimaryTwists = Twists.Length; PBaseTwist[] twst = new PBaseTwist[MaxNTwists]; int q = 0; foreach (PBaseTwist tw in Twists) { twst[q++] = tw; } for (int p = 0; p < q; p++) { double[] v = twst[p].Dir; for (int i = 0; i < q; i++) { double[] w = PGeom.ApplyTwist(twst[i].Dir, v); int k; bool qr; for (k = 0; k < q; k++) { if (PGeom.TwistsEqual(w, twst[k].Dir, out qr)) { break; } } if (k == q) { if (q == MaxNTwists) { throw new Exception("Too many planes"); } twst[q] = new PBaseTwist(w); q++; } } } Twists = new PBaseTwist[q]; for (int i = 0; i < q; i++) { Twists[i] = twst[i]; } }
internal PFace(PFace src, double[] tw) { Base = src.Base; Pole = PGeom.ApplyTwist(tw, src.Pole); Matrix = PGeom.ApplyTwist(tw, src.Matrix); }