Fraktale Welten

  • Allgemein

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Bagplatt.

    Fraktale Welten

    Hallo zusammen,

    Ich hab in letzter Zeit gefallen an der Generierung von Fraktalen gefunden. Doch die Umsetzung bereitet mir immer wieder Probleme.

    Das Mathematische Know-How, insbesondere die Umstellung von Formeln in den Programmcode fällt mir schwer.

    Erstes Beispiel : Hüpfer - Fraktale

    VB.NET-Quellcode

    1. Private Function GetHopalong(ByVal a As Double, ByVal b As Double, ByVal c As Double, ByVal num As Integer, ByVal middle As Point) As Bitmap
    2. Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
    3. Dim xx, yy As Double
    4. Dim x As Integer = 0
    5. Dim y As Integer = 0
    6. For i As Integer = 0 To num
    7. Dim pkt As New Point(CInt(x + middle.X), CInt(y + middle.Y))
    8. If pkt.Y > 0 And pkt.Y < bmp.Height Then
    9. If pkt.X > 0 And pkt.X < bmp.Width Then
    10. bmp.SetPixel(pkt.X, pkt.Y, Color.Black)
    11. End If
    12. End If
    13. xx = yy + Math.Sign(x) * (Math.Abs(b * x - c))
    14. yy = a - x
    15. x = CInt(xx)
    16. y = CInt(yy)
    17. Next
    18. Return bmp
    19. End Function


    Zeichnen tut es, doch nicht dass was es soll. Anhand von den Beispiel Bildern und deren Werten kann ich ja vergleichen ob dass Ergebniss stimmt.

    Informationen hab ich von hier : mathematische-basteleien.de/huepfer.htm#Algorithmus

    Meine Lieblingsquelle Wikipedia liefert mir absolut keine Informationen dazu.

    Zweites Beispiel : Mira - Fraktal



    Man soll einen Punkt als Input geben. Anhand der Formel wird dann der Punkt errechnet und für die weitere Iteration verwendet. Sollte eigentlich ganz einfach sein.

    Doch dann kommt folgender Satz : Diese Iteration wird solange wiederholt, bis sich aus der Folge der aufgezeichneten Bildpunkte ein Attraktor erkennen lässt.

    Infos : fraktalwelt.de/myhome/simpiter-g.htm

    Selbst aus Wikipedia werde ich nicht schlau was dieser Attraktor ist. Ich könnte nur annehmen, dass die Menge sich an einen Punkt nähert der sich nicht mehr viel ändert.
    Ähnlich der Mandelbrotmenge die gegen unendlich strebt.

    Aber selbst mit einer Festen Anzahl an Iterationen kommt kein wirkliches Bild heraus.

    VB.NET-Quellcode

    1. Private Function GetMiraAttraktor(ByVal P As Point, ByVal a As Double, ByVal b As Double, ByVal scale As Double) As Bitmap
    2. 'Es geht ein Anfangspunkt rein.
    3. Dim x, y As Double
    4. Dim bmp As New Bitmap(500, 500)
    5. x = b * P.X + MiraFX(a, P.X)
    6. y = -x + MiraFX(a, x)
    7. For i As Integer = 0 To 10000066
    8. bmp.SetPixel(CInt(scale * x + (CInt(bmp.Width / 2))), CInt(scale * y + (CInt(bmp.Height / 2))), Color.Red)
    9. x = b * P.X + MiraFX(a, x)
    10. y = x + MiraFX(a, x)
    11. ' MsgBox(x & " : " & y)
    12. Next
    13. Return bmp
    14. End Function
    15. Private Function MiraFX(ByVal a As Double, ByVal x As Double) As Double
    16. Return a * x - (1 - a) * ((2 * x * x) / (1 + x * x))
    17. End Function


    Was stimmt da nicht? :D

    P.S Mir geht es eher darum ob ich die Formel richtig habe. Und wie ich mir dass besser verständlich machen kann, und wie dass Funktioniert. Deswegen im Offtopic und nicht VB Forum

    *Topic (trotzdem) verschoben*
    Bilder
    • miraf.gif

      809 Byte, 170×113, 728 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Nun der Huepfer Funktioniert so :

    VB.NET-Quellcode

    1. Private Function Create_Huepfer(ByVal a As Double, ByVal b As Double, ByVal c As Double, ByVal z As Integer) As Bitmap
    2. Dim pktArr(z) As Point ' Zum Zentrieren der Bitmap
    3. Dim x As Double = 0
    4. Dim y As Double = 0
    5. Dim xx As Double
    6. Dim yy As Double
    7. For i As Integer = 0 To z
    8. xx = y + Math.Sign(x) * Math.Sqrt(Math.Abs(b * x - c))
    9. yy = a - x
    10. x = xx
    11. y = yy
    12. pktArr(i) = New Point(CInt(x), CInt(y))
    13. Next
    14. Dim dx As Integer = 0
    15. Dim hx As Integer = 0
    16. Dim dy As Integer = 0
    17. Dim hy As Integer = 0
    18. For i As Integer = 0 To z
    19. Dim cP As Point = pktArr(i)
    20. If cP.Y < 0 And cP.Y < dy Then dy = cP.Y
    21. If cP.Y > 0 And cP.Y > hy Then hy = cP.Y
    22. If cP.X < 0 And cP.X < dx Then dx = cP.X
    23. If cP.X > 0 And cP.X > hx Then hx = cP.X
    24. Next
    25. Dim bmp As New Bitmap(Math.Abs(dx) + hx + 1, Math.Abs(dy) + hy + 1)
    26. Dim mdl As New Point(CInt(bmp.Width / 2), CInt(bmp.Height / 2))
    27. For i As Integer = 0 To z
    28. Dim pX As Integer = pktArr(i).X - dx
    29. Dim pY As Integer = pktArr(i).Y - dy
    30. bmp.SetPixel(pX, pY, Color.Green)
    31. Next
    32. Return bmp
    33. End Function


    Kann man sicher noch verschönern :




    Doch bei dem Mira - Fraktal weiß ich immer noch nicht was dieser Atraktor bewirkt, bzw. wie ich einen schreiben soll.
    Bilder
    • wad.png

      68,84 kB, 497×255, 677 mal angesehen

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

    Andere Fraktale

    Hallo ? :D

    Nach Stunden mit ausprobieren hab ich dass Mira - Fraktal doch hinbekommen :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function MiraFx(ByVal x As Double, ByVal a As Double) As Double
    2. Return (a * x - (1 - a) * (2 * x * x) / (1 + x * x))
    3. End Function
    4. Private Function GetNextPoint(ByVal p As PointF, ByVal a As Double, ByVal b As Double) As PointF
    5. Dim zx, zy As Double
    6. zx = b * p.Y + (MiraFx(p.X, a))
    7. zy = -p.X + MiraFx(zx, a)
    8. Return New PointF(zx, zy)
    9. End Function
    10. Private Sub DrawMira()
    11. Dim bmp As New Bitmap(PictureBox1.Size.Width, PictureBox1.Height)
    12. Dim a As Double = -0.212
    13. Dim b As Double = 0.998
    14. Dim x As Double = 0
    15. Dim y As Double = 4
    16. Dim xx As Integer = 0
    17. Dim yy As Integer = 0
    18. Dim dots As Integer = 9000
    19. Dim scale As Double = 9.58
    20. For i As Integer = 0 To dots
    21. Dim p As PointF = GetNextPoint(New PointF(x, y), a, b)
    22. x = p.X : y = p.Y
    23. xx = Math.Round(scale * x + PictureBox1.Width / 2)
    24. yy = Math.Round(scale * y + PictureBox1.Height / 2)
    25. If xx > 0 And xx < bmp.Width - 1 Then
    26. If yy > 0 And yy < bmp.Height - 1 Then
    27. bmp.SetPixel(xx, yy, Color.Black)
    28. End If
    29. End If
    30. Next
    31. PictureBox1.Image = bmp
    32. End Sub


    Ohne Farben oder ähnliches, hauptsache es läuft erstmal.

    Die Hüpfer Fraktale hab ich um einen Paramter G erweitert, dieser soll eine Räumliche Tiefe erzeugen in dem er die Paramter pro Ebne bearbeitet.

    Hier Ein Paar Beispiele :

    Spoiler anzeigen


    Hüpfer Fraktale



    Mira Fraktale




    Kennt ihr noch weitere Fraktale, Muster o.ä ? ?( ?( ?( ?(
    @Bagplatt Sehr schöne Farben und Muster. :thumbup:
    Die Mandelbrot-Menge ist das einzige, was mir da noch einfällt, hast Du aber bereits erwähnt.
    Vielleicht noch ein paar Hinweise, die sich auch günstig auf die LAufzeit auswirken:
    VB kennt einen Operator für Integer-Division:

    VB.NET-Quellcode

    1. Dim a = 1 / 3 ' =0.33333333
    2. Dim b = 1 \ 3 ' =0
    Da kannst Du Deine Ausfrücke CInt(bmp.Width / 2) alle umschreiben: (bmp.Width \ 2).
    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:

    VB kennt einen Operator für Integer-Division:


    Danke :) Hab ich nicht gewusst.

    Ja die Mandelbrotmenge habe ich schon, genauso die Juliafraktale. Das GameOfLife ist auch interessant, habe dass mal mit den Orginalen Regeln und unzähligen abgewandelten erstellt.
    Diese obigen 2 Fraktale hab ich beim stöbern gefunden. Interessant ist dass ich nicht mal auf Wikipedia darüber etwas nachlesen kann, oder die Fraktale haben Fachnahmen die ich nicht kenne.

    Dass einzige was ich noch kenne :
    • Selbstorganisation von Vektoren von Wolfhard Hövel
    • Langton-Ameisen
    • Hénon map
    • Curlicue Fractal
    Diese Seite gibt einiges her : mathworld.wolfram.com/topics/Fractals.html


    Was ich aber noch nicht ganz verstanden habe : Die obige Formel (erster Post) ist noch relativ leicht verständlich.

    Doch wenn ich jetzt so etwas habe :

    Woher weis ich, für was die einzelnen Variabel stehen wenn ich vom Kontext ausschließen kann dass es jetzt z.B. um die X oder Y Position geht. Sprich F für Funktion oder so.
    Jetzt steht -lim vor dem Bruch. Wass machen? Multiplitzieren?Dividieren. Woher weiß ich wenn kein Rechenzeichen angegeben ist was ich machen muss. Gibts da eine Grundregel?

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

    Quellcode

    1. Feigenbaum
    2. http://mathworld.wolfram.com/FeigenbaumFunction.html
    3. http://mathworld.wolfram.com/FeigenbaumConstant.html
    4. https://de.wikipedia.org/wiki/Mitchell_Feigenbaum


    Quellcode

    1. Mit Mandelbrot und Julia gute Möglichgkeiten sind
    2. http://www.wackerart.de/fractal.html
    3. http://www.wackerart.de/fractal_algorithem_definition.html
    4. http://www.wackerart.de/fractal_algorithem_definition_2.html


    Quellcode

    1. Burning Ship
    2. http://www.wackerart.de/burning-ship.html
    3. https://en.wikipedia.org/wiki/Burning_Ship_fractal


    Der Hüpfer wurde hier schon mal angesprochen
    Hopalong - Fraktal

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Hi

    exc-jdbi schrieb:

    Der Hüpfer wurde hier schon mal angesprochen


    Da hätten wir schonden Fachnamen :D "Hopalong"

    Bin damit ja aber bereits fertig, oder z.m. zufrieden.


    Ich probiere jetzt erstmal die Punkte die ich oben erwähnt habe durch.


    Könntest du mir die Frage von oben beantworten? Wenn bei einer Term/Formel zweich Variabeln o.ä nebeneinander stehen. Die defenetiv 2 verschienden sind; Also

    z.B. a b +1 | a & b sind 2 Verschiedene

    Ergibt dass dann a*b+1; a+b+1;a-b+1

    Hoffe verstehst worauf ich hinaus will. Im den Programmen von oben hab ich dass so gelöst, dass ich die 2 Variabeln miteinander multiplitziere. Weis aber nicht ob dass Mathematisch richtig ist.