Danke Danke:  0
Gefällt mir Gefällt mir:  0
Dislikes Dislikes:  0
Ergebnis 1 bis 7 von 7

Thema: Mandelbrot-Menge zeichnen Prog

  1. #1

    Registriert seit
    27.03.07
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Angry Mandelbrot-Menge zeichnen Prog

    Anzeige
    Hey Leute, so kommen meine letzen Threads hier zusammen.

    Ich habe mich an einem netten kleinen Programm versucht um die Mandelbrot-Menge darzustellen.
    Das Problem ist, meiner Meinung nach ist es der Richtige Algorithmus den ich verwende und auch in meinen Klassen usw. finde ich keine Fehler, aber dennoch stimmt mein Bild nicht mit der Mandelbrot-Menge oder dem Apfelmännchen überein.

    Ich wollte jetzt einfach mal den entscheidenden Code hier posten, und euch um Hilfe bitten, euch das mal durchzuschauen und mir zu sagen ob euch etwas auffällt.

    Code:
    commplex_n.h:
    
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    
    class complex_n
    {
        public:
            void set_x_y(double a, double b);
            void out();
            complex_n operator^(double n);
            complex_n operator+(complex_n a);
            complex_n operator=(complex_n c);
            int mandelbrot(complex_n z0);
            double abs(complex_n a);
    
        private:
            double x, y;
    };
    
    
    complex_n.cpp:
    
    #include "complex_n.h"
    
    complex_n complex_n::operator^(double n)
    {
        x = x*x - y*y;
        y = 2*x*y;
    
        return *this;
    
    }
    
    complex_n complex_n::operator=(complex_n c)
    {
        x = c.x;
        y = c.y;
    
        return *this;
    }
    
    void complex_n::set_x_y(double a, double b)
    {
        x = a;
        y = b;
    }
    
    complex_n complex_n::operator+(complex_n a)
    {
        x+=a.x;
        y+=a.y;
    
        return *this;
    }
    
    void complex_n::out()
    {
        cout<<"("<<x<<";"<<y<<")"<<endl;
    }
    
    double complex_n::abs(complex_n a)
    {
        complex_n z;
        double erg;
    
        z = a;
        erg = z.x*z.x - z.y*z.y;
        if(erg < 0)
        {
            erg*=-1;
        }
        return erg;
    }
    
    
    int complex_n::mandelbrot(complex_n c)
    {
        int n = 1;
        complex_n z[180];
        z[0] = c;
    
        while(n <= 180)
        {
            z[n] = (z[n-1]^2) + c;
    
            //z[n].out(); cout<<" n: "<<n;
    
            if(abs(z[n]) > 4)
            {
                break;
            }
            ++n;
        }
    
        return n;
    }
    Code:
    main.cpp:
    
    #include <allegro.h>
    #include <iostream>
    #include "complex_n.h"
    using namespace std;
    
    
    int main()
    {
        int x_size = 1000;
        int y_size = 1000;
    
        int x;
        int y;
    
        complex_n c1, c2;
    
    
        allegro_init();
        install_keyboard();
        install_mouse();
        set_gfx_mode( GFX_AUTODETECT_WINDOWED, x_size, y_size, 0, 0);
    
        show_os_cursor(MOUSE_CURSOR_ARROW);
    
        clear_to_color( screen, makecol( 255, 255, 255));
    
        acquire_screen();
    
        int n;
    
    
        for(double a = -5; a < 5; a+=0.01)
        {
            for(double b = -5; b < 5; b+=0.01)
            {
    
                x = a*100 + 500;
                y = b*100 + 500;
    
                c1.set_x_y(a,b);
    
                n = c2.mandelbrot(c1);  //aufruf der Mandelbrot-Funktion
    
                if(n >= 181)
                {
                    putpixel( screen, x, y, makecol( 0, 0, 0));
                }
    
                if(n <= 1)
                {
                    putpixel( screen, x, y, makecol( 255, 255, 255));
                }
                if(n < 4 && n > 1)
                {
                    putpixel( screen, x, y, makecol( 0, 255, 0));
                }
    
                if(n < 8 && n >= 4)
                {
                    putpixel( screen, x, y, makecol( 255, 0, 0));
                }
    
                if(n < 180 && n >= 8)
                {
                    putpixel( screen, x, y, makecol( 0, 0, 255));
                }
            }
        }
    
        for(int b = 0; b<y_size; ++b)
        {
            putpixel( screen, 200, b, makecol( 0, 0, 0));
            putpixel( screen, 300, b, makecol( 0, 0, 0));
            putpixel( screen, 400, b, makecol( 0, 0, 0));
            putpixel( screen, 500, b, makecol( 0, 0, 0));
            putpixel( screen, 600, b, makecol( 0, 0, 0));
            putpixel( screen, 700, b, makecol( 0, 0, 0));
            putpixel( screen, 800, b, makecol( 0, 0, 0));
        }
        textout(screen, font, "0", 500, 4, 255);
    
    
        for(int a = 0; a<x_size; ++a)
        {
            putpixel( screen, a, 200, makecol( 0, 0, 0));
            putpixel( screen, a, 300, makecol( 0, 0, 0));
            putpixel( screen, a, 400, makecol( 0, 0, 0));
            putpixel( screen, a, 500, makecol( 0, 0, 0));
            putpixel( screen, a, 600, makecol( 0, 0, 0));
            putpixel( screen, a, 700, makecol( 0, 0, 0));
            putpixel( screen, a, 800, makecol( 0, 0, 0));
        }
    
        release_screen();
    
        readkey();
    
        return 0;
    }
    ich weiß es ist viel Code zum durchschauen und ich hab jetzt so spät auch nicht mehr die Zeit gefunden ihn auszukommentieren, aber ich glaube er ist eigentlich ganz gut verständlich und erklärt sich aus Klassen/Var-Namen.
    Falls man ihn doch nicht peilt weil er zu unüberischtlich ist, poste ich morgen einen mit Comments nach.

    Hoffe es kann mir jemand helfen ich habe nämlich wirklich keine Idee mehr woran es liegen kann.
    Hier noch das Bild das es erstellt -> Anhang: (Die Farbverteilung ist auf dem Bild etwas anders als sie dem Code zu entnehmen ist)
    Angehängte Grafiken Angehängte Grafiken

  2. #2

    Registriert seit
    27.03.07
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    will oder kann mir niemand helfen ?

  3. #3
    Member of Honour Avatar von bad_alloc
    Registriert seit
    27.12.07
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    172

    Standard

    will oder kann mir niemand helfen ?
    Wir wollen alle!
    Ich hab mal kurz drübergeschaut und rate einfach mal: Hast du genügend Iterationen gewählt?
    You shoot yourself in somebody else's foot.|Wait. It's a trick. Get an axe.
    |[A]| = p(·,|[A]|)+1 | Hacker werden?

  4. #4

    Registriert seit
    27.03.07
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    egal ob 180 oder 1800 Iterationen das Ergebnis ist in etwa das selbe.

  5. #5

    Registriert seit
    27.03.07
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    verdammt leute, 180 views und keine Antworten ?! Faulheit oder ist mein Code nicht lesbar... ?

  6. #6
    Member of Honour Avatar von ivegotmail
    Registriert seit
    28.05.03
    Danke (erhalten)
    1
    Gefällt mir (erhalten)
    4

    Standard

    Das hier sieht verdächtig aus.
    Code:
    complex_n complex_n::operator^(double n)
    {
        x = x*x - y*y;
        y = 2*x*y;
    
        return *this;
    
    }
    Bei der Zuweisung von y benutzt den neuberechneten x Wert und den alten y Wert. Hier muss wohl mit temporären Variablen gearbeitet werden.

    Code:
        double xt = x*x - y*y;
        double yt = 2*x*y;
    
        x = xt;
        y = yt;
    Und warum überladest du den Operator ^ mit dem Parameter "n", wenn du diesen an der Stelle gar nicht verwendest?

  7. #7

    Registriert seit
    27.03.07
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard

    Anzeige
    zu Punkt 1, das ist mir noch gar nicht aufgefallen aber das klingt echt logisch, hammer danke werds gleich mal schnell ausprobieren.
    zu Punkt 2: Die Methode wie sie jetzt steht ist noch ne vereinfachung ich will noch etwas einbauen das ich beliebig hoch nehmen kann.

    DANKE !!! ganz ehrlich ... da wäre ich wahrscheinlich nicht mehr drauf gekommen, das sind immer diese dummen Fehler eig stimmt alles im groben aber es ist halt doch etwas falsch ^^

    CLOSE
    Geändert von <b00n> (14.02.10 um 15:22 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •