コード例 #1
0
ファイル: PuzzleStructure.cs プロジェクト: nanma80/MPUlt
        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();
            }
        }
コード例 #2
0
ファイル: PuzzleParts.cs プロジェクト: nanma80/MPUlt
        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;
            }
        }