예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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;
            }
        }