Die Einzelfilmwellenfunktion Collapse Library in C sowie ein Befehlszeilen-Tool
Dies ist eine frühe Version, die die überlappende WFC -Methode unterstützt. Die Methode nimmt ein kleines Eingabebild an und erzeugt ein größeres Ausgabebild, das lokal dem Eingabebild ähnelt. Einige Beispiele für Eingangs-/Ausgangspaare:

Das WFC wird häufig für die Erzeugung von Karten verwendet, ist jedoch nicht auf diesen Anwendungsfall beschränkt.
Die Bibliothek ist sehr leistungsfähig und enthält eine Reihe von Optimierungen, die in anderen Implementierungen nicht zu finden sind. Beispielsweise dauerte die Erzeugung der oben genannten 128x128 -Bilder (aus 3x3 -Mustern, umgedreht und gedreht) auf einem MacBook Air M1 (2020): 1,35, 0,92, 0,31, 7,7, 1,74 bzw. 0,67 Sekunden. Dies beinhaltet die Bildlade-/Sparenzeit.
Eine Datei in Ihrem Projekt sollte wfc.h wie folgt enthalten:
#define WFC_IMPLEMENTATION
#include "wfc.h" Andere Dateien können auch wfc.h enthalten und verwenden, aber sie sollten nicht WFC_IMPLEMENTATION -Makro definieren.
Alternativ können Sie eine herkömmliche .o -Datei mit make wfc.o erstellen und wfc.h als reguläre Header -Datei verwenden.
Verwendung:
struct wfc * wfc = wfc_overlapping (
128 , // Output image width in pixels
128 , // Output image height in pixels
input_image , // Input image that will be cut into tiles
3 , // Tile width in pixels
3 , // Tile height in pixels
1 , // Expand input image on the right and bottom
1 , // Add horizontal flips of all tiles
1 , // Add vertical flips of all tiles
1 // Add n*90deg rotations of all tiles
);
wfc_run ( wfc , -1 ); // Run Wave Function Collapse
// -1 means no limit on iterations
struct wfc_image * output_image = wfc_output_image ( wfc );
wfc_destroy ( wfc );
// use output_image->data
// wfc_img_destroy(output_image); Standardmäßig arbeiten Sie mit struct wfc_image für Eingaben und Ausgänge.
struct wfc_image {
unsigned char * data ;
int component_cnt ;
int width ;
int height ;
} data sind ohne Polsterung eng gepackt. Jedes Pixel besteht aus component_cnt -Komponenten (z. B. vier Komponenten für das RGBA -Format). Das Ausgabebild hat die gleiche Anzahl von Komponenten wie das Eingabebild.
wfc_run gibt 0 zurück, wenn es keine Lösung finden kann. Sie können es erneut versuchen wie so:
wfc_init ( wfc );
wfc_run ( wfc , -1 );WFC kann optional stb_image.h und stb_image_write.h verwenden, um Komfortfunktionen für die direkte Arbeit mit Bilddateien bereitzustellen.
Normalerweise platzieren Sie stb_image.h und stb_image_write.h in demselben Verzeichnis wie wfc.h und geben deren Implementierungen in eine der Projektdateien ein:
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image.h"
#include "stb_image_write.h" Darüber hinaus werden Sie wfc.h anweisen, STB zu verwenden:
#define WFC_IMPLEMENTATION
#define WFC_USE_STB
#include "wfc.h"Verwendung:
struct wfc_image * input_image = wfc_img_load ( "input.png" );
struct wfc * wfc = wfc_overlapping (
...
input_image ,
...
);
wfc_run ( wfc , -1 ); // Run Wave Function Collapse
// -1 means no restriction on number of iterations
wfc_export ( wfc , "output.png" );
wfc_img_destroy ( input_image );
wfc_destroy ( wfc );Zusätzliche Funktionen, die durch die Einbeziehung von STB ermöglicht werden:
struct wfc_image * image = wfc_img_load ( "image.png" )
wfc_img_save ( image , "image.png" )
wfc_export ( wfc , "output.png" )
wfc_export_tiles ( wfc , "directory" )
// don't forget to wfc_img_destroy(image) loaded images Das Befehlszeilen-Tool verwendet die Bibliothek und ermöglicht es, WFC-Bilder zu generieren. Das Tool hängt von stb_image.h und stb_image_write.h ab. Platzieren Sie beide Dateien im selben Verzeichnis wie wfctool.c .
make
./wfc
Führen Sie ./wfc aus, um verfügbare Optionen anzuzeigen
Grundnutzung:
./wfc -m overlapping samples/wrinkles.png output.png
Danke, dass du WFC benutzt hast. Wenn Sie Fehler, Fragen oder Feedback finden, lassen Sie es mich bitte wissen. Auch wenn Sie Ihre Arbeiten teilen möchten, wird es sehr geschätzt.
Samp.Krystian bei gmail.com