Ошибки рекурсии деревьев - PullRequest
1 голос
/ 30 марта 2011

После отладки буквально с воскресенья того же кода, я официально сдался и думаю, что пришло время взглянуть на кого-то другого. Я провел часы и часы и не могу представить, что не так с моим кодом. Это немного долго, но за ним легко следовать, и я был бы очень признателен за любую помощь - ты единственный выбор, который я получил сейчас.

То, что я пытаюсь сделать, это реализовать несколько функций, которые в совокупности делают это: учитывая четырехугольное дерево, где каждый лист представляет 1 пиксель изображения, обрежьте дерево, чтобы удалить или объединить похожие цвета. Каждое дерево имеет узел root с 4 дочерними элементами и т. Д. Каждый узел имеет x,y,width,height, and element, где ширина и высота представляют блок пикселей, который представляет эту область, а x, y представляют пиксель нижнего левого угла узла, а элемент является пикселем типа. Каждый неконечный узел хранит средний цвет всех своих дочерних узлов. Если разница в цвете определенного неконечного узла myNode с одним из его дочерних листовых узлов больше, чем параметр tol(or tolerance), то вы не можете обрезать. Если таких случаев нет, то вы сокращаете, что означает, что вы удалите все дочерние элементы myNode, а myNode будет просто хранить среднее значение всех узлов, которые он только что удалил (что должно быть просто автоматически, когда среднее значение рассчитывается в коде изначально).

Итак, вот мой кодовый поток:

  • Сначала я вычисляю и сохраняю среднее каждого узла в его элемент пиксельное поле.
  • Теперь внешняя функция вызывает pruneSize для некоторого дерева. pruneSize на самом деле не обрезает, а просто возвращает количество листьев, которые остались бы в дереве, если бы вы обрезали.
  • Оттуда код комментируется. По сути, в более глубокой и сигнальной функции я попытался сделать так, чтобы, если по какой-либо причине не удалось удалить orig, нужно теперь проверять детей orig, чтобы убедиться, что их можно удалить, и так далее.

Проблема в том, что я не получаю правильный вывод при запуске. Это выключено. Я надеюсь, что ошибку будет легко заметить опытный среди вас.

(Кроме того, класс quadtree реализован отлично. Все остальное было протестировано и работает нормально, так что это что-то с моим средним калькулятором или pruneSize.)

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

Я могу ошибаться (просто пролистал и не могу проверить прямо сейчас), но, насколько я знаю, для квадрата в C ++ вам нужно явно умножить число на себя. Выполнение A^2 вычислит A XOR 2.

0 голосов
/ 31 марта 2011

В calculateAvg, я думаю, вам следует позвонить calculateAvg на детей до расчета своего "собственного" среднего. В противном случае мне кажется, что значения, которые вы читаете, устарели или не определены ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...