Сделайте вашу точку происхождения источником полярной системы координат. Преобразовать углы блока в полярные координаты.
Теперь обработайте ваш точечный источник как прожектор, изменяющийся от 0 до 2 * PI. Луч продолжается до тех пор, пока не достигнет края кадра или черного ящика. Это определяет полигон, который вы заполняете пурпурным (1 отрезок, прямое освещение).
Это легкая часть. Теперь вы можете повторить это для каждого пикселя, лежащего на пурпурно-белой (1-0) границе многоугольника. Это определяет конечный набор вторичных многоугольников; заполните их желтым (код 2).
Повторите этот процесс с желто-белыми (2-0) границами, чтобы идентифицировать 3
пикселей; итерируйте, пока у вас не закончатся пиксели.
В других парадигмах я применил интервальную алгебру к блокирующим сегментам (например, когда один блок частично затеняет другой), но я думаю, что атака полярного многоугольника поможет вам найти решение за меньшее количество часов кодирования.