Bonsoir,
J'ai encore un petit soucis lors de mon impl�mentation d'un syst�me d'octree. Je vais essayer d'�tre clair m�me si �a va �tre assez compliqu�.
En gros, l'octree est un arbre, et chaque noeud poss�de ses propres donn�es de type T (d�fini par l'argument template). Ici, j'y stocke des objets Spheres *, donc T = Spheres *. Afin que chaque objet Spheres * puisse savoir dans quel noeud il se trouve, d�s que j'ajoute un �l�ment dans un noeud, j'appelle la fonction membre AttachNode de la classe Spheres, comme ceci :
elementToAdd->AttachNode (this, numData++);
Et voici la fonction AttachNode, tr�s simple :
ou objID est un size_t, et octreeNode : Octree<Sphere *> * octreeNode;
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 void AttachNode (Octree<Sphere *> * octree, size_t objectID) { octreeNode = octree; objID = objectID; }
A l'initialisation, aucun soucis, tout marche bien. Je peux ajouter autant d'�l�ment que je veux, cette fonction est bien appel�, octreeNode pointe bien vers le bon objet... Le probl�me survient lorsque les objets Spheres bougent et, potentiellement, peuvent changer de noeud. J'appelle tout simplement la fonction Update du noeud dans lequel l'objet se trouve :
octreeNode->UpdateElement (objID);
Je commence, dans cette fonction UpdateElement, � r�cup�rer un pointeur vers l'objet Spheres *, gr�ce � l'objID (en effet mes objets sont stock�s dans une map) :
// On r�cup�re en premier lieu un pointeur vers l'objet, gr�ce � l'ID pass� en
// param�tre
const ptrT element = myDataContener [elementID];
ou ptrT n'est qu'un typedef de T, donc = Spheres *. Et myDataContener est une map (dataContener myDataContener, ou dataContener == std::map <size_t, T>).
Dans cette fonction, je souhaite d�placer cet objet au noeud parent.
J'ai v�rifi�, le noeud parent est le bon, pas de soucis l�-dessus. Je me contente de faire un simple :
Et enfin, voici la fonction :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 parent->AddElementInThisNode (element); // On ajoute l'élément dans le noeud parent // Puis on le supprime de la liste de ce noeud sans appeler le destructeur // (puisque le pointeur sera inséré dans un autre noeud) myDataContener.erase (elementID);
Les soucis commencent ici, lorsque je rappelle la fonction AttachNode. J'acc�de sans soucis � la fonction, ce qui prouve bien que elementToAdd est un pointeur valide vers un objet Spheres *, mais le soucis, c'est d�s que je veux r�actualiser le pointeur octreeNode :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 template <typename T> void Octree<T>::AddElementInThisNode (const ptrT elementToAdd) { elementToAdd->AttachNode (this, numData++); myDataContener.insert (std::pair<size_t, ptrT> (numData++, elementToAdd)); }
Pour une raison que j'ignore, �a plante irr�m�diablement, alors que �a fonctionnait bien la premi�re fois que je l'appelle... Je ne sais pas d'o� �a vient. J'ai v�rifi� chaque pointeur, chaque �l�ment, ils pointent bien tous vers le bon �l�ment... Mais l� �a plante
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 void AttachNode (Octree<Sphere *> * octree, size_t objectID) { octreeNode = octree; objID = objectID; }.
EDIT : Compris... Quand j'ins�rais une donn�e dans ma map, je faisais ocmme �a :
elementToAdd->AttachNode (this, numData++);
myDataContener.insert (std::pair<size_t, ptrT> (numData, elementToAdd));
r�sultat, l'ID attach� � l'objet �tait par exemple 3, tandis que celui associ� � la map pour cet objet, 4... En fait il fallait faire ++numData... Une erreur toute b�te, mais qui m'a g�ch� 2 heures...
Partager