Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


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

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


Ответ
 
Опции темы
Старый 01.06.2008, 21: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 в 22:13.
prost вне форума Ответить с цитированием
Старый 01.06.2008, 23:41   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

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

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

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

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

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

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

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


Купить рекламу на форуме 20000 рублей в месяц

Опции темы


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS