Mandelbrotmenge

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

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Bagplatt.

    Mandelbrotmenge

    Hallo zusammen,

    Ich weis, es gibt schon mehrere Threads zu dem Thema. Doch ich habe irgendwo in der Rechnung einen Fehler.

    Ich nehme mal stark an, dass der Betrag n oder c bereits bei Iterationsbeginn den Maximalenbetrag überschreitet, und somit die Iteration beendet.
    Wieso? Hab gestern mehrere Versuche gemacht, wobei oft auch ein einfacher Kreis entstanden ist, der ich von Bildern im Netz bei der Iterationstiefe 1 sehe. Seltsamer weiße gingen
    von diesem Strahlen aus, ähnlich einer Sonne.


    So sieht dass im Moment aus.

    VB.NET-Quellcode

    1. Public Sub GetFont()
    2. Dim xL As Double = Math.Abs(xMin) + Math.Abs(xMax)
    3. Dim yL As Double = Math.Abs(yMin) + Math.Abs(yMax)
    4. Dim oX As Double = xL / bmp.Width
    5. Dim oY As Double = yL / bmp.Height
    6. Dim l As Integer = bmp.Width - 1
    7. Dim h As Integer = bmp.Height - 1
    8. Dim frk(l, h) As Color
    9. Parallel.For(0, l - 1, Sub(X)
    10. Parallel.For(0, h - 1, Sub(Y)
    11. Dim kx As Double = (X * oX) + xMin
    12. Dim ky As Double = (Y * oY) + yMin
    13. Dim xx As Double = kx * kx
    14. Dim yy As Double = ky * ky
    15. Dim xy As Double = kx * ky
    16. Dim Betrag_2 As Integer = xx + yy
    17. Dim remain_iter As Integer = 500
    18. Do While Betrag_2 <= 2 And remain_iter > 0
    19. remain_iter = remain_iter - 1
    20. kx = xx - yy + kx
    21. ky = xy + xy + ky
    22. xx = kx * kx
    23. yy = ky * ky
    24. xy = kx * ky
    25. Betrag_2 = xx + yy
    26. Loop
    27. If remain_iter = 0 Then
    28. frk(X, Y) = Color.Black
    29. Else
    30. Dim drS As Double = 200 - remain_iter - Math.Log(Math.Log(Betrag_2) / Math.Log(4)) / Math.Log(2)
    31. Dim c As Single = Math.Abs(drS)
    32. frk(X, Y) = Color.FromArgb(c)
    33. 'max_iter - remain_iter – log(log(betrag_2) / log(4)) / log(2)
    34. End If
    35. End Sub)
    36. End Sub)
    37. For x As Integer = 0 To l
    38. For y As Integer = 0 To h
    39. SetPixel(New Point(x, y), frk(x, y))
    40. Next
    41. Next
    42. End Sub


    Dass war der erste Versuch.

    VB.NET-Quellcode

    1. Private Sub NewTest()
    2. Dim xL As Double = Math.Abs(xMin) + Math.Abs(xMax)
    3. Dim yL As Double = Math.Abs(yMin) + Math.Abs(yMax)
    4. Dim oX As Double = xL / bmp.Width
    5. Dim oY As Double = yL / bmp.Height
    6. Dim n As Integer = 0 'Iterationstiefe
    7. Dim l As Double = 4 'Grenze
    8. Dim x, y As Double
    9. Dim c, d As Double
    10. For reel As Integer = 0 To bmp.Width - 1
    11. For ima As Integer = 0 To bmp.Height - 1
    12. n = 0
    13. l = 0
    14. x = xMin + (oX * reel)
    15. y = yMin + (oY * ima)
    16. Do While l <= 4 And n <= 100
    17. c = x : d = y
    18. x = (c * c) - (d * d) + x
    19. y = (2 * c * d) + y
    20. l = Math.Sqrt((x * x) + (y * y))
    21. n += 1
    22. Loop
    23. If l < 4 Then
    24. bmp.SetPixel(reel, ima, Color.Black)
    25. End If
    26. Next
    27. Next
    28. End Sub


    Dass der 2 von dem auch das Bild stammt.

    Könnt ihr mir sagen was genau da nicht stimmt?

    LG

    #Edit

    Verändere ich :

    VB.NET-Quellcode

    1. ​ x = (c * c) - (d * d) + x
    2. y = (2 * c * d) + y


    in

    VB.NET-Quellcode

    1. ​ x = (c * c) - (d * d) + oX
    2. y = (2 * c * d) + oY


    Entsteht besagter Kreis bzw. Oval.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bagplatt“ ()