octree
-
Hi! Ich mache jetzt meine ersten Versuche in der Erstellung eines Octrees, also habe ich einfach
einmal versucht einen würfel in achtteile zu teilen ... klappt problemlos.
aber dann habe ich versucht diese 8 teile jeweils wieder in 8 teile zu teilen und dann diese wieder und wieder, bis eine gewisse zahl erreicht ist.mein problem ist, dass er immer nur den 1. node wieder und wieder neu teilt, die anderen nicht. könnt ihr auch bitte meinen quellcode durchschauen und mir sagen was ich falsch mache...
hier ist ein screenshot, falls ich mich irgendwie undeutlich ausgedrückt habe... http://free.pages.at/eafese/octree.htm//octree.h [...] class COctree; int subdiv=10; class COctree { private: bool isSubDiv; COctree *Nodes; public: CBoundingBox BBox; void Init(CVector3D pos, float width); void AddObject(CObject *Object); list<CObject*> Objectlist; list<CObject*>::iterator Objects; void Render(); void setRenderBBox(bool); COctree() { } ~COctree() { for(Objects=Objectlist.begin(); Objects != Objectlist.end(); ++Objects) { delete *Objects; } if(!Objectlist.empty()) Objectlist.clear(); } }; //octree.cpp [...] void COctree::AddObject (CObject *Object) { Objectlist.push_back (Object); } void COctree::Init (CVector3D pos, float width) { BBox.vPos = pos; BBox.Width = width; subdiv--; if(subdiv <= 0) { Log->Output ("Octree-Init fertig \"subdiv\" Level: %i<br>",subdiv); isSubDiv = false; return; } else { isSubDiv = true; CVector3D newPos; Nodes = new COctree[8]; newPos.v[0] = pos.v[0] + width/4; newPos.v[1] = pos.v[1] + width/4; newPos.v[2] = pos.v[2] + width/4; Nodes[0].Init(newPos, width/2); Log->Output ("Node 0 - %i<br>",subdiv); newPos.v[0] = pos.v[0] - width/4; newPos.v[1] = pos.v[1] - width/4; newPos.v[2] = pos.v[2] - width/4; Nodes[1].Init(newPos, width/2); Log->Output ("Node 1 - %i<br>",subdiv); newPos.v[0] = pos.v[0] + width/4; newPos.v[1] = pos.v[1] + width/4; newPos.v[2] = pos.v[2] - width/4; Nodes[2].Init(newPos, width/2); Log->Output ("Node 2 - %i<br>",subdiv); newPos.v[0] = pos.v[0] + width/4; newPos.v[1] = pos.v[1] - width/4; newPos.v[2] = pos.v[2] - width/4; Nodes[3].Init(newPos, width/2); Log->Output ("Node 3 - %i<br>",subdiv); newPos.v[0] = pos.v[0] - width/4; newPos.v[1] = pos.v[1] + width/4; newPos.v[2] = pos.v[2] - width/4; Nodes[4].Init(newPos, width/2); Log->Output ("Node 4 - %i<br>",subdiv); newPos.v[0] = pos.v[0] - width/4; newPos.v[1] = pos.v[1] + width/4; newPos.v[2] = pos.v[2] + width/4; Nodes[5].Init(newPos, width/2); Log->Output ("Node 5 - %i<br>",subdiv); newPos.v[0] = pos.v[0] + width/4; newPos.v[1] = pos.v[1] - width/4; newPos.v[2] = pos.v[2] + width/4; Nodes[6].Init(newPos, width/2); Log->Output ("Node 6 - %i<br>",subdiv); newPos.v[0] = pos.v[0] - width/4; newPos.v[1] = pos.v[1] - width/4; newPos.v[2] = pos.v[2] + width/4; Nodes[7].Init(newPos, width/2); Log->Output ("Node 7 - %i<br>",subdiv); } } void COctree::Render () { //Ist nicht wichtig ... /*if(Objectlist.size != NULL) { for(Objects=Objectlist.begin(); Objects != Objectlist.end(); ++Objects) { (*Objects)->Render(); } }*/ BBox.Render (); if(isSubDiv) { Nodes[0].Render(); Nodes[1].Render(); Nodes[2].Render(); Nodes[3].Render(); Nodes[4].Render(); Nodes[5].Render(); Nodes[6].Render(); Nodes[7].Render(); } return; }
danke im vorraus!!
cu
-
Hi,
was auch immer subdiv ist, es ist anscheinend nach dem ersten Durchlauf 0, weil es in der Methode ja immer um einen reduziert wird. Für alle 8 Childs eines Nodes muss subdiv aber denselben Wert haben, und durch Deine Rekursion hat es den anscheinend nicht, wenn es sich z.B. um eine globale Variable handelt.
Ciao,
Stefan
-
Ups, subdiv steht ja da oben
Ist doch klar, beim Aufruf von Nodes[0].Init(newPos, width/2); reduziert er dort im rekursiven Ast ja auch wieder den Wert von subdiv, und in dessen rekursivem Aufruf auch wieder. Er geht also immer nur in die 0 Nodes.
Mach aus subdiv eine lokale Variable direkt in der Methode, das sollte helfen.
ciao,
Stefan
-
oh, danke! ... übler fehler von mir
-
hm ... aber dann teilen sich die würfel ja ewig, wie schreib ich dann eine abbrechbedingung rein?
-
Hi,
sorry, ich sollte mehr nachdenken. Übergib den Wert als Parameter der Funktion, und bei der Erstellung der Root gibst Du dort den Startwert an.
Ciao,
Stefan
-
? kannst du es bitte ein bisschen genauer erklären?!
-
okay, weiß jetzt was du gemeint hast DANKE!
cu
stefan