示例#1
0
 internal int FindTwist(double[] p, double[,] matr, out bool qrev)
 {
     double[] q = PGeom.ApplyMatrixToTwist(matr, p);
     qrev = false;
     for (int i = 0; i < Twists.Length; i++)
     {
         if (PGeom.TwistsEqual(q, Twists[i], out qrev))
         {
             return(i);
         }
     }
     throw new Exception("Can't fing twist");
 }
示例#2
0
        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];
            }
        }