Пьяная реализация Мандельброта

Я написал программу, которая должна рисовать фрактал Мандельброта. К сожалению, похоже, что он пьян. Вот вывод:

Неудачный Мандельброт

Соответствующая функция:

void drawMandelbrot(float x, float y, float width, float height, float delta) {
for (float currentX = -2; currentX < 2; currentX += delta) {
for (float currentY = -2; currentY < 2; currentY += delta) {
Complex z(0, 0);
Complex c(currentX, currentY);
int iterations = 0;

do {
z = z * z + c;
++iterations;
}
while (z.getAbsoluteValue() <= 2 && iterations < MANDELBROT_ITERATION_LIMIT);

ALLEGRO_COLOR pixelColor;
float pixelX = (currentX + 2) / 4 * width;
float pixelY = (currentY + 2) / 4 * width;

if (z.getAbsoluteValue() <= 2) {
pixelColor = blackColor;
// Commented because you might not want this much junk in your terminal
//std::cout << "Stayed small! " << z.toString() << std::endl;
} else {
pixelColor = al_color_hsv(iterations / MANDELBROT_ITERATION_LIMIT, 1.0f, 1.0f);
// idem
//std::cout << "Blew up! " << z.toString() << std::endl;
}
al_draw_pixel(pixelX, pixelY, pixelColor);
}
}
}

Я верю Complex::operator... методы правильные, я подозреваю логическую ошибку в вышеуказанной функции. При проверке выходных данных вышеупомянутых (закомментированных) операторов std :: cout абсолютные значения комплексных чисел в выходных данных действительно меньше 2, но изображение не похоже на построенный набор манделброта.

Где неправильное состояние?


MCVE включен в историю редактирования.

-7

Решение

Ваш расчет сложного модуля неверен.

float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary + imaginary);
}

С тех пор вы удалили этот раздел своего поста, но в нем должно быть сказано

float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary * imaginary);
}
1

Другие решения


По вопросам рекламы [email protected]