Ломать проблему вплоть до двух размеров, то ясно, что некоторые конфигурации вокселей, очевидно, непроницаемые, скажем, слева направо:
+-+-+-+ +-+-+-+-+-+
| |#| | |#| | | | |
+-+-+-+ +-+-+-+-+-+
| |#| | |#| | |#| |
+-+-+-+ +-+-+-+-+-+
| |#| | |#| | |#| |
+-+-+-+ +-+-+-+-+-+
|#| | |#| |
+-+-+-+-+-+
| | | |#| |
+-+-+-+-+-+
... но это не может быть непроницаемым, в зависимости от того, как вы обрабатываете свои углы:
+-+-+-+-+-+
|#| | | |/|
+-+-+-+-+-+
|#| | |/| |
+-+-+-+-+-+
|#| |/|#| |
+-+-+-+-+-+
|#|/| |#| |
+-+-+-+-+-+
|/| | |#| |
+-+-+-+-+-+
...и это, безусловно, можно:
+-+-+-+-+-+
|#| | | | |
+-+-+-+-+-+
|#| | | | |
+-+-+-+-+-+
|#| | | | |
+-+-+-+-+-+
| | | |#| |
+-+-+-+-+-+
| | | |#| |
+-+-+-+-+-+
Теперь, если вы можете думать о какой-либо трюк, который может сказать верхние 2D-кубики из нижней, что может устранить по крайней мере, некоторые невозможные конфигурации пикселей/воксельных - но я Боюсь, вам нужно протестировать каждый пиксель на вашей целевой стороне, чтобы свет проникал со стороны источника с любого угла, что звучит ужасно, как проблема n-квадрата (2D) или n^4 в 3D.
В 2D, я бы начал в верхней части левой стороны и проверить, попадает ли линия, соединяющая мой воксельный центр с верхним правом, на окклюзионный пиксель: если нет, мы закончили; если это так, вы продвигаете свой угол так, чтобы луч проходил в нижнем левом углу окклюзии и продолжал проверять, пока вы не найдете проход или не дойдете до конца правой стороны.
Продолжайте использовать каждый пиксель со стороны источника, пока вы не закончите - так или иначе.
Но это грубая сила, и мне было бы интересно увидеть более элегантное решение, возможно, на G. Bach ...?
Прямая линия, не так ли? –
Да. Сначала я написал прямую линию, затем подумал, что это, вероятно, лишнее упоминать. – paniq
O (n) кажется немного оптимистичным для меня; с какой сложностью вам будет комфортно? –