Implementé un QuadTree en funcionamiento. Se subdivide el espacio de 2 d para acomodar elementos, identificados por su cuadro delimitador (x, y, ancho, alto) en el cuadrángulo más pequeño posible (hasta un área mínima).QuadTrees: cómo actualizar cuándo se mueven los elementos internos
Mi código se basa en esta implementación (el mío es en Lua en lugar de C#): http://www.codeproject.com/KB/recipes/QuadTree.aspx
que he sido capaz de implementar con éxito las inserciones y deleciones. Ahora dirijo mi atención a la función update(), ya que la posición y las dimensiones de mis elementos cambian con el tiempo.
Mi primera aplicación funciona, pero es bastante ingenuo:
function QuadTree:update(item)
self:remove(item)
return self.root:insert(item)
end
Sí, básicamente retire y vuelva a insertar cada artículo cada vez que se mueven.
Esto funciona, pero me gustaría optimizarlo un poco más; después de todo, la mayoría de las veces, los elementos en movimiento permanecen en el mismo nodo quadTree.
¿Hay alguna manera estándar de manejar este tipo de actualización?
En caso de que ayuda, mi código está aquí: https://github.com/kikito/middleclass-ai/blob/master/QuadTree.lua
no estoy buscando a alguien para ponerlo en práctica para mí; los punteros a una implementación de trabajo existente (incluso en otros idiomas) serían suficientes.
Gracias por responder. La geometría se actualiza fuera del quadtree: los elementos mismos están a cargo de hacer eso. El problema con su ejemplo es oldNode: contains() - incluso si contiene el elemento, podría ser que el nuevo nodo sea uno de los elementos secundarios de oldNode; por ejemplo, si el artículo es más pequeño. Tengo dificultades para tratar de modelar eso. – kikito
Ese es un buen punto que no dejé en claro: contiene, elimina e inserta todas las implementaciones no recursivas porque el nodo en el que están trabajando es el correcto, es decir, trabajan en un Nodo, no en un Árbol, aunque existen no es una clase de Nodo distinta.findNode tiene que funcionar recursivamente en un árbol, es similar a insertar, pero sin hacer la inserción real. – richj
Pensándolo bien, sería mejor si findNode no dividió un nodo que está lleno, porque no todas las llamadas a findNode son seguidas por una inserción. He actualizado el pseudo-código para permitir que newNode.insert (item) devuelva un nodo secundario de newNode. – richj