Mandelbrot wird falsch gezeichnet

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Mandelbrot wird falsch gezeichnet

    Hallo,

    ich bin grad ziemlich am verzweifeln... Ich weiß einfach nicht wo mein Fehler liegt :cursing:
    Mein Mandelbrot wird momentan so gezeichnet:


    Das hier ist die Funktion mit der das Fraktal gezeichnet wird:

    Visual Basic-Quellcode

    1. Public Function zeichnen(ByVal c As KomplexeZahl, ByVal iliteration As Integer) As Bitmap
    2. Dim urx As Double = c.var_x
    3. For y As Integer = 0 To bm.Height - 1 'Spalte
    4. For x As Integer = 0 To bm.Width - 1 'Zeile
    5. Dim reknum As Integer = Form.rekursion(c, iliteration)
    6. If reknum = iliteration Then
    7. drawPixel(Color.Black, x, y)
    8. ElseIf reknum < iliteration Then
    9. drawPixel(Color.MediumSeaGreen, x, y)
    10. End If
    11. c.var_x += deltax
    12. Next
    13. c.var_x = urx
    14. c.var_y += deltay
    15. Next
    16. Return bm
    17. End Function

    KomplexeZahl ist einfach eine Klasse die 2 Werte speichert -> var_x und var_y

    Meine Funktion zur Rekursion:

    Visual Basic-Quellcode

    1. Public Function rekursion(ByVal c As KomplexeZahl, ByVal n_max As Integer) As Integer
    2. Dim n As Integer = 0 'n sind die Durchgänge
    3. Dim z As KomplexeZahl = New KomplexeZahl(0, 0) 'Der Startwert von z ist (0|0)
    4. While z.betrag < 2 And n < n_max 'Solange der Betrag von z nicht größer ist als 2 und die max. Druchgänge nicht überstiegt, soll er rechnen
    5. z.multipliziere(z) 'z hoch 2 wird ausgerechnet
    6. z.subtrahiere(c) 'Die Formel f(z) = z^2 - c wird berechnet
    7. n += 1 'Ein Durchgang wird dazu addiert
    8. End While
    9. Return n 'Falls der Betrag über 2 kommt oder die max. Durchgänge überstiegen wurden, wird hier zurückgegeben


    Bitte weist mich auf den Fehler auf, wenn ihr ihn erkannt habt. Ich sitz hier schon stundenlang dran und kann mir den Fehler nicht erklären.
    Ich vermute ich habe es mit der Rekursion vllt. nicht ganz verstanden :/

    Ich hoffe mir kann da jmd. helfen :love:


    MfG St0on

    St0on schrieb:

    Bitte weist mich auf den Fehler hin
    Wo hast Du denn diesen Algorithmus her?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab den selbst geschrieben. Hab nur den theoretischen Teil durchgelesen wie ein Mandelbrot Fraktal erstellt wird und muss jetzt selber klar kommen und verstehen und umsetzen.

    Ok, vllt ist meine "rekursion" keine Rekursion im eigentlichen Sinne, aber ich denke er erfüllt meinen Zweck (denk ich jedenfalls). Er rechnet ja so lange bis eine bestimmte Abbruchsequenz eintritt und gibt mir zurück wie oft "rekursiert" wurde. Beim Mandelbrot ist diese Zahl ausschlaggiebig dafür, welche Farbe es im Bild bekommt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „St0on“ ()

    St0on schrieb:

    den theoretischen Teil durchgelesen
    Wo hast Du diesen gefunden?
    Wen wir was testen sollen, müssen wir wissen, gegen welche Spezifikation getestet werden soll.
    Wenn ein Programm bei Druck auf Button1, Button2, Button3 abstürzt und wir sagern, das Programm stürzt bei Druck auf Button1, Button2, Button3 ab, sagst Du, das soll so sein, weil ich es so programmiert habe.
    Also:
    Wie soll es sein?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    St0on schrieb:

    meins wird aber falsch gezeichnet
    ich denke eher falsch gerechnet.
    Kannst Du bitte mal Deinen kompletten Code sowie die Startwwerte posten?
    Sieh Dir mal die komplexe Mukltiplikation an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Sieh Dir mal die komplexe Mukltiplikation an.

    St0on schrieb:

    Die Multiplikation sieht für mich richtig aus.

    VB.NET-Quellcode

    1. Public Sub multipliziere(ByVal koZahl As KomplexeZahl)
    2. Dim re As Double = Me.varX * koZahl.varX - Me.varY * koZahl.varY
    3. Dim im As Double = Me.varX * koZahl.varY + Me.varY * koZahl.varX
    4. Me.varX = re
    5. Me.varY = im
    6. End Sub
    Bilder
    • Mandelbrod.png

      28,32 kB, 514×495, 168 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was zum...
    Ich hab jetzt genau die selben rechnungen in einzelne Variabeln gepackt, wie du es mir nun gezeigt hast und jetzt...

    Ok vielen dank, ich bin grad echt sprachlos :S

    Ich versteh' das aber trotzdem jetzt nicht ganz... Ich hab diese Funktion auch mit einzelnen Zahlen getestet und dazu schriftlich auf Papier selber gerechnet und es kam immer das richtige ergebnis bei raus.
    Wieso hat es nicht geklappt und jetzt klappt es schon?
    @St0on
    Falls Du deine Apfelmännchen schneller malen willst, berechne den komplexen Betrag mit Multiplikation, nicht aber mit Exponentialrechnung:

    C#-Quellcode

    1. public double Betrag
    2. {
    3. get { return Math.Sqrt(this.Re * this.Re + this.Im * this.Im); }
    4. }
    Und beschäftige Dich ein wenig mit Parallel.For(). ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!