diff --git a/test/tutorial/tut03.cpp b/test/tutorial/tut03.cpp index 16fe9c46..f17da9b0 100644 --- a/test/tutorial/tut03.cpp +++ b/test/tutorial/tut03.cpp @@ -37,7 +37,7 @@ public: { m_size = size; m_pixels = new u8vec4[size.x * size.y]; - m_angle = 0.0f; + m_time = 0.0f; m_ready = false; } @@ -50,33 +50,50 @@ public: { WorldEntity::TickGame(deltams); - m_angle += deltams * 0.0005f; + m_time += deltams * 0.0005f; + + f64cmplx center(0.001643721971153, 0.822467633298876); + //f64cmplx center(0.28693186889504513, 0.014286693904085048); + double radius = 8.0 * pow(2.0, -m_time); + double step = radius / (m_size.x > m_size.y ? m_size.x : m_size.y); - cmplx r0(cosf(m_angle), 0.8f * sinf(m_angle)); for (int j = 0; j < m_size.y; j++) for (int i = 0; i < m_size.x; i++) { - float const maxlen = 32.0f; + double const maxlen = 32; int const colors = 16; - int const maxiter = 30; + int const maxiter = 200; + + f64cmplx delta(i - m_size.x / 2, j - m_size.y / 2); - cmplx x0(4.0f / m_size.x * i - 2.0f, 3.0f / m_size.y * j - 1.5f); - cmplx r = x0 * r0; - cmplx z; + f64cmplx z0 = center + step * delta; + f64cmplx r0 = z0; + //f64cmplx r0(0.28693186889504513, 0.014286693904085048); + //f64cmplx r0(-0.824,0.1711); + //f64cmplx r0(0.001643721971153, 0.822467633298876); + f64cmplx z; int iter = maxiter; - for (z = r; iter && z.sqlen() < maxlen * maxlen; z = z * z + r) + for (z = z0; iter && z.sqlen() < maxlen * maxlen; z = z * z + r0) --iter; - float f = iter % colors; - float n = z.len(); - f += logf(logf(n) / logf(maxlen)) / logf(2.0f); + double f = iter; + double n = z.sqlen(); + + /* Approximate log2(x) with x-1 because x is in [1,2]. */ + f += (log(n) * 0.5f / log(maxlen)) - 1.0f; if (iter) { - uint8_t red = 255 - f * (255.0f / (colors + 1)); - uint8_t green = 255 - f * (255.0f / (colors + 1)); - uint8_t blue = (f * 512.0f / (colors + 1) > 255) - ? 511 - (f * 512.0f / (colors + 1)) : 255; + double r = fmod(f, (double)colors); + if (r > (double)colors / 2) r = (double)colors - r; + double g = fmod(f * 1.3 + 4.0f, (double)colors); + if (g > (double)colors / 2) g = (double)colors - g; + double b = fmod(f * 1.7 - 8.0f, (double)colors); + if (b > (double)colors / 2) b = (double)colors - b; + + uint8_t red = 255 - r * (255.0f / (colors + 1)); + uint8_t green = 255 - g * (255.0f / (colors + 1)); + uint8_t blue = 255 - b * (255.0f / (colors + 1)); m_pixels[j * m_size.x + i] = u8vec4(red, green, blue, 0); } else @@ -92,12 +109,12 @@ public: static float const vertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, + 1.0f, -1.0f, + 1.0f, 1.0f, }; static float const texcoords[] = @@ -231,7 +248,7 @@ private: GLuint m_tco; #endif int m_vertexattrib, m_texattrib; - float m_angle; + float m_time; bool m_ready; }; @@ -244,7 +261,7 @@ int main() Application app("Tutorial 3: Fractal", ivec2(640, 480), 60.0f); new DebugFps(5, 5); - new Fractal(ivec2(640, 480)); + new Fractal(ivec2(1280, 960)); app.Run();