Я работал над рисованием множества Джулии, используя оценку расстояния вместо нормализованного числа итераций.Я обычно использую приведенный ниже код и играю с количеством итераций, пока не получу достаточно приличное изображение
double Mandelbrot::getJulia(double x, double y)
{
complex<double> z(x, y);
complex<double> c(-0.7269, 0.1889);
double iterations = 0;
while (iterations < MAX)
{
z = z * z + c;
if (abs(z) > 2) {
return iterations + 1.0 - log(log2(abs(z)));
break;
}
iterations++;
}
return double(MAX);
}
Затем я вызываю это для каждой точки и рисую в растровом изображении;
ZoomTool zt(WIDTH, HEIGHT);
zt.add(Zoom(WIDTH / 2, HEIGHT / 2, 4.0 / WIDTH));
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
pair<double, double> coords = zt.zoomIn(x, y);
double iterations = Mandelbrot::getJulia(coords.first,
coords.second);
double ratio = iterations / Mandelbrot::MAX;
double h = 0;
double s= 0;
double v = 0;
if (ratio != 1)
{
h = 360.0*ratio;
s = 1.0;
v = 1.0;
}
HSV hsv(h, s, v);
RGB rgb(0, 0, 0);
rgb = toRGB(hsv);
bitmap.setPixel(x, y, rgb._r, rgb._g, rgb._b);
}
}
На 600 итерациях я получаю это:
Что не очень хорошо, но лучше, чем то, что я получаю с оценкой расстояния, которую я пытаюсь сейчасиспользовать.Я реализовал оценщик расстояния, как показано ниже:
double Mandelbrot::getJulia(double x, double y)
{
complex<double> z(x,y);
complex<double> c(-0.7269, 0.1889);
complex<double> dz = 0;
double iterations = 0;
while (iterations < MAX)
{
dz = 2.0 * dz * z + 1.0;
z = z * z + c;
if (abs(z) > 2)
{
return abs(z) * log(abs(z)) / abs(dz);
}
iterations++;
}
return Mandelbrot::MAX;
}
За 600 итераций я получаю следующее изображение
Не правильно ли я нормализую цвета?Я предполагаю, что это происходит, потому что я нормализуюсь до 360.0 и делаю преобразование из HSV в RGB.Поскольку расстояния довольно малы, я получаю очень сжатое распределение цветов.