Я написал программу, которая должна рисовать фрактал Мандельброта. К сожалению, похоже, что он пьян. Вот вывод:
Соответствующая функция:
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 включен в историю редактирования.
Ваш расчет сложного модуля неверен.
float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary + imaginary);
}
С тех пор вы удалили этот раздел своего поста, но в нем должно быть сказано
float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary * imaginary);
}