Ich werde eine Template-Implementierung eines KDTree schreiben, die für jetzt nur als Quadtree oder Octree für eine BarnesHut-Implementierung funktionieren sollte.QuadTree oder Octree templatized Implementierung in C++
Der entscheidende Punkt hier ist das Design, ich möchte die Nummer der Dimension angeben, wo der Baum als Vorlage Parameter definiert ist und dann einfach einige gebräuchliche Methoden deklarieren, die automatisch den richtigen Weg (ich denke, einige Template-Spezialisierung ist benötigt dann).
Ich möchte die Vorlage spezialisieren, um 2^2 (Quadtree) oder 2^3 (Octree) Knoten zu haben.
Hat jemand Design-Ideen? Ich möchte Vererbung vermeiden, weil es mich dazu zwingt, dynamische Speicherzuteilung statt statische Zuordnungen vorzunehmen.
Hier kann N sein, 2 oder 3
template<int N>
class NTree
{
public:
NTree<N>(const std::vector<Mass *> &);
~NTree<N>()
{
for (int i=0; i<pow(2,N); i++)
delete nodes[i];
}
private:
void insert<N>(Mass *m);
NTree *nodes[pow(2,N)]; // is it possible in a templatized way?
};
Ein weiteres Problem ist, dass Quadtree hat 4 Knoten, aber 2 Dimension Octree hat 8 Knoten, aber 3 Dimension, d.h. Anzahl der Knoten ist 2^dimension
. Kann ich dies über Template-Metaprogrammierung angeben? Ich möchte die Nummer 4 und 8 behalten, damit der Loop-Abroller schneller sein kann.
Vielen Dank!
Sie verwenden den Begriff "Blatt" falsch, der richtige Begriff ist "Knoten". Ein "Blatt" ist ein Knoten ohne Kinder. –
Sie mischen auch kdtrees und quad/octree falsch, sie sind nicht die gleichen (dh ein 2D-Baum ist nicht gleich einem Quadtree). – KillianDS
Richtig, ich möchte einfach einen n-ary Baum, der sich wie Quadtree in 2D verhält und Octree in 3D, ich bearbeite die Frage. – linello