Ignore:
Timestamp:
Nov 11, 2011, 2:10:21 AM (9 years ago)
Author:
sam
Message:

tutorial: zoom automatically in the fractal viewer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/tutorial/tut03.cpp

    r1058 r1060  
    3838        m_size = size;
    3939        m_pixels = new u8vec4[size.x * size.y];
    40         m_angle = 0.0f;
     40        m_time = 0.0f;
    4141        m_ready = false;
    4242    }
     
    5151        WorldEntity::TickGame(deltams);
    5252
    53         m_angle += deltams * 0.0005f;
    54 
    55         cmplx r0(cosf(m_angle), 0.8f * sinf(m_angle));
     53        m_time += deltams * 0.0005f;
     54
     55        f64cmplx center(0.001643721971153, 0.822467633298876);
     56        //f64cmplx center(0.28693186889504513, 0.014286693904085048);
     57        double radius = 8.0 * pow(2.0, -m_time);
     58        double step = radius / (m_size.x > m_size.y ? m_size.x : m_size.y);
     59
    5660        for (int j = 0; j < m_size.y; j++)
    5761        for (int i = 0; i < m_size.x; i++)
    5862        {
    59             float const maxlen = 32.0f;
     63            double const maxlen = 32;
    6064            int const colors = 16;
    61             int const maxiter = 30;
    62 
    63             cmplx x0(4.0f / m_size.x * i - 2.0f, 3.0f / m_size.y * j - 1.5f);
    64             cmplx r = x0 * r0;
    65             cmplx z;
     65            int const maxiter = 200;
     66
     67            f64cmplx delta(i - m_size.x / 2, j - m_size.y / 2);
     68
     69            f64cmplx z0 = center + step * delta;
     70            f64cmplx r0 = z0;
     71            //f64cmplx r0(0.28693186889504513, 0.014286693904085048);
     72            //f64cmplx r0(-0.824,0.1711);
     73            //f64cmplx r0(0.001643721971153, 0.822467633298876);
     74            f64cmplx z;
    6675            int iter = maxiter;
    67             for (z = r; iter && z.sqlen() < maxlen * maxlen; z = z * z + r)
     76            for (z = z0; iter && z.sqlen() < maxlen * maxlen; z = z * z + r0)
    6877                --iter;
    6978
    70             float f = iter % colors;
    71             float n = z.len();
    72             f += logf(logf(n) / logf(maxlen)) / logf(2.0f);
     79            double f = iter;
     80            double n = z.sqlen();
     81
     82            /* Approximate log2(x) with x-1 because x is in [1,2]. */
     83            f += (log(n) * 0.5f / log(maxlen)) - 1.0f;
    7384
    7485            if (iter)
    7586            {
    76                 uint8_t red = 255 - f * (255.0f / (colors + 1));
    77                 uint8_t green = 255 - f * (255.0f / (colors + 1));
    78                 uint8_t blue = (f * 512.0f / (colors + 1) > 255)
    79                              ? 511 - (f * 512.0f / (colors + 1)) : 255;
     87                double r = fmod(f, (double)colors);
     88                if (r > (double)colors / 2) r = (double)colors - r;
     89                double g = fmod(f * 1.3 + 4.0f, (double)colors);
     90                if (g > (double)colors / 2) g = (double)colors - g;
     91                double b = fmod(f * 1.7 - 8.0f, (double)colors);
     92                if (b > (double)colors / 2) b = (double)colors - b;
     93
     94                uint8_t red = 255 - r * (255.0f / (colors + 1));
     95                uint8_t green = 255 - g * (255.0f / (colors + 1));
     96                uint8_t blue = 255 - b * (255.0f / (colors + 1));
    8097                m_pixels[j * m_size.x + i] = u8vec4(red, green, blue, 0);
    8198            }
     
    93110        static float const vertices[] =
    94111        {
     112             1.0f,  1.0f,
     113            -1.0f,  1.0f,
     114            -1.0f, -1.0f,
    95115            -1.0f, -1.0f,
    96116             1.0f, -1.0f,
    97117             1.0f,  1.0f,
    98              1.0f,  1.0f,
    99             -1.0f,  1.0f,
    100             -1.0f, -1.0f,
    101118        };
    102119
     
    232249#endif
    233250    int m_vertexattrib, m_texattrib;
    234     float m_angle;
     251    float m_time;
    235252    bool m_ready;
    236253};
     
    245262
    246263    new DebugFps(5, 5);
    247     new Fractal(ivec2(640, 480));
     264    new Fractal(ivec2(1280, 960));
    248265
    249266    app.Run();
Note: See TracChangeset for help on using the changeset viewer.