Quaternion

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Farliam.

    Hallo zusammen,

    Hat jemand eine Idee, ob es möglich ist das Mandelbrot in 3D Darzustellen? Ich habe mir eine Klasse für Quaternions erstellt, und schon ein "Mandelbrot" ähnliches Konstrukt darstellen können(Für jede Z Ebne 1 Bild)

    Ich habe bereits mit folgenden Bereichen :

    VB.NET-Quellcode

    1. Dim xmin As Double = -2.0
    2. Dim xmax As Double = 2.0
    3. Dim xStep As Double = GetAbsolute(xmin, xmax) / Kantenlänge
    4. Dim ymin As Double = -2.0
    5. Dim ymax As Double = 2.0
    6. Dim yStep As Double = GetAbsolute(ymin, ymax) / Kantenlänge
    7. Dim zmin As Double = -2.0
    8. Dim zmax As Double = 2.0
    9. Dim zStep As Double = GetAbsolute(zmin, zmax) / Kantenlänge


    Folgendes Ergebniss :



    Jede Frame entspricht quasi einem Sprung in der Z Achse.
    Wenn ich nun die Menge verwende die NICHT dazugehört, und diese im 3 Dimensionalen Raum darstellen würde, und jeden Punkt um + X erweitern würde(Für die Menge die dazu gehört) könnte das was werden?

    Und vor allem, ich weiß zur Zeit nicht wirklich, was ich für den 4ten Parameter in dem Quaternion einsetzen soll.

    VB.NET-Quellcode

    1. Dim c As New Quaternion(xmin + (x * xStep), ymin + (y * yStep), zmin + (z * zStep), 0.23)


    Der letzte Parameter ist der, der mich etwas stutzig macht.

    LG

    Für die Vorstellung - wir schauen nicht von außen auf das 3D Mandelbrot. Die Perspektive Darstellung, oder eben die "Kamera" befindet sich innerhalb der Menge. Der Schwarze Bereich, somit sollte dann doch auch ein Zoom in die Randbereiche möglich sein?

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

    So wie ich das im Video gesehen habe, hast du ja schon das 3D Gebilde, es sind ja nur einzelne Schnitte oder Ebenen.
    (So etwa wie ein 3D Drucker arbeiten würde)
    Daraus könntest du die Koordinaten jedes Punktes gleicher Farbe speichern.
    Das wäre dann die Außenseite (oder Innenseite) einer bestimmten Farbe.
    Damit hättest du erst mal ein Punktwolke.
    Das müsste so weit ich weiß, dann einer bestimmten Rechentiefe entsprechen.

    Ich hatte auch schon mal versucht mir Quaterionen vorzustellen, hatte es dann aber erst mal aufgegeben ;)
    @Lightsource Genau es sind die einzelne Schnitte durch den Würfel.
    Ich hab noch ein wenig mit dem 3ten Imaginären Anteil des Quanternion gespielt.
    Ich habe eigentlich erwartet das bei einem Eintrag von 0.0 überhaupt keine Darstellung erfolgt.
    Doch stadtessen wurde das Mandelbrot absolut Perfekt und ohne Verzerrung wie im obigen Video dargestellt.



    Ich werde mal eine Animation erstellen, die genau in der Mitte des "Würfels" ist. Dort wo das Mandelbrot komplett dargestellt wird.
    Dann beginne ich den 4ten Wert im Quaternion langsam um 0.001 zu erhöhen, und schaue ob ich diesen eventuell sogar als Parameter für die Rotation verwenden kann, bzw. was genau er verzerrt.


    Zur Zeit Färbe ich alle Bereiche wo den MaxBetrag von 50 erreichen. Das würde zwar die 3D Darstellung stören, vereinfacht mir aber das Verständnis.
    Umgehen kann ich es, wenn ich bei der Abfrage beim setzen der einzelnen Bytes für die Farbe, auch die Iteration Abfrage. Gehe ich von der Maximalen
    Anzahl an Iteration z.B. (MaxIter/6) aus, und vom Faktor beim überschreiten des Maximalen Betrages kann ich den Bereich relativ gut eingrenzen.

    Bei dem Bild wurden nur die Pixel gesetzt wo A den Wert 50 überschreiten und B deren gesamten Iterationen > (MaxIteration/8)
    Wenn ich die Bedingung auf z.B. MaxIter/2 setze werden nur noch weniger eingefärbt.



    Doch ob dies auch in den Tieferen Ebenen funktioniert muss ich auch erst testen.

    Nun habe ich mal die erste Frage an euch :

    Spoiler anzeigen
    Die Punkte(x,y,z) wo den MaxBetrag überschreiten kann ich für einen Normalen 3D Punkt nicht verwenden.
    Doch könnte ich doch eigentlich die äußeren Randpunkte verwenden. Diese wo den MaxBetrag niemals erreichen und gegen Unendlich streben.
    Von diesem Punkt springe ich dann nur einen Pixel weiter, in den Bereich wo der MaxBetrag erreicht wurde, diesen speichere ich in einer Matrix ab.
    Diesen Punkt sollte ich dann wieder auf die Komplexe Ebne für X,Y und Z umrechnen können.

    Ich möchte keine komplette 3D Anwendung erstellen, das würde meinen Rahmen sprengen. Oder sagen wir mal meinen zeitlichen.
    Vor allem müsste ich dann wieder auf C++ umsteigen, weil das einzige was ich in Verbindung von 3D und VB.Net bisher an Erfahrung
    gesammelt habe XNA ist. Und da die ContentPipline in VB.NET nicht implementiert ist(oder war?) war das damals schon ein Krampf.

    Deswegen: habt ihr eventuell eine gute Lib oder ein NuGet Packet, das mir 3 - Dimensionale Punkte automatisch verbindet,
    und unter Angaben von Cameraposition u. Blickpunkt ein Bild daraus erstellen kann?

    Am liebsten wäre mir, wenn die Lib die Punkte selber Trianguliert. ^^


    Die zweite Frage :

    Spoiler anzeigen
    Bei einem Würfel von 1000 Pixel Seitenlänge dauert die Berechnungen wirklich ewig.
    Zu schulde kommt das natürlich der Absoluten Menge von Z die auch bei >= Maximale Iterationen den MaxBetrag nicht erreicht,
    jene die Im Bild dann schwarz gefärbt wird.

    Wenn ich mir jetzt ein Array deklariere, nehmen wir mal folgendes :

    VB.NET-Quellcode

    1. Private Plane(Länge,Länge,Länge) As Boolean


    Wenn man sich vorstellt wie ich die Bilder aufbauen lasse:

    1. [Als äußerste Schleife haben wir die Z - Achse
    2. Dann folgt die Y - Achse
    3. Die innerste stellt die X - Achse dar.
    4. Die 4te ist für die Berechnung der Mandelbrot Menge zuständig.
    Und davon ausgeht, das nur die äußersten Punkte die zur Mandelbrotmenge gehören benötigt werden.
    Sollte man dann nicht relativ einfach feststellen können, ob der Punkt überhaupt benötigt wird und nicht
    durch einen Punkt z.B. Y-1 oder Z-1 schon verdeckt wird, und somit nicht im Blickfeld liegen kann?

    Wenn ich die Pixel Zeile für Zeile färbe und Y+1 erhöhe, könnte dann folgendes funktionieren?

    (Im innersten X Schleifenkörper)

    If Plane(x,y - 1,z) Or Plane(x,y,z-1) Or
    Plane(x-1,y,z) Or Plane(x+1,y,z) Then
    'Pixel schwarz einfärben
    Plane(x,y,z) = True
    Exit for
    End If

    'Wenn dies nicht der Fall war, fängt die letzte Schleife für die Mandelbrot Menge an ihren Dienst zu tun.
    Wenn diese nun nach X Iterationen feststellt das der Betrag von C nicht erreicht wird,
    setzt sie die Bytes im Bitmap Array auf Schwarz.

    Gleichzeitig setzt sie den Eintrag im PlaneArray(x,y,z) auf True.

    Wenn die X-Schleife nun 1 Pixel weiter nach rechts geht,
    und die obige Abfrage ergibt das der Linke bereits gesetzt wurde könnte die Schleife direkt abgebrochen werden.

    Das war mein Gedanke dazu, nur gibt es da ein Problem. Erreiche ich jetzt einen Bereich auf der X - Achse,
    wo eigentlich den Betrag erreicht, und die Abfrage ergibt dass Links daneben bereits nicht dazugehört, überspringt er auch diesen.

    Ich könnte es auch als Schachbrettmuster darstellen. Also ein Eintrag im Array wird gesetzt. Der nächste Pixel wird übersprungen,
    aber im Array nicht auf True gesetzt. So müsste dann der nächste weiter rechts wieder berechnet werden.

    Aber so spare ich nur die Hälfte der Pixel ein. Da ja nur einer übersprungen wird und der nächste wieder berechnet wird.
    Da habe ich wohl gerade eine kleine Denk-Blockade :D

    Und vor allem ein Array von 1000x1000x1000 Elemente geht gar nicht. Eventuell eine Liste? Die nach 2 Z Schritten wieder geleert wird, da ich ja nur ein Pixel in X,Y,Z kontrolliere? Da würde vielleicht auch eine Matrix 1000x1000x2 funktionieren. Da brauche ich ein paar Ideen und Anregungen^^




    Die Punkte zu berechnen sollte auf jeden Fall zu schaffen sein, und diese dann natürlich wieder auf das Quaternion zu übertragen.
    Doch die Punkte dann zmd. auf ein Bild zu übertragen, und die Perspektive zu ändern wäre wirklich super. Dann könnte ich erstmal sehen, ob mein ganzes Vorhaben überhaupt funktioniert.
    Und ob die Parameter für den vorzeitigen Abbruch richtig gesetzt sind.

    LG ^^

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Farliam“ ()

    Frage 1 und ein Teil von 2 kann ich mir selbst beantworten.



    Durch den Faktor dass das Quaternion Kunjungiert/Invertiert werden kann,
    in dem man Division verwendet, was eigentlich nur eine Multiplikation der Konjungierten Version ist,
    drehen sich die Gegebenheiten einmal um. Die Menge die sonst dazu gehört, und der Rest tauschen sich.
    Somit wird das innere des Mandelbrotes dargestellt. Somit hab ich meine gesuchten Punkte direkt.

    Sowohl direkte Transformationen auf die X,Y und Z Punkte (können) funktionieren. Jedoch müsste ich dann einen weiteren
    Parameter einfügen, was dann wohl K wäre. So bleibt es bei einer Roll auf die Punkte selber angewendet bei einem Teller der sich um seine X Achse dreht.

    Das ganze ändert sich, wenn ich direkte Rotationen auf das Quaternion anwende.

    Bleibt eines übrig:

    Die Triangulation meiner Rohdaten. Mein Überlegungsansatz war folgender:

    Sammeln der Rohpunkte und in einer Liste speichern. Wenn 2 Ebnen vorhanden sind die erste einmal bearbeiten als eine Array zusammenhängender Punkte.
    Nun gibt es wohl viele Möglichkeiten um daraus einen Pfad aus Punkten zu erstellen.

    Kennt sich jemand mit : Triangle.NET aus? Wäre das in meinem Fall hilfreich?

    Nachtrag :




    Es wird langsam :thumbsup:

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