Я просто как обычно слишком штрихованно описал алгоритм.
Пусть мы как-то приземлились на границу фигуры, то есть в окрестности нас есть и закрашенные, и пустые пиксели. Будем теперь делать такие шаги, пока не придём назад в ту же точку
:
• Если «вектор скорости»
направлен не так, что по левую сторону от него (если его отложить от текущей точки
) закрашенный пиксель (а справа пустой), поворачиваем его (на 90°) ровно так чтобы был направлен как надо, притом предпочитаем поворачивать в сторону, обратную направлению обхода — в данном случае по часовой стрелке — это защита от влезания внутрь.
• Смещаемся теперь
.
Выбор направления поворота (или сразу уж нового направления сдвига) можно притом «скомпилировать» в простой поиск в словаре по значениям
пикселей в окрестности точки и направлению
, всего там будет
записей. Если обозначить закрашенность как
1, пустоту как
0, то правило поворота, если сейчас
направлен вверх, в точности таково:
Код:
abcd теперь пойдём
-------------------
0000 невозможно
1000 невозможно
1100 невозможно
0100 невозможно
0110 направо
1110 направо
1010 прямо
0010 налево
0011 невозможно
1011 невозможно
1111 невозможно
0111 невозможно
0101 прямо (невозможно если начали обходить против часовой)
1101 налево (невозможно если начали обходить против часовой)
1001 налево (невозможно если начали обходить против часовой)
0001 направо (невозможно если начали обходить против часовой)
(код Грэя я себе для удобства перечисления взял). То есть тут даже всего четыре возможных окрестности оказывается (сразу я этого не увидел). Или восемь, если нам не важно иметь одно и то же направление обхода для всех случаев.
-- Пн апр 27, 2020 18:50:06 --И да, только при рассмотрении этого примера я понял, какой именно подводный камень имелся в виду (для обхода которого я добавил «предпочитаем поворачивать в сторону, обратную направлению обхода»), так что спасибо, что заставили таки его рассмотреть.