C ++ Rekursionsfehler
-
23-09-2019 - |
Frage
Ich habe den folgenden rekursiven Code und er verhalten sich nicht wie erwartet (siehe Details unten):
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;
}
Dies ComputeIntersectionNode(...)
, Zusätzlich zu den rekursiven Aufrufen wird auch mehrere Strahlen im Programm aufgerufen. Um diese Funktion zu testen, führe ich sie für 4 aus rays
und 4 nodes
(oder genauer gesagt einer root
vom Typ node
, was keine hat shape
, hat aber 4 children
, jedes davon hat eine shape
). Zum Testen jeder ray
schneidet genau einen node
/shape
.
Wenn ich den Code zum ersten in GDB ausführe ray
, es übergeht zuerst die root
Durch den Code, der keine hat shape
, dann geht es direkt an die children
. Es berechnet die Kreuzung des ersten Kindes korrekt und legt die fest closest_inter
Variable auch richtig, was auf die höchste Rekursion zurückgegeben wird und child_inter
ebenso gut wie closest_inter
sind hier mit child_inter.hit = 1;
Dann wird das zweite Kind verarbeitet. ComputeIntersectionShape(...)
Gibt keine Kreuzung mit dem zweiten Kind zurück (shape_inter.hit == 0
;) - Dies ist erwartetes Verhalten. Wenn die Funktion jedoch auf die höchste Rekursionsniveau zurückkehrt, wird aus irgendeinem Grund Child_inter.hit auf 1 gesetzt (sollte jedoch auf 0 eingestellt werden).
Irgendwelche Vorschläge?
Danke im Voraus.
Lösung
Ich denke R3Intersection
(dh. Sie geben das nicht zurück shape_inter
wenn es sich nicht schneidet). Abhängig von seinem Standardkonstruktor erhalten Sie möglicherweise das, was Sie sehen.