Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контур фигуры 
V
    Опции темы
SoWa
Дата 25.3.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Есть сетка, содержащая числа 0 и 255. 0- это пустая ячейка, 255- ячейка по которой "можно пройти".
Дается точка. Задача- найти координаты границы внешнего контура, который содержит эту точку. Методы обхода могут быть 4-х шаговый и 8-и шаговый. 
4-х шаговый, это когда от точки мы можем "пойти" вверх, вниз, влево, вправо.
8-и шаговый- от точки по всем направлениям.

Если входная точка 0, то ничего не делать.

Как найти просто все точки контура я знаю. А надо найти именно внешние точки.
Помогите плз...

Это сообщение отредактировал(а) SoWa - 25.3.2007, 15:31


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
maxim1000
Дата 25.3.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



а рисуночек можно?


--------------------
qqq
PM WWW   Вверх
Bitter
Дата 25.3.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 4
Всего: 27



И по точнее, что значит
Цитата

найти координаты границы внешнего контура, который содержит эту точку


контур же непрерывен. какую границу нужно найти? или контур прямоугольный?

PM MAIL ICQ Skype   Вверх
SoWa
Дата 25.3.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



0   255   255   255   255 0 0
0   255   255   255   255 0 0
0   255   255   255   0     0 0
0     0      0        0     0     0 0

Допустим, начинаем в точке 1,1
Контур это координаты точек, кторые образуют ломаную, ограничивающую все точки, вошедшие в контур. Ну как заливка в графических редакторах. Только мне надо не залить, а найти границу заливки.

В этом случае будут клетки с координатами
1,0 _ 2,0 _ 3,0 _ 4,0 _ 1,1 _ 1,2 _ 2,2 _ 3,2 _ 4,1

Добавлено через 1 минуту и 22 секунды
Их то и надо найти. Вот как бы из залички получить контур, ведь заливка 8-и шаговой системой может быть пористая.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
maxim1000
Дата 25.3.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



хм... ну пускаем заливку из начальной точки цветом 128
потом ищем те точки цвета 128, возле которых есть точки другого цвета, это и будет контур...
это если я правильно понял, о чём речь smile

Добавлено через 1 минуту и 34 секунды
ну и стоит перед всеми этими действиями добавить рамочку цвета 0


--------------------
qqq
PM WWW   Вверх
Bitter
Дата 25.3.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 4
Всего: 27



Я такую задачу уже решал и вот как:
1. Сначала будем выбирать точки по Х.
    1.1 Устанавливаем флаг=Матрица[0][0] 
    1.2 Делаем цикл по Х (переменная i)
       1.2.1 Если значение Матрица[ i ][ j ] != флаг:
             1.2.1.1 Меняем флаг на Матрица[ i ][ j ]
             1.2.1.2 Изменяем Матрица[ i ][ j ] = 128 (или любое другое значение);  
    1.3 Повторяем шаг 1.2 для каждой строки матрицы

2. Делаем то же самое, только для точек по Y (для столбцов)
3. Всё, что в Матрице = 128 - контур

Надеюсь, не сильно запутал )))

Могу написать пример на Delphi7, если нужно
PM MAIL ICQ Skype   Вверх
SoWa
Дата 26.3.2007, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Bitter, можно Дельфийский код, а то запутано smile
maxim1000, как всегда гениально! Одно НО- это жд 4-х шаговой системы проедет. А для 8-и нет. Потому что может быть пора, которую мы не зальем цифрой 128. А вообще это плюс ;)


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
maxim1000
Дата 26.3.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(SoWa @  26.3.2007,  05:47 Найти цитируемый пост)
Одно НО- это жд 4-х шаговой системы проедет. А для 8-и нет. 

это подойдёт для любого соседства: хоть 8, хоть 4, хоть 6
главное, чтобы одно и то же использовалось и в заливке, и в выделении границы


--------------------
qqq
PM WWW   Вверх
SoWa
Дата 26.3.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Нет, вот такая фигура(для простоты 1 и 0)
0 0 0 0 0 0 0
0 1 1 1 1 1 1
0 1 0 1 0 1 1
0 1 1 1 1 1 1
0 0 0 0 0 0 0

начнм в (3,3)
и точка (2,2) это пора. Если мы будем смотреть точку (5,2) то она по твоему условию тоже окажется контурной. Или ты предлагал даже поры заливать?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Earnest
Дата 26.3.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Вот код обхода контура по 8-соседям на С++.
Это классический обход "жучком": он не требует нанесения пометок на растр, осматривает только точки границ и их соседей. 
Для текущей точки контура, проверяем соседей и берем первую же точку, которая удовлетворяет условию принадлежности к границе. Чтобы все сошлось, нужно правильно выбрать начальную точку осмотра (а это зависит от предыдущей). В общем, см. код. Предикат IsOk должен отвечать на вопрос, является ли точка непустой.
Граница, вроде бы, получается 4-связная.


Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  trace.rar 2,00 Kb


--------------------
...
PM   Вверх
maxim1000
Дата 26.3.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ааааа... в этом смысле
тогда надо поточнее описать, что подразумевается под внешним контуром
предварительно - заливаем из какой-нибудь точки на рамочке цветом 64 и ищем клеточки цвета 128 с соседями 64, правда, если один контур будет вложен в другой, таких точек не будет
тогда можно делать так:
1. заливаем цветом 128, смотрим, есть ли соседи с 64
2. если есть - значит, задача решена - этот контур внешний
3. если нет, то заливаем область 255 тоже цветом 128, т.к. она, на самом деле, внутренняя
4. находим область вокруг неё цвета 0 и тоже заливаем
5. повторяем 2..4 для каждого слоя
так рано или поздно доберёмся до внешнего слоя...


--------------------
qqq
PM WWW   Вверх
SoWa
Дата 26.3.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Ага, точно!
Спасибо большое!

//А еще я нашел забавную штуку "Алгоритм Жука(Колорадского :hehe)"


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Bitter
Дата 26.3.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 4
Всего: 27



Вот код, который обещал:

Код

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
    Flag:byte;
    x,y:integer;
begin
 Image1.Picture.Bitmap.Canvas.Brush.Color:=clRed;
 // Цикл по X
 Flag:=Matrix[0,0]; // Флаг "изменился ли цвет во время просмотра строки" (Флаг меняется только на контуре!!!)
 for j:=0 to 24 do
  for i:=0 to 24 do
   if Matrix[i,j]<>Flag then     // Если изменился, меняем флаг и красим точку контура
   begin
    Flag:=Matrix[i,j];
    x:=i*10;
    y:=j*10;
    if Flag=0 then x:=(i-1)*10;
    Image1.Picture.Bitmap.Canvas.Rectangle(x,y,x+10,y+10);
   end;

 // То же самое по Y
 Flag:=Matrix[0,0];
 for j:=0 to 24 do
  for i:=0 to 24 do
   if Matrix[j,i]<>Flag then
   begin
    Flag:=Matrix[j,i];
    x:=j*10;
    y:=i*10;
    if Flag=0 then y:=(i-1)*10;
    Image1.Picture.Bitmap.Canvas.Rectangle(x,y,x+10,y+10);
   end;
 Image1.Picture.Bitmap.Canvas.Brush.Color:=clWhite;
end;


Вот пример:


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  Kontur.rar 7,52 Kb
PM MAIL ICQ Skype   Вверх
Bitter
Дата 26.3.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 4
Всего: 27



а вот как пример работает )))


Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  Primer.JPG 55,58 Kb
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.