Обчисліть три кути трикутника, оберніть їх так, щоб виходили правильним способом і так, а потім виконайте один із:
1) зробити тест у трикутнику для всіх потенційних цілей
2) обчислити обмежувальне поле цього трикутника та зробіть тест «в трикутнику» для всіх потенційних цілей у клітинках цього обмежувального поля - це буде дуже простий код для налагодження
Аналогічний підхід полягає у використанні квадрату, а не сітки, та перетинах на цьому. Якщо доступ до плитки O (1) прискорює вас, то просто тестування всіх комірок у межах трикутника fov на трикутник повинно бути таким швидким, щоб миттєво. Коли ви дивитесь на інші варіанти, я припускаю, що це не так, і що O (1) насправді приймає величезну вартість пропуску кешу, коли ви обробляєте кеш. Ви, звичайно, можете переглянути інструкції попереднього вибору, щоб анотувати ваш прогулок по обмеженій коробці ...
3) "розпустіть" цей трикутник і перевірте клітинки, які він "малює" - ймовірно, найефективніший код, але, можливо, лише незначно, оскільки я б міркував, що його всі домінуючі часи пропуску кешу залежать від того, наскільки складні ваші клітини та як зайняті. вони є.
Альтернативний підхід - перевести FOV на позаекранну растрову карту, а потім прочитати значення пікселя для кожного з ваших об'єктів; ви не можете «змішувати фарбу», але з обмеженою кількістю предметів і ретельно вибираючи фарбу, ви можете зрозуміти, хто бачив кого. Цей підхід схожий на те, скільки ігор розробити те, на що користувач натиснув - вони малюють сцену поза екраном, використовуючи суцільні кольори для постраждалих областей. Графічні процесори дуже швидкі при заповненні трикутника ...