Чёрт возьми, до меня кажется дошло!
Вам не нужно заливать изначально закрашенные пиксели, но вам нужно залить все незакрашенные, лежащие внутри границ, образованных закрашенными? Тогда я зря настаивал на том, что внешняя граница должна всегда быть. Наоборот, её надо выкинуть и оставить только внутренние!
Надеюсь в этот раз сработает.
-- Сб май 16, 2020 20:06:18 --Правда в общем случае допустим будет много фигур, и тогда всё будет хитрее из-за нужды в определении, какие из внутренних границ внутри какой из (выкидываемых потом) внешней лежат, и вообще убеждения, какие из границ внешние, и наконец там ещё могут быть островки внутри белых частей фигур, хотя их наличие уже новых сложностей не добавят, просто внешние границы островков нужно будет сохранять.
Чтобы определить, какая граница какая, можно присвоить пикселям уровни по таким правилам:
(1) Cначала крайние белые пиксели картинки получают уровень 0, а крайние чёрные — 1. (И те, и те, потому что каких-то может не быть.)
(2) Все соседи того же цвета пикселя с уровнем
получают уровень
.
(3) Теперь если остались ещё пиксели без определённого уровня, рассматриваем сейчас те из них, у соседей которых наименьший определённый уровень
. Этим пикселям приписываем уровень
. Повторяем (3).
В (1) и (3) у нас есть возможность провести кусочек границы, а так же соединить кусочки границ, которые уже были проведены, так что в принципе так можно будет получить и все границы, притом с правильным направлением обхода (таким, что если переходить из пикселя чётного уровня в пиксель нечётного, направление обхода границы будет получено поворотом на 90° в одну и ту же сторону для всех случаев). Но можно получить все границы и по-старинке.
(Ещё один плюс: каждому пикселю мы можем приписать границу, внутри которой он находится, и соответственно, можно узнать, какие границы находятся внутри каких других и таким образом отделить разные фигуры, если их много (потому что для этого потребуется оставлять все внутренние границы каждой из фигур при ней).)Теперь зачем нам уровни: в вашей задаче, если я понял её наконец как надо, нам нужны границы между уровнями
для
, а границы между уровнями
надо выбросить, и это единственное условие. Все (вообще все, даже если компонент связности много) оставшиеся границы можно будет засунуть в один
path и всё будет нормально закрашиваться.