2016-02-06 95 views
0

前言:我目前是一年級學生,可以參加一些二年級班。正因爲如此,我目前正在爭吵一種我沒有真正花時間學習的語言(C++)(第一年主要學習C#),所以這段代碼可能不太好。螺紋Mandelbrot程序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; 
} 
+0

輸出計算出的每個點的座標,在出現錯誤的位置應該變得明顯。 –

回答

1

你是隻計算圖像的四分之一,所以你要的,尺寸設置爲halfHeighthalfWidth或填充零的文件。當圖像查看器讀取文件時,它會在單行像素中顯示兩行,直到它到達文件末尾,位於圖像高度的四分之一處。

要解決此問題,您只需計算圖像的其他四分之三,但我建議您從文件寫入函數中分離calc函數:將線程計算結果放入數組中(std::arraystd::vector ),查找正確的顏色,然後寫入文件。

+0

謝謝你的幫助!這只是我需要的答案。 :) – HBraaksma