Marching Squares Implementation
Übersicht

n-HalbleiterBetreff: Marching Squares Implementation |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Guten Abend Forum!
Ich möchte gerne mal etwas präsentieren, von dem ich hoffe, dass es nicht nur mir nutzt: Eine Implementation von Marching Squares. Was ist Marching Squares? Marching Squares ist ein Algorithmus, um implizite Funktionen darzustellen. Marching Squares ist ein Algorithmus, um Höhenlinien darzustellen. "Marching Squares [...] ist ein Algorithmus aus der Computergrafik zur Berechnung von Isolinien aus einer Datenquelle. Isolinien sind Linien, die Datenpunkte mit gleichen Werten verbinden." (So sagt Herr Wikipedia) Über die Module: Warum "Module"? Weil ich zwei Module hochgeladen habe, die beide das gleiche machen. Allerdings ist eines der Module auf das Nutzen von Pixmaps optimiert, das andere ist allgemeiner gehalten. An sich ist die Handhabung gleich, wobei es beim allgemeineren Modul ein, zwei zusätzliche Punkte zu beachten gibt. Aber vorher: Downloadlinks: Marchingsquares.mod Marchingsquarespixmap.mod Der untere Link führt zum für Pixmaps optimierten Modul. Handhabung: Den Algorithmus nutzt man, indem man ein Objekt des Types "TCurvePlotter" erstellt (für die einzelnen Methoden bitte die beigelegte Dokumentation konsultieren). Diesem Objekt müssen jetzt allerdings noch die einzelnen Daten mitgegeben werden (ebenjene Methoden). Wenn alle Daten gesetzt sind, muss nur noch die "Plot"-Methode aufgerufen werden (bei der Pixmap-Variante gibt sie die Pixmap zurück, sonst nichts). Die nicht-Pixmap-Variante benötigt eine Information mehr als die Pixmap-Variante: Eine Funktion, die die Linien zeichnet (in der Pixmap-Variante habe ich dazu einen Linien-Bresenham auf eine Pixmap genutzt, was ihr schlussendlich macht, bleibt euch überlassen). Diese wird als Funktionspointer übergeben. Die Funktion hat die folgende Signatur: LineFnc(Target:Object,X1:Int,Y1:Int,X2:Int,Y2:Int,ARGB:Int) Die Parameter stehen für: ![]() ![]() ![]() ![]() Ein Beispiel, dass sich der sog. "Cassinischen Kurve" (in diesem Beispiel mit a=0.49 und b=0.5, im Bild des Wikipediaeintrages entspricht das der hellgrauen Kurve, die direkt um die blaue Kurve liegt) bedient. Wie man an der Form erkennen kann, handelt es sich nicht um eine "gebräuchlichere" Funktion der Form y=f(x), sondern um eine Funktion der Form z=f(x,y) (<- implizite Funktion, man kann so bspw. auch schön Kreise darstellen; für einen Einheitskreis um (0,0): f(x,y)=x²+y²-1 =0). Das Beispiel ist nicht viel kommentiert, sollte aber selbsterklärend sein:BlitzMax: [AUSKLAPPEN] SuperStrict Und noch ein Beispiel für eine Linienfunktion, die Max2Ds DrawLine-Funktion nutzt (ohne mit einem Rendertarget zu arbeiten): BlitzMax: [AUSKLAPPEN] Function MarchingSquaresLine(Target:Object,X1:Int,Y1:Int,X2:Int,Y2:Int,ARGB:Int) Ich hoffe, dass jemand diese Module sinnvoll nutzen kann (mir ist bisher noch nicht wirklich etwas in den Sinn gekommen - außer Spielereien -, aber das kommt sicher noch ![]() P.S.: Falls sich Fragen ergeben, im Quelltext habe ich meine Quelle für die Beschreibung des Algorithmus' angegeben, ansonsten gibt es am Ende des geposteten Wikipedialinks einige Hilfen. Und im schlimmsten Fall gibt's noch mich. ![]() EDIT (10.10.2011, 12:57): Korrektur einiger Fehler im Text, Hinzufügen des Funktionsbeispiels und Korrektur der Archive. EDIT (01.01.2012, 12:56): Korrektur des Moduls Leiter.MarchingSquares: mir sind da zwei große Fehler unterlaufen, auf die ich gerade beim Arbeiten an meinem BCC #58 Beitrag gestoßen bin.. Peinlich, dass mir das so spät aufgefallen ist. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group