#1 20. Dezember 2010 Rekursive Tiefe speichern (QuadTree) Hi, ich bastel grad anem QuadTree für mein PingPong weiter und stoße grad auf ein kleines Problem was wahrscheinlich so offensichtlich lösbar ist... aber mir es einfach nicht einfällt ich habe einen Datentyp node Code: struct node { // Koordinaten des jeweiligen Objektes int x,y; // Subtrees node* ul; // Upper-Left node* ur; // Upper-Right node* ll; // Lower-Left node* lr; // Lower-Right }; und eine Methode "insert" um etwas in den Baum einzufügen. Um mein Objekt in den richtigen Subtree einzufügen müsste ich die Baumtiefe wissen Wen es interessiert, hier die Rechnung, (UNGETESTET) Code: // ... // x,y // Beispiel: objX(400) / ResX(800) = 0.5 // objY(300) / ResY(600) = 0.5 // Objekt befindet sich auf xy { 0,5; 0,5 } // Bemerkung: resX und resY sind zum Simulieren einer Auflösung, wird später von der Engine übernommen double newX = x / this->resX; double newY = y / this->resY; // Quadrant ermitteln // Beispiel: 1 / 2^0 = 1 (Ganzer Bildschirm (100%) auf Tiefe 0) // 1 / 2^1 = 0.5 (50% des Bildschirms auf Tiefe 1) // 1 / 2^2 = 0.25 (25% des Bildschirms auf Tiefe 2) // Bemerkung: Gilt sowohl für x als auch y des Bildschirms, unabhängig von der Auflösung double quadrant = 1 / pow(2, depth); // Prüfe ob Objekt in 'ul' if(newX < quadrant || newY < quadrant) { } // Prüfe ob Objekt in 'ur' else if(newX >= quadrant || newY < quadrant) { } // Prüfe ob Objekt in 'll' else if(newX < quadrant || newY >= quadrant) { } // Prüfe ob Objekt in 'lr' else if(newX >= quadrant || newY >= quadrant) { } // ... Bei jedem rekursiven aufruf von insert möchte ich einen zähler "depth" mitzählen lassen, wie tief man mittlerweile ist, da ich das für die Berechnung eines einzelnen Quadranten benötige mit Code: static int depth = 0; kann ich es sowohl im Datentyp "node" als auch in der Methode "insert" vergessen, da ich es irgendwann wieder auf 0 setzen müsste... oder gibts nen weg eine static variable zu resetten? Joa das ist auch schon mein Problem: Ich brauch einen "Tiefenzähler" der die Rekursiven aufrufe zählt.. aber sich am ende des letzten rekursiven aufrufs wieder auf 0 setzt. + Multi-Zitat Zitieren
#2 20. Dezember 2010 AW: Rekursive Tiefe speichern (QuadTree) Code: #include <stdio.h> #include <stdlib.h> void rekursive_funktion(int *); int main() { int depth =0; rekursive_funktion(&depth); printf("%d", depth); // 10 depth = 0; return 0; } void rekursive_funktion(int *depth) { if(++(*depth) == 10) return; rekursive_funktion(depth); } + Multi-Zitat Zitieren
#3 20. Dezember 2010 AW: Rekursive Tiefe speichern (QuadTree) erstmal mit ner anderen funktion die tiefe des baum rausfinden int depth(baum){ return 1+max(depth(baum.child1()),depth(baum.child2()),depth(baum.child3()),depth(baum.child4())); } [ist jetzt java syntax, in c++ bin ich nicht ganz so fit. so wie murdoc das erleutert hat mit nem pointer gehts auch] + Multi-Zitat Zitieren
#4 20. Dezember 2010 AW: Rekursive Tiefe speichern (QuadTree) danke euch beiden, ich merk aber grad... warum nicht einfach so: private variable depth und.... Code: bool CQuadTree::insert(int x, int y, node *qtNode) { // ... if(this->depth != 10) { this->depth++; this->insert(x, y, qtNode); } this->depth = 0; // ... } Bei murdocs variante hätte ich bei meiner methode noch die tiefe mit übergeben müssen, richtig? wäre aber eher unpraktisch für den Aufruf im Hauptprogramm Oder ich dreh grad völlig am rad und denk komplett in die falsche richtung.. Ich versuch erst mal meine Idee und wenn das in die hose geht denk ich noch mal über murdocs variante nach uhm... close nur wenn von den Pros keine Einwände mehr kommen + Multi-Zitat Zitieren