Ich würde lieber Schattenstrahlen als Sichtlinienstrahlen werfen.
Angenommen, dies ist Ihr Ansichtsbereich (der potenziell sichtbare Bereich).
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
Die # Blöcke sind nicht sichtbar, während die. sind sichtbar
Lassen Sie uns ein Hindernis setzen X:
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
Sie haben eine Liste der X, die sich im Ansichtsbereich befinden. Dann markieren Sie jedes Feld, das sich hinter jedem dieser Hindernisse befindet, als ausgeblendet. Wenn ein Hindernis als ausgeblendet markiert ist, entfernen Sie es aus der Liste.
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
Im obigen Beispiel können Sie sehen, wie der Schatten ganz rechts von der Bodenwand geworfen wird und wie dieser Schatten das verborgene Hindernis aus der Liste des zu prüfenden Hindernisses löscht (X muss prüfen; * markiert).
Wenn Sie die Liste mit einer Binär-Partition sortieren, so dass zuerst das cosest X geprüft wird, können Sie Ihre Prüfung etwas beschleunigen.
Sie können eine Art "Naval Battles" -Algorithmus verwenden, um einen Block von Xs auf einmal zu überprüfen (im Grunde suchen Sie nach einem benachbarten X in einer Richtung, die den Schattenkegel breiter machen kann).
[BEARBEITEN]
Es werden zwei Strahlen benötigt, um einen Schatten korrekt zu werfen. Da eine Kachel rechteckig ist, können viele Annahmen unter Verwendung der verfügbaren Symmetrien getroffen werden.
Die Strahlkoordinaten können mithilfe einer einfachen Raumaufteilung um das Hindernisplättchen berechnet werden:
Jeder rechteckige Bereich bestimmt, welche Ecke der Kachel als Schattenkegelkante verwendet werden soll.
Diese Überlegung kann weiter vorangetrieben werden, um mehrere benachbarte Kacheln zu verbinden und sie wie folgt einen einzelnen, breiteren Kegel werfen zu lassen.
Der erste Schritt besteht darin, sicherzustellen, dass sich keine Hindernisse in Richtung des Betrachters befinden. In diesem Fall wird stattdessen das nächste Hindernis berücksichtigt:
Wenn das gelbe Plättchen ein Hindernis ist, wird dieses Plättchen zum neuen roten Plättchen.
Betrachten wir nun die obere Kegelkante:
Die blauen Kacheln sind alle mögliche Kandidaten, um den Schattenkegel breiter werden zu lassen: Wenn mindestens eine von ihnen ein Hindernis ist, kann der Strahl unter Verwendung der Raumteilung um diese Kacheln wie zuvor gesehen bewegt werden.
Die grüne Kachel ist nur dann ein Kandidat, wenn sich der Beobachter über der folgenden orangefarbenen Linie befindet:
Gleiches gilt für den anderen Strahl und für die anderen Positionen des Betrachters zum roten Hindernis.
Die Grundidee besteht darin, für jeden Kegelwurf so viel Fläche wie möglich abzudecken und die Liste der zu überprüfenden Hindernisse so schnell wie möglich zu verkürzen.