internal int FindNearestAxis(double[] pt, bool qexact) { double tbest = qexact ? 0.999999 : -1; int res = 0; double ld = PGeom.DotProd(pt, pt); for (int i = 0; i < Axes.Length; i++) { double[] v = Axes[i].Dir; double x = PGeom.DotProd(pt, v) / Math.Sqrt(ld * PGeom.DotProd(v, v)); if (x > tbest) { res = i + 1; tbest = x; } if (x < -tbest) { res = -i - 1; tbest = -x; } } return(res); }
internal bool FindTwist(int nf, double[] pt, out int ax, out int tw) // 4D only { ax = Faces[nf].RefAxis; tw = 0; if (ax == 0) { return(false); } int iax = Math.Abs(ax) - 1; double[] actr = Axes[iax].Dir; double[] rtw = new double[Dim]; double l1 = PGeom.DotProd(pt, actr) / PGeom.DotProd(actr, actr); for (int i = 0; i < Dim; i++) { rtw[i] = pt[i] - l1 * actr[i]; } double tbest = -1; double[] p = new double[4]; for (int i = 0; i < Axes[iax].Twists.Length; i++) { double[] u = Axes[iax].Twists[i]; p[0] = actr[1] * (u[2] * u[7] - u[3] * u[6]) + actr[2] * (u[3] * u[5] - u[1] * u[7]) + actr[3] * (u[1] * u[6] - u[2] * u[5]); p[1] = actr[0] * (u[3] * u[6] - u[2] * u[7]) + actr[2] * (u[0] * u[7] - u[3] * u[4]) + actr[3] * (u[2] * u[4] - u[0] * u[6]); p[2] = actr[0] * (u[1] * u[7] - u[3] * u[5]) + actr[1] * (u[3] * u[4] - u[0] * u[7]) + actr[3] * (u[0] * u[5] - u[1] * u[4]); p[3] = actr[0] * (u[2] * u[5] - u[1] * u[6]) + actr[1] * (u[0] * u[6] - u[2] * u[4]) + actr[2] * (u[1] * u[4] - u[0] * u[5]); l1 = -PGeom.DotProd(p, rtw) / Math.Sqrt(PGeom.DotProd(p, p)); if (l1 < -tbest) { tbest = -l1; tw = -i - 1; } if (l1 > tbest) { tbest = l1; tw = i + 1; } } return(true); }
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; } }