Voy a escribir una implementación de plantillas de KDTree, que por ahora solo debería funcionar como Quadtree u Octree para una implementación de BarnesHut.Implementación de plantillas QuadTree u Octree en C++
El punto crucial aquí es el diseño, me gustaría especificar el número de dimensión donde se define el árbol como parámetro de plantilla y luego simplemente declarar algunos métodos comunes, que se comportan automáticamente de la manera correcta (creo que es especialización de plantilla necesario entonces).
Me gustaría especializar la plantilla para tener 2^2 (quadtree) o 2^3 (octree) nodos.
¿Alguien tiene algunas ideas de diseño? Me gustaría evitar la herencia porque me obliga a hacer una asignación de memoria dinámica en lugar de asignaciones estáticas.
Aquí N puede ser 2 o 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?
};
Otro problema es que quadtree tiene 4 nodos pero 2 dimensión, octree tiene 8 nodos, pero 3 dimensión, es decir, número de nodos es 2^dimension
. ¿Puedo especificar esto a través de metaprogramación de plantillas? Me gustaría mantener el número 4 y 8 para que el desenrollador de bucle pueda ser más rápido.
¡Gracias!
Está utilizando el término "hoja" incorrectamente, el término correcto es "nodo". Una "hoja" es un nodo sin hijos. –
También está mezclando kdtrees y quad/octree incorrectamente, no son lo mismo (es decir, un árbol 2D no es igual a un árbol cuádruple) .. – KillianDS
Correcto, simplemente quiero un árbol n-ary que se comporte como un árbol cuádruple en 2D y octree en 3D, estoy editando la pregunta. – linello