Beispiel #1
0
    public static SHRotateMatrix transfer(Matrix4x4 rot, int bands)
    {
        SHRotateMatrix result = new SHRotateMatrix(bands * bands);

        result.SetValue(0, 0, 1);

        PermutedMatrix pm = new PermutedMatrix(rot);

        for (int m = -1; m <= 1; m++)
        {
            for (int n = -1; n <= 1; n++)
            {
                result.SetValueByBand(1, m, n, pm.GetByMN(m, n));
            }
        }

        for (int band = 2; band < bands; band++)
        {
            for (int m = -band; m <= band; m++)
            {
                for (int n = -band; n <= band; n++)
                {
                    result.SetValueByBand(band, m, n, M(band, m, n, pm, result));
                }
            }
        }

        return(result);
    }
Beispiel #2
0
    private static float U(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M)
    {
        if (m == 0)
        {
            return(P(0, l, 0, n, R, M));
        }

        return(P(0, l, m, n, R, M));
    }
Beispiel #3
0
 private static float P(int i, int l, int a, int b, PermutedMatrix R, SHRotateMatrix M)
 {
     if (b == -l)
     {
         return(R.GetByMN(i, 1) * M.GetValueByBand(l - 1, a, -l + 1) + R.GetByMN(i, -1) * M.GetValueByBand(l - 1, a, l - 1));
     }
     else if (b == l)
     {
         return(R.GetByMN(i, 1) * M.GetValueByBand(l - 1, a, l - 1) - R.GetByMN(i, -1) * M.GetValueByBand(l - 1, a, -l + 1));
     }
     else
     {
         return(R.GetByMN(i, 0) * M.GetValueByBand(l - 1, a, b));
     }
 }
Beispiel #4
0
 private static float W(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M)
 {
     if (m == 0)
     {
         return(0);
     }
     else if (m > 0)
     {
         float p0 = P(1, l, m + 1, n, R, M);
         float p1 = P(-1, l, -m - 1, n, R, M);
         return(p0 + p1);
     }
     else         // m < 0
     {
         float p0 = P(1, l, m - 1, n, R, M);
         float p1 = P(-1, l, -m + 1, n, R, M);
         return(p0 - p1);
     }
 }
Beispiel #5
0
    private static float M(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M)
    {
        // First get the scalars
        float u = 0.0f, v = 0.0f, w = 0.0f;

        uvw(l, m, n, ref u, ref v, ref w);

        // Scale by their functions
        if (u != 0.0f)
        {
            u *= U(l, m, n, R, M);
        }
        if (v != 0.0f)
        {
            v *= V(l, m, n, R, M);
        }
        if (w != 0.0f)
        {
            w *= W(l, m, n, R, M);
        }

        return(u + v + w);
    }
Beispiel #6
0
 private static float V(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M)
 {
     if (m == 0)
     {
         float p0 = P(1, l, 1, n, R, M);
         float p1 = P(-1, l, -1, n, R, M);
         return(p0 + p1);
     }
     else if (m > 0)
     {
         float d  = delta(m, 1);
         float p0 = P(1, l, m - 1, n, R, M);
         float p1 = P(-1, l, -m + 1, n, R, M);
         return(p0 * Mathf.Sqrt(1 + d) - p1 * (1 - d));
     }
     else
     {
         float d  = delta(m, -1);
         float p0 = P(1, l, m + 1, n, R, M);
         float p1 = P(-1, l, -m - 1, n, R, M);
         return(p0 * (1 - d) + p1 * Mathf.Sqrt(1 - d));
     }
 }