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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top