Browse Source

tutorial: zoom automatically in the fractal viewer.

legacy
Sam Hocevar sam 13 years ago
parent
commit
7e10fe247b
1 changed files with 38 additions and 21 deletions
  1. +38
    -21
      test/tutorial/tut03.cpp

+ 38
- 21
test/tutorial/tut03.cpp View File

@@ -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();



Loading…
Cancel
Save