Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2008, 22:59   #1
prost
 
Регистрация: 30.05.2008
Сообщений: 4
По умолчанию Проблема с рекурсивным закрашиванием. Переполнение стэка.

нужна помощь!!!!!
есть функция закраски, но почему-то не закрашивает,вроде всё верно
Код:
void Object::Fill(HDC hdc,int X, int Y ,COLORREF color)
{
	int X1 = X;
	while((X1 >= 0) && (X1 < width) && (GetPixel(hdc, X1, Y) != color))
	{
		SetPixel(hdc, X1, Y,color);
		if((Y > 0) && (GetPixel(hdc, X1, Y - 1) != color)) Fill(hdc,X1, Y - 1,color);
		if((Y < (height - 1)) && (GetPixel(hdc, X1, Y + 1) != color)) Fill(hdc,X1, Y + 1,color);
		X1--;
	}

	X1 = X;
	while((X1 >= 0) && (X1 < width) && (GetPixel(hdc, X1, Y) != color))
	{
		SetPixel(hdc, X1, Y,color);
		if((Y > 0) && (GetPixel(hdc, X1, Y - 1) != color)) Fill(hdc,X1, Y - 1,color);
		if((Y < (height - 1)) && (GetPixel(hdc, X1, Y + 1) != color)) Fill(hdc,X1, Y + 1,color);
		X1++;
	}
	if((Y > 0) && (GetPixel(hdc, X, Y - 1) != color)) Fill(hdc,X, Y - 1,color);
	if((Y < (height - 1)) && (GetPixel(hdc, X, Y + 1) != color)) Fill(hdc,X, Y + 1,color);
}
// Пользуйтесь тэгом [code]

Последний раз редактировалось B_N; 01.06.2008 в 23:13.
prost вне форума Ответить с цитированием
Старый 02.06.2008, 00:41   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Откуда берутся width и height? Для чего рекурсия в методе?
B_N вне форума Ответить с цитированием
Старый 02.06.2008, 08:41   #3
prost
 
Регистрация: 30.05.2008
Сообщений: 4
По умолчанию

это построчное сканирование,width и height размеры окна,идёт переполнение стека
prost вне форума Ответить с цитированием
Старый 02.06.2008, 18:34   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

переполнение стека именно из-за рекурсии. Вопрос был: зачем здесь рекурсия?
rpy3uH вне форума Ответить с цитированием
Старый 02.06.2008, 21:29   #5
prost
 
Регистрация: 30.05.2008
Сообщений: 4
По умолчанию

а что можно без неё что ли обойтись?
prost вне форума Ответить с цитированием
Старый 02.06.2008, 22:13   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от prost Посмотреть сообщение
а что можно без неё что ли обойтись?
Вы это у кого спрашиваете? Программа Ваша, что она должно делать можно только догадываться, где объявлены и чему равны переменные Вы не говорите, из каких соображений выбрана рекурсия - отвечаете вопросом на вопрос. Наконец, какое отношение всё это имеет к WinAPI, кроме того, что там вызывается GetPixel? Уточняйте уже вопрос. Или убирайте рекурсию, для начала.
B_N вне форума Ответить с цитированием
Старый 02.06.2008, 22:53   #7
prost
 
Регистрация: 30.05.2008
Сообщений: 4
По умолчанию

эта функция реализует построчное сканирование фигуры и закраску
width и height это глобальные ширина и высота окна где рисуется многоугольник(тетраэдр)
функции передаются (x,y),которые лежат внутри этого многоугольника, как можно отсортировать y чтобы уменьшить рекурсию
prost вне форума Ответить с цитированием
Старый 02.06.2008, 23:34   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

prost, Ваши проблемы из-за рекурсии. Меняйте алгоритм, оптимизируйте, переделывайте его, заменяйте "реальный" стэк структурой данных "стэк", скажем, из STL. К тому же не ясны цели, которые Вы преследуете. Одно дело, если нужно продемонстрировать рекурсивный алгоритм закрашивания, другое - просто закрасить многоугольник. И, наконец, тетраэдр - это не многоугольник (фигура), это многогранник - тело.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массивы, переполнение при делении Alter Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 21.05.2008 21:11
Переполнение при возведении в степень ruPy Общие вопросы Delphi 1 01.02.2008 19:21
Переполнение стека при передачи функциям массивов большой размерности graphoman Общие вопросы Delphi 2 07.01.2008 21:47
проблема с *.chm FAiver Свободное общение 5 28.09.2007 21:01
проблема bill Свободное общение 7 08.07.2007 21:05