醉曼德尔布罗特实施
Drunk Mandelbrot implementation
我编写了一个程序,用于绘制 Mandelbrot 分形。可惜,它好像喝醉了。这是输出:
相关函数:
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,但图像看起来不像绘制的 mandelbrot 集。
哪里条件不对?
mcve 包含在编辑历史记录中。
您计算的复数模数不正确。
float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary + imaginary);
}
您已经删除了 post 的这一部分,但它应该说
float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary * imaginary);
}
我编写了一个程序,用于绘制 Mandelbrot 分形。可惜,它好像喝醉了。这是输出:
相关函数:
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,但图像看起来不像绘制的 mandelbrot 集。
哪里条件不对?
mcve 包含在编辑历史记录中。
您计算的复数模数不正确。
float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary + imaginary);
}
您已经删除了 post 的这一部分,但它应该说
float Complex::getAbsoluteValue() const {
return sqrt(real * real + imaginary * imaginary);
}