Ist der Sprungflutalgorithmus trennbar?


10

JFA (der hier beschriebene Algorithmus: http://www.comp.nus.edu.sg/~tants/jfa/i3d06.pdf ) kann verwendet werden, um eine Annäherung an ein Voronoi-Diagramm oder eine Entfernungstransformation zu erhalten. Dies geschieht in logarithmischer Zeit basierend auf der Größe des resultierenden Bildes und nicht auf der Anzahl der Samen.

Was tun Sie, wenn Ihr Bild nicht auf jeder Achse gleich groß ist?

Wenn sie ähnliche Größen hätten, könnten Sie sicher die kürzere Achse zusätzliche JFA-Schritte der Größe 1 haben lassen, während die größere Achse damit fertig ist (wie ein Bild mit einer Größe von 512 x 256). Für Achsenabmessungen mit sehr unterschiedlichen Größen könnte dies jedoch viel ineffizienter sein - sagen wir, Sie hatten eine Volumentextur von 512 x 512 x 4.

Ist es möglich, JFA auf jeder Achse einzeln auszuführen und dennoch gute Ergebnisse zu erzielen?

Oder ist an diesem Punkt ein anderer Algorithmus besser geeignet? Wenn ja, welcher Algorithmus könnte das sein?

In meiner Situation möchte ich im Idealfall sowohl Einzelpunktsamen als auch beliebig geformte Samen unterstützen. Möglicherweise sogar gewichtete Samen, bei denen der Abstand zu einem Samen durch einen Multiplikator und / oder einen Addierer eingestellt wird, um ihm mehr oder weniger Einfluss zu verleihen.

Antworten:


7

Schnelle Antworten auf Ihre individuellen Fragen

Was tun Sie, wenn Ihr Bild nicht auf jeder Achse gleich groß ist?

Das Papier verwendet quadratische Bilder mit Seitenlängen, die eine Potenz von 2 sind. Dies dient der Vereinfachung der Erklärung, ist jedoch nicht erforderlich, damit der Algorithmus funktioniert. Siehe Abschnitt 3.1:

Ohne Verlust der Allgemeinheit können wir annehmen, dass n eine Potenz von 2 ist.

Das heißt, diese Annahme ist nicht erforderlich, damit der Algorithmus funktioniert.

Ist es möglich, JFA auf jeder Achse einzeln auszuführen und dennoch gute Ergebnisse zu erzielen?

Das separate Ausführen auf jeder Achse führt wahrscheinlich zu mehr falschen Pixelergebnissen und dauert in den meisten Fällen länger. In extremen Fällen, in denen eine der Bildseitenlängen kleiner als 8 ist (die Anzahl der Sprungrichtungen), kann dies schneller sein, da der Algorithmus diese 8 Richtungen nacheinander behandelt. Bei einem breiteren Bild verliert das Trennen der Achsen jedoch den Vorteil, sie zu behandeln parallel zu.

In meiner Situation möchte ich im Idealfall sowohl Einzelpunktsamen als auch beliebig geformte Samen unterstützen

Das Papier erwähnt willkürlich geformte Samen in Abschnitt 6 unter der Überschrift "Verallgemeinertes Voronoi-Diagramm":

... unsere Algorithmen behandeln solche verallgemeinerten Samen als Sammlungen von Punktsamen und erwarten daher, die gute Leistung zu erben, die für Punktsamen erzielt wird.

Vorausgesetzt, es entspricht Ihrem Zweck, beliebige Formen als Pixelsammlungen zu modellieren, müssen Sie keine Anpassungen am Algorithmus vornehmen. Geben Sie einfach eine Textur ein, die alle Pixel in einem beliebig geformten Startwert mit derselben Startnummer, aber unterschiedlichen Positionen kennzeichnet.

Möglicherweise sogar gewichtete Samen, bei denen der Abstand zu einem Samen durch einen Multiplikator und / oder einen Addierer eingestellt wird, um ihm mehr oder weniger Einfluss zu verleihen

Für die "Gewichtung von Samen wie Multiplikativ und Additiv" erwähnt das Papier nur die Möglichkeit, in Abschnitt 8 als mögliche zukünftige Arbeit vorbeizukommen. Dies sollte jedoch einfach zu implementieren sein, vorausgesetzt, Ihre gewünschte Gewichtung kann in den Startdaten enthalten sein, die von Pixel zu Pixel weitergegeben werden.

Der aktuelle Algorithmus gibt <s, position(s)>einen Startwert und seine Position an, und es wird jeweils nur ein Startwert pro Pixel gespeichert. Wenn Sie dies auf Speichern erweitern, erhalten Sie <s, position(s), weight(s)>alle Informationen, die erforderlich sind, um die Abstandsfunktion zu gewichten und zu berechnen, ob der neue Startwert, der an ein Pixel übergeben wird, näher an diesem liegt als der aktuell gespeicherte.

Sie können sogar zwei Gewichte einschließen, eine multiplikative und eine additive, und einfach die multiplikative Eins auf 1 und die additive Eins auf 0 setzen, wenn dies nicht erforderlich ist. Dann würde Ihr Algorithmus die Möglichkeit beinhalten, für multiplikativ gewichtete Samen, additiv gewichtete Samen oder sogar eine Kombination von beiden gleichzeitig oder einigen von jedem verwendet zu werden. Das würde nur brauchen

<s, position(s), multiplicative(s), additive(s)>

und der aktuelle Algorithmus wäre äquivalent zu diesem neuen Algorithmus unter Verwendung

<s, position(s), 1, 0>


Detaillierte Erklärung warum

log()

Der Algorithmus muss nicht für unterschiedliche Seitenlängen angepasst werden

Wenn die Seitenlängen nicht gleich sind und keine Zweierpotenzen sind, muss der Algorithmus nicht angepasst werden. Es handelt sich bereits um Pixel am Bildrand, für die einige der Sprungrichtungen außerhalb des Bildes führen. Da der Algorithmus die Startinformationen für Richtungen, die außerhalb des Bildes führen, bereits weglässt, ist eine Breite oder Höhe, die keine Zweierpotenz ist, kein Problem. Für ein Bild mit der Breite W und der Höhe H ist die maximal erforderliche Sprunggröße erforderlich

2log(max(W,H))1

Bei gleicher Breite und Höhe N reduziert sich dies auf

2log(N)1

Bei einer Seitenlänge N, die eine Potenz von 2 ist, reduziert sich dies auf

2log(N)1=N/2

wie in der Zeitung verwendet.

In intuitiveren Begriffen runden Sie die maximale Seitenlänge auf die nächste Potenz von 2 ab und halbieren Sie diese dann, um die maximale Sprunggröße zu erhalten.

Dies reicht immer aus, um jedes Pixel im Bild von jedem anderen Pixel im Bild abzudecken, da der Versatz zu einem beliebigen Pixel im Bereich von 0 bis N-1 liegt, wenn die längste Seitenlänge N beträgt. Kombinationen der Potenzen von 2 aus 0 bis N / 2 decken jede ganze Zahl bis zu N-1 ab, wenn N eine Potenz von 2 ist, und wenn N keine Potenz von 2 ist, kann der abgedeckte Bereich aufgrund der Obergrenze des Logarithmus nur größer als erforderlich sein ( Aufrunden auf die nächste Potenz von 2).

Bilder mit Seiten ohne Zweierpotenz sind nicht wesentlich weniger effizient

Die Anzahl der Sprünge hängt von der längsten Seitenlänge ab, z. B. L. Wenn L eine Potenz von 2 ist, ist die Anzahl der Sprünge . Wenn L keine Potenz von 2 ist, ist die Anzahl der Sprünge . Für ein relativ großes Bild ist dies kein großer Unterschied.log(L)log(L)

Zum Beispiel erfordert ein 1024 x 1024-Bild 10 Sprungiterationen. Ein 512 x 512-Bild erfordert 9 Sprungiterationen. Alles zwischen den beiden Größen erfordert ebenfalls 10 Iterationen. Selbst im schlimmsten Fall eines Bildes, das nur knapp über einer Potenz von 2 liegt, wie bei einem 513 x 513-Bild, ist nur 1 zusätzliche Iteration erforderlich, was in diesem Maßstab ungefähr 11% mehr ist (10 statt 9).

Nicht quadratische Bilder sind pro Bereich weniger effizient

Da die Anzahl der erforderlichen Iterationen durch die längste Seitenlänge bestimmt wird, ist die für ein 1024 x 1024-Bild benötigte Zeit dieselbe wie für ein 1024 x 16-Bild. Ein quadratisches Bild ermöglicht es, einen größeren Bereich mit der gleichen Anzahl von Iterationen abzudecken.

Das Trennen von Achsen kann die Qualität beeinträchtigen

Abschnitt 5 des Papiers beschreibt mögliche Fehler. Jedes Pixel ist über einen Pfad von jedem anderen Pixel aus erreichbar, aber einige Pfade bringen nicht den richtigen nächsten Startwert, da dieser Startwert nicht dem vorherigen Pixel im Pfad am nächsten liegt. Ein Pixel, das es einem Samen nicht erlaubt, sich an ihm vorbei auszubreiten, soll diesen Samen "getötet" haben. Wenn der einem Pixel am nächsten gelegene Startwert auf allen Pfaden zu diesem Pixel gelöscht wird, zeichnet das Pixel einen anderen Startwert auf und das endgültige Bild enthält eine falsche Farbe.

Es muss nur ein Pfad existieren, der den Samen nicht tötet, damit das Endergebnis korrekt ist. Falsche Farben treten nur auf, wenn alle Pfade vom richtigen Startwert zu einem bestimmten Pixel blockiert sind.

Wenn ein Pfad abwechselnd horizontale und vertikale Sprünge umfasst, wird dieser Pfad durch Trennen der Achsen unmöglich (alle horizontalen Sprünge werden vor allen vertikalen Sprüngen ausgeführt, wodurch ein Wechsel unmöglich wird). Diagonale Sprünge sind überhaupt nicht möglich. Daher wird jeder Pfad, der sich abwechselt oder diagonale Sprünge enthält, ausgeschlossen. Jedes Pixel hat immer noch einen Pfad zu jedem anderen Pixel, aber da es jetzt weniger Pfade gibt, besteht eine größere Wahrscheinlichkeit, dass ein bestimmtes Pixel daran gehindert wird, den richtigen Startwert zu erhalten, sodass das Endergebnis fehleranfälliger ist.

Durch das Trennen von Achsen dauert der Algorithmus wahrscheinlich länger

Der Wirkungsgrad würde wahrscheinlich durch Trennen der Achsen verringert, da die Überflutung nicht mehr parallel erfolgen würde, sondern für jede Achse wiederholt würde. Für 2D würde dies wahrscheinlich ungefähr doppelt so lange dauern und für 3D ungefähr dreimal so lange.

Dies mag durch das Fehlen diagonaler Sprünge etwas gemildert werden, aber ich würde immer noch eine allgemeine Verringerung der Effizienz erwarten.


1
Ich habe bereits angefangen, damit zu experimentieren. Ich habe festgestellt, dass die Stichprobe in einem + -Zeichen (5 Lesevorgänge) anstelle der vollständigen 9 keine Unterschiede in meinen Tests zeigte, aber ich bin mir sicher, dass es in komplexeren Situationen Unterschiede geben würde. Ein vollständiges x jfa und dann ein vollständiges y jfa zu machen, macht viele Fehler. Ich werde interessiert sein, mehr Details / Informationen zu hören, wenn Sie es haben, aber Ihre Antwort akzeptieren: P
Alan Wolfe

1
Vergessen, hier ist Link zu einem meiner Experimente: shadertoy.com/view/Mdy3D3
Alan Wolfe

Interessant, dass es anscheinend mit nur 5 Lesevorgängen genauso gut funktioniert - zumal sie nicht parallelisiert werden können. Da das Papier die Fälle auflistet, die zu Fehlern führen, können Sie diese möglicherweise absichtlich einrichten und prüfen, ob 5 Sprungrichtungen immer noch so gut sind.
Trichoplax

Klingt so, als
wären

Meine Informationen ergänzen Ihre: P
Alan Wolfe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.