Wolałbym rzucać promienie cienia zamiast linii promieni wzroku.
Powiedzmy, że jest to obszar widoku (obszar potencjalnie widoczny)
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
# Bloki nie są widoczne, podczas gdy. są widoczne
Połóżmy przeszkodę X:
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
Masz listę X, które znajdują się w obszarze widoku, a następnie zaznaczasz jako ukryty każdy kafelek za każdą z tych przeszkód: gdy przeszkoda jest oznaczona jako ukryta, usuwasz ją z listy.
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
W powyższym przykładzie widać cień rzucony przez skrajną prawą dolną ścianę oraz sposób, w jaki cień ten usuwa ukrytą przeszkodę z listy przeszkód, które musisz sprawdzić (X musi sprawdzić; * zaznaczony).
Jeśli posortujesz listę za pomocą partycji binarnej, aby najpierw sprawdzić X najbliższego X, możesz nieznacznie przyspieszyć sprawdzanie.
Możesz użyć pewnego rodzaju algorytmu „bitew morskich”, aby sprawdzić blok Xs jednocześnie (w zasadzie szukając adiacent X, który jest w kierunku, który może poszerzyć stożek cienia)
[EDYTOWAĆ]
Aby poprawnie rzucić cień, potrzebne są dwa promienie, a ponieważ płytka jest prostokątna, można założyć wiele założeń przy użyciu dostępnych symetrii.
Współrzędne promienia można obliczyć za pomocą prostej przestrzeni dzielącej się wokół płytki przeszkody:
Każdy prostokątny obszar stanowi wybór tego, który z narożników płytki należy traktować jako krawędź stożka cienia.
Rozumowanie to można dalej wykorzystać, aby połączyć wiele sąsiadujących ze sobą płytek i pozwolić im rzucić jeden szerszy stożek w następujący sposób.
Pierwszym krokiem jest upewnienie się, że żadne przeszkody nie są skierowane w stronę obserwatora, w takim przypadku zamiast tego rozważana jest najbliższa przeszkoda:
Jeśli żółta płytka jest przeszkodą, płytka staje się nową czerwoną płytką.
Teraz rozważmy górną krawędź stożka:
Niebieskie płytki są potencjalnymi kandydatami do poszerzenia stożka cienia: jeśli co najmniej jedna z nich jest przeszkodą, promień można przesunąć za pomocą przestrzeni rozdzielającej wokół tej płytki, jak pokazano wcześniej.
Zielona płytka jest kandydatem tylko wtedy, gdy obserwator znajduje się powyżej pomarańczowej linii, która następuje:
To samo oznacza drugi promień i inne pozycje obserwatora dotyczące czerwonej przeszkody.
Podstawową ideą jest objęcie jak największej powierzchni dla każdego rzutu stożka i jak najszybsze skrócenie listy przeszkód do sprawdzenia.