2015-03-02 58 views
-1

我有完成C++中的mandelbrot程序的任務。我在C++中並不擅長,我更喜歡Java或C#,但這必須在C++中完成。我得到了一些我必須完成的示例代碼。我試圖把繪圖代碼放在main(在作品註釋之間)到一個方法(draw_Mandelbrot)中。主要方法中的代碼工作,並給了我一個不錯的mandelbrot圖像,但是當我使用draw_Mandelbrot方法(並在主註釋繪製代碼)時,我得到一個灰色的矩形圖像作爲輸出。我如何使draw_Mandelbrot方法起作用? draw_Mandelbrot方法之上的代碼都是示例代碼,並不是由我自己創建的。Mandelbrot繪製方法

// mandelbrot.cpp 
// compile with: g++ -std=c++11 mandelbrot.cpp -o mandelbrot 
// view output with: eog mandelbrot.ppm 

#include <fstream> 
#include <complex> // if you make use of complex number facilities in C++ 
#include <iostream> 
#include <cstdlib> 
#include <complex> 


using namespace std; 

template <class T> struct RGB { T r, g, b; }; 

template <class T> 
class Matrix { 
public: 
    Matrix(const size_t rows, const size_t cols) : _rows(rows), _cols(cols) { 
     _matrix = new T*[rows]; 
     for (size_t i = 0; i < rows; ++i) { 
      _matrix[i] = new T[cols]; 
     } 
    } 
    Matrix(const Matrix &m) : _rows(m._rows), _cols(m._cols) { 
     _matrix = new T*[m._rows]; 
     for (size_t i = 0; i < m._rows; ++i) { 
      _matrix[i] = new T[m._cols]; 
      for (size_t j = 0; j < m._cols; ++j) { 
       _matrix[i][j] = m._matrix[i][j]; 
      } 
     } 
    } 
    ~Matrix() { 
     for (size_t i = 0; i < _rows; ++i) { 
      delete [] _matrix[i]; 
     } 
     delete [] _matrix; 
    } 
    T *operator[] (const size_t nIndex) 
    { 
     return _matrix[nIndex]; 
    } 
    size_t width() const { return _cols; } 
    size_t height() const { return _rows; } 
protected: 
    size_t _rows, _cols; 
    T **_matrix; 
}; 

// Portable PixMap image 
class PPMImage : public Matrix<RGB<unsigned char> > 
{ 
public: 
    PPMImage(const size_t height, const size_t width) : Matrix(height, width) { } 
    void save(const std::string &filename) 
    { 
     std::ofstream out(filename, std::ios_base::binary); 
     out <<"P6" << std::endl << _cols << " " << _rows << std::endl << 255 << std::endl; 
     for (size_t y=0; y<_rows; y++) 
      for (size_t x=0; x<_cols; x++) 
       out << _matrix[y][x].r << _matrix[y][x].g << _matrix[y][x].b; 
    }  
}; 


void draw_Mandelbrot(PPMImage image, const unsigned width, const unsigned height, double cxmin, double cxmax, double cymin, double cymax,unsigned int max_iterations)       
{ 
    for (std::size_t ix = 0; ix < width; ++ix) 
     for (std::size_t iy = 0; iy < height; ++iy) 
     { 
      std::complex<double> c(cxmin + ix/(width - 1.0)*(cxmax - cxmin), cymin + iy/(height - 1.0)*(cymax - cymin)); 
      std::complex<double> z = 0; 
      unsigned int iterations; 

      for (iterations = 0; iterations < max_iterations && std::abs(z) < 2.0; ++iterations) 
       z = z*z + c; 

      image[iy][ix].r = image[iy][ix].g = image[iy][ix].b = iterations; 

     } 
} 

int main() 
{ 
    const unsigned width = 1600; 
    const unsigned height = 1600; 

    PPMImage image(height, width); 


    //image[y][x].r = image[y][x].g = image[y][x].b = 255; // white pixel 
    //image[y][x].r = image[y][x].g = image[y][x][b] = 0; // black pixel 
    //image[y][x].r = image[y][x].g = image[y][x].b = 0; // black pixel 


    //// red pixel 
    //image[y][x].r = 255; 
    //image[y][x].g = 0; 
    //image[y][x].b = 0; 

    draw_Mandelbrot(image, width, height, -2.0, 0.5, -1.0, 1.0, 10); 

    //works   

    //double cymin = -1.0; 
    //double cymax = 1.0; 
    //double cxmin = -2.0; 
    //double cxmax = 0.5; 
    //unsigned int max_iterations = 100; 

    //for (std::size_t ix = 0; ix < width; ++ix) 
    // for (std::size_t iy = 0; iy < height; ++iy) 
    // { 
    //  std::complex<double> c(cxmin + ix/(width - 1.0)*(cxmax - cxmin), cymin + iy/(height - 1.0)*(cymax - cymin)); 
    //  std::complex<double> z = 0; 
    //  unsigned int iterations; 

    //  for (iterations = 0; iterations < max_iterations && std::abs(z) < 2.0; ++iterations) 
    //   z = z*z + c; 

    //  image[iy][ix].r = image[iy][ix].g = image[iy][ix].b = iterations; 

    // } 

    //works 

    image.save("mandelbrot.ppm"); 
    return 0; 
} 

輸出圖像中的主方法

mandelbrot

+0

Downvoter請解釋一下? – Sybren 2015-03-02 13:11:02

回答

2

你按值傳遞的圖像使用該代碼時,使一個單獨的圖像上的功能的工作原理的一個在main,其處於初始狀態。

按引用傳遞:

void draw_Mandelbrot(PPMImage & image, ...) 

或返回值:

PPMImage draw_Mandelbrot(...) { 
    PPMImage image(height, width); 
    // your code here 
    return image; 
} 

// in main 
PPMImage image = draw_Mandelbrot(...); 
+0

謝謝,它現在有效。知道它必須是簡單的東西。 – Sybren 2015-03-02 13:28:17