Вычислите три угла вашего fov-треугольника, поверните их так, чтобы они были повернуты правильно, и затем выполните одно из следующих действий:
1) выполнить тест точка-треугольник для всех потенциальных целей
2) вычислите ограничивающий прямоугольник этого треугольника и выполните тест «точка-треугольник» для всех потенциальных целей в ячейках в этом ограничивающем прямоугольнике - это будет очень простой код для отладки
Аналогичный подход заключается в использовании квадродерева, а не сетки и пересечений. Если доступ к тайлу O (1) ускоряет вас, то просто тестирование всех ячеек в границах fov-треугольника для in-треугольника должно быть настолько быстрым, чтобы быть мгновенным. Поскольку вы смотрите на другие варианты, я предполагаю, что это не так, и что O (1) на самом деле берет на себя огромную стоимость промаха кэша, когда вы перебираете его. Вы, конечно, могли бы, возможно, взглянуть на инструкции по предварительной загрузке, чтобы аннотировать свой ограничивающий переход ...
3) «растеризовать» этот треугольник и проверить ячейки, которые он «рисует» - вероятно, самый эффективный код, но, возможно, лишь незначительно, так как я бы предположил, что в нем преобладает время пропуска кэша, и это зависит от того, насколько сложны ваши ячейки и насколько они заняты они есть.
Альтернативный подход состоит в том, чтобы визуализировать FOV в закадровом растровом изображении и затем прочитать значение пикселя для каждого из ваших объектов; Вы не можете «размешать краску», но с ограниченным количеством объектов и, тщательно выбирая свою краску, вы можете определить, кто видел кого. Этот подход аналогичен тому, как много игр отрабатывают то, на что нажимал пользователь - они рисуют сцену вне экрана, используя сплошные цвета для областей попадания. GPU очень быстро заполняют треугольник ...