Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Не безконечная рекурсия и stack overflow
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Rocky Rocky вне форума
Member
 
Сообщений: 1,405
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.10.2004
По умолчанию Не безконечная рекурсия и stack overflow - 31.10.2010, 14:03

Всем привет! Помогите плиз разобраться с проблемкой. Есть картинка, на которой нужно распознать треугольники (расходящиеся от центра картинки - штриховая мира). Ну первые этапы сделал, в итоге на данный момент есть картинка с (полыми) контурами этих треугольников, и 2 массива координат: один - с внутренними вершинами треугольников - которые находятся близко к центру, 2-й - с внешними вершинами (далеко от центра). Нужно среди всего этого найти какие 3 вершины принадлежат одному треугольнику и так для всех треугольников.

Беру первую вершину из первого массива. Далее идея поиска следующих 2-х вершин заключается в обходе по контуру треугольника, для которого взята 1-я вершина - т.е. по сути известна 1-я точка, и дальнейшему поиску среди полученных точек нужных нам координат из 2-го массива. Такой код:
Код:
PointCollection::const_iterator itPoint = m_roKorrValues_Inside.begin();
int nIter = 0;
m_roAllPoints.clear();
m_roAllPoints.insert(TPoint(itPoint->x, itPoint->y));
foo(QPoint(itPoint->x, itPoint->y), nIter);
................................

void CShapedMire::foo(const QPoint& oPointCur, int& nIter)
{
	++nIter;

	//if (nIter > 920) return;

	const QPoint oPoint1 = QPoint(oPointCur.x() - 1, oPointCur.y() - 1);
	const QPoint oPoint2 = QPoint(oPointCur.x() - 1, oPointCur.y() - 0);
	const QPoint oPoint3 = QPoint(oPointCur.x() - 1, oPointCur.y() + 1);
	const QPoint oPoint4 = QPoint(oPointCur.x() - 0, oPointCur.y() + 1);
	const QPoint oPoint5 = QPoint(oPointCur.x() - 0, oPointCur.y() - 1);
	const QPoint oPoint6 = QPoint(oPointCur.x() + 1, oPointCur.y() - 1);
	const QPoint oPoint7 = QPoint(oPointCur.x() + 1, oPointCur.y() - 0);
	const QPoint oPoint8 = QPoint(oPointCur.x() + 1, oPointCur.y() + 1);

	const QColor oColor1 = QColor(m_oMireImage_Correlation.pixel(oPoint1));
	const QColor oColor2 = QColor(m_oMireImage_Correlation.pixel(oPoint2));
	const QColor oColor3 = QColor(m_oMireImage_Correlation.pixel(oPoint3));
	const QColor oColor4 = QColor(m_oMireImage_Correlation.pixel(oPoint4));
	const QColor oColor5 = QColor(m_oMireImage_Correlation.pixel(oPoint5));
	const QColor oColor6 = QColor(m_oMireImage_Correlation.pixel(oPoint6));
	const QColor oColor7 = QColor(m_oMireImage_Correlation.pixel(oPoint7));
	const QColor oColor8 = QColor(m_oMireImage_Correlation.pixel(oPoint8));

	if (m_roAllPoints.find(oPoint1) == m_roAllPoints.end() && oColor1 != Qt::black) {m_roAllPoints.insert(oPoint1); foo(oPoint1, nIter);}
	if (m_roAllPoints.find(oPoint2) == m_roAllPoints.end() && oColor2 != Qt::black) {m_roAllPoints.insert(oPoint2); foo(oPoint2, nIter);}
	if (m_roAllPoints.find(oPoint3) == m_roAllPoints.end() && oColor3 != Qt::black) {m_roAllPoints.insert(oPoint3); foo(oPoint3, nIter);}
	if (m_roAllPoints.find(oPoint4) == m_roAllPoints.end() && oColor4 != Qt::black) {m_roAllPoints.insert(oPoint4); foo(oPoint4, nIter);}
	if (m_roAllPoints.find(oPoint5) == m_roAllPoints.end() && oColor5 != Qt::black) {m_roAllPoints.insert(oPoint5); foo(oPoint5, nIter);}
	if (m_roAllPoints.find(oPoint6) == m_roAllPoints.end() && oColor6 != Qt::black) {m_roAllPoints.insert(oPoint6); foo(oPoint6, nIter);}
	if (m_roAllPoints.find(oPoint7) == m_roAllPoints.end() && oColor7 != Qt::black) {m_roAllPoints.insert(oPoint7); foo(oPoint7, nIter);}
	if (m_roAllPoints.find(oPoint8) == m_roAllPoints.end() && oColor8 != Qt::black) {m_roAllPoints.insert(oPoint8); foo(oPoint8, nIter);}
}
nIter - для тестов. Основной смысл кода: Становимся на 1-ю точку треугольника и берем 8 точек вокруг нее. Смотрим цвет каждой. Если черный - то ничего не делаем. Если цвет не черный (треугольник обозначен серым цветом и при этом треугольники не пересекаются друг с другом) - то если точки с такими координатами в коллекции "ищущихся" точек нет, запоминаем ее и вызываем эту же функцию, но уже для этой точки. Т.е. рекурсивно обходим весь контур треугольника, запоминаем координаты всех его точек. В итоге не обойдя и половины контура я падаю с ошибкой stack overflow... В чем моя ошибка? (пример картинки прилагаю)
Изображения
Тип файла: jpg 5.jpg (15.0 Кб, 67 просмотров)
Тип файла: jpg 8.jpg (15.7 Кб, 55 просмотров)
Ответить с цитированием
  (#2 (permalink)) Старый
Rocky Rocky вне форума
Member
 
Сообщений: 1,405
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.10.2004
По умолчанию 31.10.2010, 21:24

А... сделал обход по контуру через метод жука... пофиг, 3 дня потратил на эту рекурсию дурацкую..
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Prolog, GStack overflow Syn-McJ Prolog 26 25.10.2011 23:51
Как исправить expl overflow error Trinka C++ Builder 9 04.05.2011 06:48
Как из программного кода вывести stack trace vilru С/С++ 3 12.05.2009 13:45
Рыцари и оруженосцы, поиск в ширину, Out of local stack tentul Prolog 3 27.11.2008 20:56
Если определён DOCTYPE, то не работает overflow:hidden wils0n DHTML, JavaScript, VBScript 0 23.05.2008 16:14
Ошибка переполнения Overflow LSA Visual Basic 6 25.04.2007 13:57
VB6.0 overflow Fuud Вопросы начинающих программистов 7 03.05.2006 19:11
Из-за чего появляется данная ошибка Stack oferflow Романнист C++ Builder 29 29.12.2005 11:40
Call Stack при обработке сообщения c++ WinAPI 1 17.06.2005 04:17
Требуется помочь в освоение buffer overflow newbie C++ на Unix 2 31.08.2004 14:10
Как избежать ошибку Stack overflow Error Anonymous C++ Builder 6 16.01.2004 15:53
Основные методы перехвата ошибок типа overflow LaMiK C++ Builder 14 06.01.2004 22:25



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов