Aleexeey
Постоялец
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
посмотрим на ноль. слева несколько пересечений с границей снизу напоролся на грань
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #31 : 11-12-2008 08:00 » |
|
а что не так ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Специалист
Offline
|
|
« Ответ #33 : 11-12-2008 08:10 » |
|
А если фигур две?
|
|
|
Записан
|
while (8==8)
|
|
|
Вад
|
|
« Ответ #34 : 11-12-2008 08:12 » |
|
Если уж оперировать двумерными массивами - то, наверное, расширение и заливка внешней области - самое надёжное решение.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #35 : 11-12-2008 09:50 » |
|
А если фигур две?
в условии ничего не было Но даже если и две - контуры всё равно же должны различаться, допустим, второй будет из двоек
|
|
|
Записан
|
|
|
|
Aleexeey
Постоялец
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
Постоялец
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
Специалист
Offline
|
|
« Ответ #38 : 11-12-2008 10:03 » |
|
в условии ничего не было Но даже если и две - контуры всё равно же должны различаться, допустим, второй будет из двоек Да я так, из вредности опять
|
|
|
Записан
|
while (8==8)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #39 : 11-12-2008 10:27 » |
|
Aleexeey, да пойдёт, наверное, только заливка и без рекурсии делается неплохо, да ещё и работать быстрее будет (и надёжнее, это я про стек)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #40 : 11-12-2008 10:27 » |
|
sss,
|
|
|
Записан
|
|
|
|
Aleexeey
Постоялец
Offline
|
|
« Ответ #41 : 11-12-2008 10:44 » |
|
Подставил этот код, проверил, все работает!!! Как здорово ) ) ) ) ) ) ) ) ) ) ) ) ) Спасибо, Ребята за помощь!!! )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 11-12-2008 10:50 » |
|
Aleexeey, так ты бы сразу сказал, что тебе заливка нужна ) Как другие не знаю, лично мне показалось, что тебе надо определение - лежит ли чотки в контуре )
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #43 : 11-12-2008 11:03 » |
|
Джон, а теперь разрушим стройное решенье Конечно для таких случаев нужны доп. условия. Это ессно. О чём и сказано ниже. А как в такой ситуации: Это то про что я сказал, такая ситуация при данных условиях невозможна. Иначе получается у тебя некая линия отходит от границ контура: Левый разрешён, правый - нет.
|
1.gif (1.74 Кб - загружено 1678 раз.)
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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
Постоялец
Offline
|
|
« Ответ #44 : 11-12-2008 11:08 » |
|
Алексей1153++ а мне и нужно было узнать, точки в контуре или вне! Эту функцию я применил к массиву, всякие getpixelы удалил.
Нахожу точку которая в контуре, запускаю рекурсию, получаю результат: 0 - точки вне контура 1 - контур 2 - точки в контуре мои требования, функция вроде удовлетворила!!!
|
|
|
Записан
|
|
|
|
|
aguest2007
Гость
|
|
« Ответ #46 : 14-12-2008 00:23 » |
|
Доброго времени суток, Aleexeey. Мне уже доводилось решать подобную задачу, вот мой вариант: Проходим массив построчно(с самой верхней) до тех пор, пока не встретим элемент контура затем с позиции этого элемента движемся вниз по столбцу, пока не всретим пустой элемент. Он и будет точкой внутренней области если выполняется условие по замкнутости контура Далее начиная с этой точки используем следующий рекурсивный алгоритм:
Функция(x,y) { От этой точки вправо и влево заливаем все эл-ты до правого и левого контура и ее саму соответственно Далее для каждой залитой точки с права на лево { если выше этой точки есть другая и она пустая(не контур и не залитая то Функция(x координата этой точки,y-1 координата этой точки) если ниже этой точки есть другая и она пустая(не контур и не залитая то Функция(x координата этой точки,y+1 координата этой точки) } } таким образом заливается внутринняя область Главное чтобы сначала заливались точки, а потом рекурсивные вызовы Преобразовать строку в массив и обратно вроде не проблема
|
|
|
Записан
|
|
|
|
aguest2007
Гость
|
|
« Ответ #47 : 14-12-2008 00:25 » |
|
ой, писал долго
|
|
|
Записан
|
|
|
|
|