Ich denke, 3d Bresenham ist der Weg zu gehen, nur ein bisschen zwickte. Gehen Sie als erster Durchlauf des Problems wie Bresenham vor, aber seien Sie misstrauisch, wenn Sie vorhaben, einen Schritt zu tun, oder Sie haben nur einen Schritt getan, da dies die Stellen sind, an denen die Leitung zusätzliche Zellen passieren kann.
Nehmen wir zur Vereinfachung an, dass z
dominant ist, was bedeutet, dass z
jeden Schritt erhöht. Die 3d Bresenham Frage ist: "Wann erhöhen/dekrementieren wir in x
oder y
?" Die Antwort ist, wenn der akkumulierte Fehler in x
.5 erreicht, oder wenn der Fehler in y
oder beides tut.
Für Ihren Fall, ich denke, Sie müssen eine sekundäre Schwelle haben, die slopeY = deltaY/deltaZ
verwendet, um zu entscheiden, ob die Linie in eine benachbarte Zelle zu überqueren ist. Wenn stepZ
die Änderung von z entlang der Linie für jedes Pixel ist, sollte ein Test wie error > .5 - slopeY/stepZ
Ihnen sagen, Zellen auf beiden Seiten der Linie in y
zu erhalten. Ein ähnlicher Test sagt Ihnen, ob Sie die zusätzliche Zelle in x
erhalten müssen. Wenn Sie die zusätzliche Zelle sowohl in x als auch in y erhalten müssen, müssen Sie auch die Zelldiagonale zur Bresenham-Zelle bringen.
Wenn Sie festgestellt haben, dass Sie vor dem Inkrement eine Zelle in y
hinzugefügt haben, fügen Sie keine Zelle nach. Wenn Sie noch keine y
Zelle hinzugefügt haben, müssen Sie nachher, es sei denn, Sie passierten zufällig eine Zellenecke. Wie Sie damit umgehen, hängt von Ihrem Anwendungsfall ab.
Dies sind meine Gedanken zu dem Thema, ich habe nichts getestet, aber etwas wie es sollte funktionieren.
Kann dies nach Bresenhams integer-basiert gemacht werden? https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm – occulus