Threaded Mandelbrot程序C ++

时间:2016-02-06 17:51:45

标签: c++ mandelbrot

前言:我现在是一名被允许参加一些二年级课程的一年级学生。因此,我目前正在争论一种我没有时间学习的语言(C ++)(第一年主要学习C#),所以这段代码可能并不漂亮。

我们的任务是双重的。首先,我们需要编写一个在PPM中输出Mandelbrot图像的程序。为实现这一目标,我遵循了Youtube教程here

分配的第二部分是使程序多线程。本质上,该程序应该使用4个线程,每个线程绘制四分之一的图像。

为此,我更改了视频教程中的代码,并将main转换为方法。现在,我正在尝试正确制作图像的第一个四分之一。我认为这样做的方法是调整

        for (int y = 0; y < imageHeight; y++) //Rows!
        {
           for (int x = 0; x < imageWidth; x++) //Columns! (pixels in every row)
           {

        for (int y = 0; y < halfHeight; y++) //Rows!
        {
           for (int x = 0; x < halfWidth; x++) //Columns! (pixels in every row)
           {

然而,不是像我怀疑的那样画出左上角的四分之一,而是沿着整个宽度绘制,在达到图像宽度的中间标记后重复,并且仅沿着高度的四分之一绘制 (see image)

由于我喜欢从错误中吸取教训,我很想知道这里到底出了什么问题。

感谢您帮助编程新手:)

以下完整的程序代码。

#include "stdafx.h"
#include <fstream>
#include <iostream>

int imageWidth = 512, imageHeight = 512, maxN = 255, halfWidth = 256, halfHeight = 256;
double minR = -1.5, maxR = 0.7, minI = -1.0, maxI = 1.0;
std::ofstream f_out("output_image.ppm");

int findMandelbrot(double cr, double ci, int max_iterations)
{
    int i = 0;
    double zr = 0.0, zi = 0.0;
    while (i < max_iterations && zr * zr + zi * zi < 4.0)
    {
        double temp = zr * zr - zi * zi + cr;
        zi = 2.0 * zr * zi + ci;
        zr = temp;
        i++;
    }

    return i;
}

double mapToReal(int x, int imageWidth, double minR, double maxR)
{
    double range = maxR - minR;
    return x * (range / imageWidth) + minR;
}

double mapToImaginary(int y, int imageHeight, double minI, double maxI)
{
    double range = maxI - minI;
    return y * (range / imageHeight) + minI;
}

void threadedMandelbrot() 
{
    for (int y = 0; y < halfHeight; y++) //Rows!
    {
        for (int x = 0; x < halfWidth; x++) //Columns! (pixels in every row)
        {
            //... Find the real and imaginary values of c, corresponding
            //      to that x,y pixel in the image
            double cr = mapToReal(x, imageWidth, minR, maxR);
            double ci = mapToImaginary(y, imageHeight, minI, maxI);
            //... Find the number of iterations in the Mandelbrot formula
            //      using said c.
            int n = findMandelbrot(cr, ci, maxN);

            //... Map the resulting number to an RGB value.
            int r = (n % 256);
            int g = (n % 256);
            int b = (n % 256);

            //... Output it to the image
            f_out << r << " " << g << " " << b << " ";
        }
        f_out << std::endl;
    }

}


int main()
{
    //Initializes file
    f_out << "P3" << std::endl;
    f_out << imageWidth << " " << imageHeight << std::endl;
    f_out << "256" << std::endl;

    //For every pixel...
    threadedMandelbrot();
    f_out.close();
    std::cout << "Helemaal klaar!" << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您只计算图像的四分之一,因此您必须将其尺寸设置为halfHeighthalfWidth或用零填充文件。当图像查看器读取文件时,它会在一行像素中显示两行,直到它到达文件的末尾,占图像高度的四分之一。

要解决这个问题你只需要计算图像的其他四分之三,但我建议你从文件编写函数中分离calc函数:执行线程计算将结果放在一个数组中{{1} }或std::array),查找正确的颜色,然后写入文件。