コード例 #1
0
ファイル: PuzzleStructure.cs プロジェクト: nanma80/MPUlt
        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;
                }
            }
        }
コード例 #2
0
ファイル: PuzzleParts.cs プロジェクト: nanma80/MPUlt
        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]);
            }
        }
コード例 #3
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();
            }
        }
コード例 #4
0
ファイル: PuzzleStructure.cs プロジェクト: nanma80/MPUlt
        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;
            }
        }
コード例 #5
0
ファイル: PuzzleParts.cs プロジェクト: nanma80/MPUlt
        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];
            }
        }
コード例 #6
0
ファイル: PuzzleParts.cs プロジェクト: nanma80/MPUlt
 internal PFace(PFace src, double[] tw)
 {
     Base   = src.Base;
     Pole   = PGeom.ApplyTwist(tw, src.Pole);
     Matrix = PGeom.ApplyTwist(tw, src.Matrix);
 }