2012-02-24 3 views
0

며칠 전에 재귀에 대해 물어볼 질문과 비슷한 질문을 던졌습니다. 다음은 이전 질문에 대한 링크입니다. C++ vector loses data in recursive function벡터로 항목을 푸시하지 않는 C++ 재귀 호출

재귀 호출에서 벡터를 푸시하는 데 문제가 있다는 것을 알았 기 때문에 지금 당장은 매우 고밀도라고 느낍니다.하지만 지금은 비슷한 문제가 있습니다. 기능.

void TriangleDynamic::collectRayRecursive(Ray &ray, double binSize, double radius, Point &org) 
{ 
    if (getLowestLevel()) 
    { 
     //this is where I push the ray. 
     raysPushBack(move(ray)); 
    } 

    else 
    { 
     bool foundIntersectSub = false; 
     unsigned int ctr = 0; 
     while((!foundIntersectSub) && (ctr<=getSubTrianglesSize() - 1)) 
     { 
      if (getSubTriangle(ctr).intersect(ray)) 
      { 
       foundIntersectSub = true; 
       getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org); 

      } 
      ctr = ctr + 1; 
     } 
    } 

} 

함수가 TriangleDynamic 클래스의 일부 매개 변수로 광선을 취 여기서 함수 코드의 비트이다. Ray는 TriangleDynamic 객체와 교차하는 것으로 알려져 있지만 삼각형이 "최저 레벨"삼각형이 아닌 경우 함수는 삼각형 subTriangles를 통해 Ray가 교차 한 subTriangle을 찾습니다 (하나는 디자인에 의해 교차됩니다) . 이것은 재귀 호출이 발생하는 곳이며 광선이 벡터라고 부르는 벡터에 푸시되고 TriangleDynamic의 멤버 데이터 인 최하위 삼각형에 도달하면 한 번입니다. 그러나 다시 한 번 나는 자료를 잃는다. 이 일을하는 방법이 있습니까? 나는 이전의 질문에 얼마나 빨리 그리고 쉽게 답할 수 있는지 믿을 수 없다. 나는 다시 시도 할 것이라고 생각했다. 감사!

+1

광선 벡터는 어디에서 생깁니 까? –

+0

TriangleDynamic 멤버 데이터 내에 있습니다. – user1216527

+0

원본을 게시 한 후에 추가했지만 Ray 개체를 보유하고있는 벡터입니다. – user1216527

답변

2
getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org); 

[당신이 말한대로 귀하의 벡터가 TriangleDynamic에 살고,하지만 첫 번째 재귀 호출의 vector이의 벡터와 동일하지 않습니다 귀하의 재귀 호출하는 TriangleDynamic마다의 다른 인스턴스에서 작동 두 번째 재귀 호출은 3 번째 재귀 호출과 동일하지 않습니다. [글쎄, 나는 더 많은 코드가 필요하기 때문에 그 사실을 확신 할 수는 없지만 그렇게 추측합니다].

재귀 호출 후 getSubTriangle()에 의해 생성 된 삼각형에있는 vectorthis으로 복사해야합니다.

편집 :
(가) 스택이 그런 걸 볼 수 있었다 호출 : 재귀 invokation의 "스택 추적"에 슬쩍 당신이 얻을 재귀 호출을 호출하여

|triangle_1.collectRayRecursive()| 
--------------------------------- 

을 [그 triangle_1주의 등등

|triangle_2.collectRayRecursive()| 
|triangle_1.collectRayRecursive()| 
--------------------------------- 

그리고] 다른 개체 triangle_2 있습니다 ...

|triangle_n.collectRayRecursive()| 
.... 
|triangle_2.collectRayRecursive()| 
|triangle_1.collectRayRecursive()| 
--------------------------------- 

지금, 당신은 다른 삼각형의 물체 triangle_n [깊은 재귀 호출] 안에 살고 vector 아닌 vector을 수정합니다.
재귀에서 돌아 오면 vector을 복사하지 않고 머리를 팝업합니다 (triangle_n).
그 결과 - 새로운 정보가 triangle_(n-1)의 벡터에 추가되지 않아 triangle_(n-2) ...에 전달되지 않습니다. 최종 결과가 표시 될 triangle_1으로 전달되지 않습니다.

+0

고마워, 이해할 것 같아. 당신의 대답에 대해 몇 가지 질문이 있습니다. 벡터를 복사하면 더 높은 차원의 삼각형에 또 다른 광선 벡터가 생성됩니까? 나는 레이스가 가장 낮은 레벨에 저장되기를 원한다. 더 이상 코드가 필요하면 알려주세요. 당신의 도움을 주셔서 감사합니다! – user1216527

+0

@ user1216527 : 벡터가 삼각형에 실제로 할당되면 [참고 값이 아닌 값으로] : 임시 변수에'getSubTriangle()'을 저장하고 (''temp' '),''temp.raysVector 각각의 재귀 호출 후에'this.raysVector'에'[여기에 이름을 써 넣으십시오]. 벡터가 가장 깊은 레벨에서부터 첫 번째 레벨까지 내려갑니다. – amit

+0

음 ... 아직도 문제가있는 것 같습니다. 저는 삼각형의 가장 낮은 레벨에 도달했음을 알고 있습니다. 그리고 나는 광선을 밀었다는 것을 압니다. 그러나 재귀 호출 직후에 getSubTriangle (ctr)의 임시 변수를 만들면 광선 벡터가 비어 있습니다 (복사 할 내용이 없습니다). 양해 해 주셔서 감사합니다. – user1216527