Я б краще кидав тіньові промені, а не лінії зору.
Скажімо, це ваша область перегляду (потенційно видима область)
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
Блоки не відображаються під час. видно
Поставимо деяку перешкоду X:
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
У вас є список X, який знаходиться в області перегляду, тоді ви позначаєте як приховану кожну плитку, яка знаходиться за кожною з цих перешкод: коли перешкода позначена як прихована, ви видаляєте її зі списку.
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
У наведеному вище прикладі ви можете побачити тінь, яку закидають у крайній правій частині нижньої стінки, і як ця тінь видаляє приховану перешкоду зі списку перешкод, які ви повинні перевірити (X треба перевірити; * перевірено).
Якщо ви сортуєте список за допомогою деяких двійкових частин, щоб спочатку перевірили найдорожчий X, ви можете трохи прискорити перевірку.
Ви можете використовувати своєрідний алгоритм "Військово-морські битви", щоб перевірити блок Xs відразу (в основному шукайте суміжний X, який знаходиться в напрямку, який може зробити тіньовий конус ширшим)
[EDIT]
Для правильного відтінку тіні потрібні два промені, а оскільки плитка прямокутна, багато припущень можна зробити, використовуючи наявні симетрії.
Координати променя можна обчислити за допомогою простого перегородки навколо плитки перешкод:
Кожна прямокутна область є вибором щодо того, який з кутів плитки слід сприймати як тіньовий край конуса.
Це міркування можна просунути далі, щоб з'єднати декілька сусідніх плиток і дати їм відкинути один ширший конус, як слід.
Перший крок - переконатись, що жодних перешкод у напрямку до спостерігача немає, у такому випадку найближча перешкода розглядається натомість:
Якщо жовта плитка є перешкодою, плитка стає новою червоною плиткою.
Тепер розглянемо верхній край конуса:
Сині плитки - це все можливий кандидат дозволити тіні конус ширше: якщо хоча б одна з них є перешкодою, промінь можна перемістити, використовуючи проділ навколо цієї плитки, як це було показано раніше.
Зелена плитка є кандидатом лише в тому випадку, якщо спостерігач знаходиться над помаранчевою лінією, яка наступна:
Те саме означає і для іншого променя, і для інших позицій спостерігача щодо червоної перешкоди.
Основна ідея полягає в тому, щоб охопити якомога більше площі для кожного відливання конуса і якомога швидше скоротити список перешкод, які слід перевірити.