Пусть «квадратное расстояние» между двумя точками (x1, y1) и (x2, y2) будет max (| x1-x2 |, | y1-y2 |), чтобы точки увеличивали «квадратное расстояние» вокруг центр для все более крупных квадратов.
Теперь для каждого расстояния квадрата d от вашей центральной точки в порядке возрастания следите за углами, которые центральная точка может видеть сквозь все препятствия с помощью расстояние <= d. </p>
Вы можете использовать список угловых интервалов, начинающихся с [(0,360)] для d = 0.
Для каждого нового расстояния вы можете просмотреть список, изучить новые пиксели в пределах заданных углов, и уберите угол из интервалов, когда сталкиваются препятствия. Каждое препятствие, которое заставляет вас изменять интервал, видно из центральной точки, поэтому вы можете пометить его как таковой.
Этот метод проверяет пиксели только один раз и только те пиксели, которые вы видите. Однако то, как я написал это выше, требует тригонометрии, которая медленная. Для практической реализации вместо фактического использования углов используйте склоны, для которых требуется только простая математика, и обрабатывайте каждый октант отдельно.