2017-03-22 3 views
1

Ich muss das Mandelbrot-Set rendern und ich fragte mich, ob jemand mit meinem Code einige Fehler aufzeigen könnte - im Moment zeigt das Ausgabefenster nur einen schwarzen Bildschirm. Ich denke, dass meine Mandelbrot-Mathematik korrekt ist, weil ich den gleichen Code verwendet habe, um eine .tga des mandelbrot auszugeben - hat es etwas mit der OpenGl-Methode zu tun, die ich verwende, um die Pixel auszugeben?Rendering der Mandelbrot-Set in OpenGl

Voll Code:

#include <Windows.h> 
#include <GL\glew.h> 
#include <GL\freeglut.h> 
#include <iostream> 
#include <stdlib.h> 
#include <chrono> 
#include <cstdint> 
#include <cstdlib> 
#include <complex> 
#include <fstream> 
#include <thread> 
#include <mutex> 
#include <vector> 
#include <Windows.h> 

// Import things we need from the standard library 
using std::chrono::duration_cast; 
using std::chrono::milliseconds; 
using std::complex; 
using std::cout; 
using std::endl; 
using std::ofstream; 
// ...other useful includes 
using std::cout; 
using std::endl; 
using std::thread; 
using std::mutex; 
using std::lock; 
using std::unique_lock; 
using std::vector; 

const int width = 600, height = 600; // window size 
int windowID; 

// The number of times to iterate before we assume that a point isn't in the 
// Mandelbrot set. 
// (You may need to turn this up if you zoom further into the set.) 
const int MAX_ITERATIONS = 500; 

bool fullScreen = false; 
bool need_to_draw = true; 

//**************************************** 

// Render the Mandelbrot set into the image array. 
// The parameters specify the region on the complex plane to plot. 
void compute_mandelbrot(double left, double right, double top, double bottom) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the screen buffer 
    glBegin(GL_POINTS); // start drawing in single pixel mode 
    for (int y = 0; y < height; ++y) 
    { 
     for (int x = 0; x < width; ++x) 
     { 
      // Work out the point in the complex plane that 
      // corresponds to this pixel in the output image. 
      complex<double> c(left + (x * (right - left)/width), 
       top + (y * (bottom - top)/height)); 

      // Start off z at (0, 0). 
      complex<double> z(0.0, 0.0); 

      // Iterate z = z^2 + c until z moves more than 2 units 
      // away from (0, 0), or we've iterated too many times. 
      int iterations = 0; 
      while (abs(z) < 2.0 && iterations < MAX_ITERATIONS) 
      { 
       z = (z * z) + c; 

       ++iterations; 
      } 

      if (iterations == MAX_ITERATIONS) 
      { 
       glColor3f(1.0, 0.0, 0.0); // Set color to draw mandelbrot 
       // z didn't escape from the circle. 
       // This point is in the Mandelbrot set. 
       glVertex2i(x, y); 
      } 
      else 
      { 
       glColor3f(0.0, 0.0, 0.0); //Set pixel to black 
       // z escaped within less than MAX_ITERATIONS 
       // iterations. This point isn't in the set. 
       glVertex2i(x, y); 
      } 
     } 
    } 
    glEnd(); 
    glutSwapBuffers(); 
    need_to_draw = false; 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    GLsizei windowX = (glutGet(GLUT_SCREEN_WIDTH) - width)/2; 
    GLsizei windowY = (glutGet(GLUT_SCREEN_HEIGHT) - height)/2; 
    glutInitWindowPosition(windowX, windowY); 
    glutInitWindowSize(width, height); 
    windowID = glutCreateWindow("Mandelbrot"); 

    if (need_to_draw) 
    { 
     compute_mandelbrot(-2.0, 1.0, 1.125, -1.125); 
    } 

    glShadeModel(GL_SMOOTH); 
    glEnable(GL_DEPTH_TEST); 
    glViewport(0, 0, (GLsizei)width, (GLsizei)height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glutMainLoop(); 

    return 0; 
} 
+0

Dies ist möglicherweise die ineffizienteste Art, OpenGL hier zu verwenden ... –

+1

@DietrichEpp: Äh, Sie sehen 2-3 dieser Pixel-Plotter pro Monat. – genpfault

+0

Tut mir leid, dass ich der Typ bin ^^ ... wenn ihr eine andere Methode habt, könnt ihr vorschlagen, ihr solltet es ausprobieren - aber das funktioniert. – Borzi

Antwort

1

Die Identität GL_PROJECTION Matrix Sie nicht eine Abbildung 1-zu-1-Einheit-zu-Pixel nicht geben, wie Sie gehen davon aus, es ist ein +/- (1,1 , 1) Würfel.

Verwenden glOrtho() erhalten die Matrix Sie wollen:

glOrtho(0, width, 0, height, -1, 1); 

Unter Umständen müssen Sie die 3. & 4. Argumente, nicht in der Lage transponieren jetzt zu testen.

+0

Die Transponierung des 3. und 4. Arguments sollte keine Auswirkung haben. –

+0

Dies funktionierte perfekt - musste nicht einmal etwas transponieren/anpassen. Vielen Dank! – Borzi