[C/C++] Rekursive Tiefe speichern (QuadTree)

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Flyde, 20. Dezember 2010 .

  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.
     
  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);
    }
     
  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]
     
  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
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.