У меня следующий рекурсивный код, и он не работает должным образом (подробности см. Ниже):
R3Intersection ComputeIntersectionNode(R3Ray *ray, R3Node *node)
{
R3Intersection closest_inter;
R3Intersection child_inter;
R3Intersection shape_inter;
double least_t = DBL_MAX;
// check for intersection with shape
if(node->shape != NULL)
{
shape_inter = ComputeIntersectionShape(ray, node->shape);
if(shape_inter.hit == 1)
closest_inter = shape_inter;
}
// go through all the children and for each child, compute
// the closest intersection with ray
for(int i = 0; i < node->children.size(); i++)
{
// compute intersection with children[i] and ray
child_inter = ComputeIntersectionNode(ray, node->children[i]);
// if there's an intersection with the child node and
// it is the closest intersection, set closest intersection
if(child_inter.hit == 1 && fabs(child_inter.t) < fabs(least_t))
closest_inter = child_inter;
}
return closest_inter;
}
Этот ComputeIntersectionNode(...)
, в дополнение к рекурсивным вызовам, также вызывается для нескольких лучей в программе. Чтобы проверить эту функцию, я запускаю ее для 4 rays
и 4 nodes
(или, точнее, одного root
типа node
, который не имеет shape
, но имеет 4 children
, каждый из которых имеет один shape
). Для тестирования каждый ray
пересекается ровно на один node
/ shape
.
Когда я запускаю код в GDB для первого ray
, он сначала пропускает root
через код, который не имеет shape
, поэтому он сразу переходит к children
. Он правильно вычисляет пересечение первого дочернего элемента и правильно устанавливает переменную closest_inter
, которая возвращается к наивысшему уровню рекурсии, и child_inter
, а также closest_inter
устанавливаются здесь с child_inter.hit = 1;
Затем обрабатывается второй ребенок. ComputeIntersectionShape(...)
не возвращает пересечения со вторым потомком (shape_inter.hit == 0
;) - это ожидаемое поведение. Однако, когда функция возвращается к самому высокому уровню рекурсии, по некоторым причинам child_inter.hit устанавливается в 1 (но должен быть установлен в 0).
Есть предложения?
Заранее спасибо.