Re[7]: Поиск замкнутого многоугольника в матрице
От: Аноним  
Дата: 21.09.10 14:28
Оценка: 4 (1)
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.