Je préfère projeter des rayons d'ombre au lieu de rayons de ligne de vue.
Disons que c'est votre zone de vue (la zone potentiellement visible)
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
Les # blocs ne sont pas visibles lorsque le. sont visibles
Mettons un obstacle X:
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
Vous avez une liste des X qui se trouvent dans la zone de vue, puis vous marquez comme cachée chaque tuile qui se trouve derrière chacun de ces obstacles: lorsqu'un obstacle est marqué comme caché, vous le supprimez de la liste.
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
Dans l'exemple ci-dessus, vous pouvez voir l'ombre projetée par le plus à droite du mur inférieur et comment cette ombre supprime l'obstacle caché de la liste des obstacles que vous devez vérifier (X doit vérifier; * vérifié).
Si vous obtenez un tri de la liste à l'aide d'une partition binaire afin que le X le plus cosest soit vérifié en premier, vous pouvez accélérer légèrement votre vérification.
Vous pouvez utiliser une sorte d'algorithme de "batailles navales" pour vérifier le bloc de X à la fois (essentiellement à la recherche d'un X adiaque dans une direction qui peut élargir le cône d'ombre)
[MODIFIER]
Deux rayons sont nécessaires pour projeter correctement une ombre et, comme une tuile est rectangulaire, beaucoup d'hypothèses peuvent être faites en utilisant les symétries disponibles.
Les coordonnées des rayons peuvent être calculées à l'aide d'une simple partition d'espace autour de la tuile obstacle:
Chaque zone rectangulaire constitue un choix quant au coin du carreau qui doit être pris comme bord du cône d'ombre.
Ce raisonnement peut être poussé plus loin pour connecter plusieurs tuiles adjacentes et les laisser jeter un seul cône plus large comme suit.
La première étape consiste à s'assurer qu'aucun obstacle ne se trouve dans la direction de l'observateur, dans ce cas, l'obstacle le plus proche est considéré à la place:
Si la tuile jaune est un obstacle, cette tuile devient la nouvelle tuile rouge.
Considérons maintenant le bord supérieur du cône:
Les carreaux bleus sont tous des candidats possibles pour élargir le cône d'ombre: si au moins l'un d'entre eux est un obstacle, le rayon peut être déplacé en utilisant le partage d'espace autour de ce carreau comme vu précédemment.
La tuile verte n'est candidate que si l'observateur est au-dessus de la ligne orange qui suit:
Il en va de même pour l'autre rayon et pour les autres positions de l'observateur autour de l'obstacle rouge.
L'idée sous-jacente est de couvrir autant de surface que possible pour chaque coulée de cône et de raccourcir le plus rapidement possible la liste des obstacles à vérifier.