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(); } }
internal void SetStickers(LMesh M, CutNetwork CN, PAxis[] Axes, double[][] fctrs) { int dim = Pole.Length; NCutAxes = 0; int nax = Axes.Length; for (int i = 0; i < nax; i++) { if (AxisLayers[i] < 0) { NCutAxes++; } } CutAxes = new int[NCutAxes]; int d = 0; int rnk = 0; for (int u = 0; u < nax; u++) { if (AxisLayers[u] < 0) { CutAxes[d++] = u; } else { rnk += Axes[u].Base.GetRank(AxisLayers[u]); } } NStickers = CN.Nodes.Length; StickerMask = new byte[NStickers, NCutAxes]; StickerMesh = new PMesh[NStickers]; int nstk = 0; for (int i = 0; i < NStickers; i++) { PMesh xx = CN.GetPMesh(i); if (fctrs != null) { bool qg = false; foreach (double[] p in fctrs) { if (PGeom.VertEqual(p, xx.Ctr)) { qg = true; break; } } if (!qg) { continue; } } xx.FCtr = Pole; double[] ctr = xx.GetMCtr(); int rnk1 = rnk; for (int j = 0; j < NCutAxes; j++) { PAxis ax = Axes[CutAxes[j]]; double[] h = ax.Dir; double lh = PGeom.DotProd(h, h); double s = 0; for (int k = 0; k < dim; k++) { s += ctr[k] * h[k]; } s /= lh; int lv = ax.Base.NLayers - 1; for (int g = 0; g < lv; g++) { if (s > ax.Base.Cut[g]) { lv = g; break; } } rnk1 += ax.Base.GetRank(lv); StickerMask[nstk, j] = (byte)lv; } xx.Rank = rnk1; StickerMesh[nstk++] = xx; } if (nstk != NStickers) { PMesh[] stkm = new PMesh[nstk]; byte[,] stkmsk = new byte[nstk, NCutAxes]; for (int i = 0; i < nstk; i++) { stkm[i] = StickerMesh[i]; for (int j = 0; j < NCutAxes; j++) { stkmsk[i, j] = StickerMask[i, j]; } } StickerMask = stkmsk; StickerMesh = stkm; NStickers = nstk; } }