Здравствуйте, DragonFire, Вы писали:
DF>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, DragonFire, Вы писали:
A>>>>Дык вроде всё просто — сначала сканируем по горизонтали: на переходе 01 ставим у единицы "левую стенку", на переходе 10 — ставим у единицы "правую стенку".
A>>>>Потом аналогично сканируем по вертикали, расставляя единичкам верхние и нижние "стенки".
A>>>>А потом ещё раз сканируем единички в поисках "углов" (точек, где сходятся стенки). В итоге получим набор вершин искомого многоугольника. Останется их как-то упорядочить.
DF>>>Проблемы вызывают "пустоты" — области нулей внутри единиц. Такие области надо как-то обнаруживать и вырезать из искомого многоугольника.
DF>>>Сами то границы многоугольника найти совсем не сложно, я согласен...
А>>Так ведь границы и внешние и внутренние — замкнутые ломаные.
А>>Зная одно звено, легко найти продолжение.
DF>Ну нужно еще найти звенья — как определить что звено принадлежит именно внутренней границе, а не внешней...
Я бы решал так
1. Составляем множество S — множество всех найденных ребер.
2. Находим внешнюю границу:
2а. находим "левый верхний угол", т.е. левее и выше клетки только "0".
для клетки берем ребро р. Переносим ребро из S в P(ориентированный путь в порядке обхода).
2б. в S ищем следующее ребро р1 сопряженное с р.
Здесь есть единственная сложность — касающиеся клетки (например как в букве "Э")
0 1 или 1 0
1 0 0 1
но и здесь порядок обхода очевиден.
Переносим ребро из S в P.
р1=р
3в. повторяем (2б) пока не вернемся в начальную точку. (пока находятся ребра в S)
Внешняя граница найдена.
3 Для поиска "дырок" повторяем пункт 2 пока S не опустеет.(начальное ребро можно взять любое)
Сколько "дырок" — столько и повторов пункта 3.