Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Алгоритм выделения в массиве элементов внутри контура  (Прочитано 57688 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Aleexeey
Постоялец

ru
Offline Offline

« Ответ #30 : 11-12-2008 07:54 » 

                1111111
111  111  1          1  111
1  1  1  1  1    0    1  1  1
1  111  111          111  1
1                                  1
1                    11111111
1                    1
1                    1
1                    1
1                    1
111111111111

посмотрим на ноль.
слева несколько пересечений с границей
снизу напоролся на грань
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #31 : 11-12-2008 08:00 » 

а что не так ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 11-12-2008 08:02 » 

Код:

         1111111
 111 111 1     1 111
ч1н1ч1н1ч1нн0  1 1 1
 1 111 111  н  111 1
 1          н      1
 1          11111111
 1          1
 1          1
 1          1
 1          1
 111111111111
            ч

ч - чётное количество пересечений
н - нечётное
Записан

sss
Специалист

ru
Offline Offline

« Ответ #33 : 11-12-2008 08:10 » 

А если фигур две?
Записан

while (8==8)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 11-12-2008 08:12 » 

Если уж оперировать двумерными массивами - то, наверное, расширение и заливка внешней области - самое надёжное решение.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #35 : 11-12-2008 09:50 » 

А если фигур две?

в условии ничего не было Улыбаюсь Но даже если и две - контуры всё равно же должны различаться, допустим, второй будет из двоек
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #36 : 11-12-2008 09:58 » 

Код:
void V_FAB4R (grn_pix, new_pix, x_isx, y_isx)
int grn_pix, new_pix, x_isx, y_isx;
{
   if (getpixel (x_isx, y_isx) != grn_pix &&
      getpixel (x_isx, y_isx) != new_pix)
   {
      putpixel (x_isx, y_isx, new_pix);
      V_FAB4R (grn_pix, new_pix, x_isx+1, y_isx);
      V_FAB4R (grn_pix, new_pix, x_isx,   y_isx+1);
      V_FAB4R (grn_pix, new_pix, x_isx-1, y_isx);
      V_FAB4R (grn_pix, new_pix, x_isx,   y_isx-1);
   }
}
нашел что-то как вы думаете, подойдет этот рекурсивный вариант?
Записан
Aleexeey
Постоялец

ru
Offline Offline

« Ответ #37 : 11-12-2008 10:00 » 

V_FAB4R(цвет границы, закрашиваемый цвет, X и Y - координаты точки начала заливки)

с начало получает по текущим координатам пиксел,
и сравнивает  его с цветом границы и заливки.

если цвет другой, то заливает пиксел (N) цветом заливки
и вызывает рекурсию в четыре соседние точки (1-2-3-4)!

         1
         |
    2--N--0
         |
         3
источник (http://ermak.cs.nstu.ru/kg_rivs/kg02.htm#tth_sEc0.5)
« Последнее редактирование: 11-12-2008 10:16 от Aleexeey » Записан
sss
Специалист

ru
Offline Offline

« Ответ #38 : 11-12-2008 10:03 » 

в условии ничего не было Улыбаюсь Но даже если и две - контуры всё равно же должны различаться, допустим, второй будет из двоек

Да я так, из вредности опять  Скромно так...
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #39 : 11-12-2008 10:27 » 

Aleexeey, да пойдёт, наверное, только заливка и без рекурсии делается неплохо, да ещё и работать быстрее будет (и надёжнее, это я про стек)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 11-12-2008 10:27 » 

sss, Отлично
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #41 : 11-12-2008 10:44 » 

Подставил этот код, проверил, все работает!!!
Как здорово  Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь) Улыбаюсь)
Спасибо, Ребята за помощь!!!  Да-да  Улыбаюсь)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 11-12-2008 10:50 » 

Aleexeey, так ты бы сразу сказал, что тебе заливка нужна Улыбаюсь) Как другие не знаю, лично мне показалось, что тебе надо определение - лежит ли чотки в контуре )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #43 : 11-12-2008 11:03 » 

Джон, а теперь разрушим стройное решенье Улыбаюсь

Конечно для таких случаев нужны доп. условия. Это ессно. О чём и сказано ниже.

А как в такой ситуации:

Это то про что я сказал, такая ситуация при данных условиях невозможна. Иначе получается у тебя некая линия отходит от границ контура:


Левый разрешён, правый - нет.



* 1.gif (1.74 Кб - загружено 1684 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Aleexeey
Постоялец

ru
Offline Offline

« Ответ #44 : 11-12-2008 11:08 » 

Алексей1153++ а мне и нужно было узнать, точки в контуре или вне!
Эту функцию я применил к массиву, всякие getpixelы удалил.

Нахожу точку которая в контуре, запускаю рекурсию,
получаю результат:
0 - точки вне контура
1 - контур
2 - точки в контуре
мои требования, функция вроде удовлетворила!!!
Записан
Aleexeey
Постоялец

ru
Offline Offline

« Ответ #45 : 11-12-2008 11:10 » 

Джон, спасибо, решение вроде нашел!  Улыбаюсь
Записан
aguest2007
Гость
« Ответ #46 : 14-12-2008 00:23 » 

Доброго времени суток, Aleexeey.
Мне уже доводилось решать подобную задачу, вот мой вариант:
Проходим массив построчно(с самой верхней) до тех пор, пока не встретим элемент контура
затем с позиции этого элемента движемся вниз по столбцу, пока не всретим пустой элемент.
Он и будет точкой внутренней области если выполняется условие по замкнутости контура
Далее начиная с этой точки используем следующий рекурсивный алгоритм:

Функция(x,y)
{
    От этой точки вправо и влево заливаем все эл-ты до правого и левого контура и ее саму соответственно
    Далее для каждой залитой точки с права на лево
    {
        если выше этой точки есть другая и она пустая(не контур и не залитая
             то Функция(x координата этой точки,y-1 координата этой точки)
        если ниже этой точки есть другая и она пустая(не контур и не залитая
             то Функция(x координата этой точки,y+1 координата этой точки)
    }
}
таким образом заливается внутринняя область
Главное чтобы сначала заливались точки, а потом рекурсивные вызовы
Преобразовать строку в массив и обратно вроде не проблема
Записан
aguest2007
Гость
« Ответ #47 : 14-12-2008 00:25 » new

ой, писал долго Жжешь
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines