Pour la première fois ici, mais j'ai lu le site depuis quelques années maintenant. J'essaye d'implémenter un type générique simple Octree en C# (en utilisant certains XNA inclus). J'ai fait des recherches approfondies et je comprends le concept, je n'arrive juste pas à le faire fonctionner. La recherche autour de certaines implémentations dans d'autres langues, mais ils semblent tous adaptés à une application spécifique; et je n'ai pas vraiment pu faire beaucoup de sens à partir de ceux-là. Ci-dessous est ma classe Octree jusqu'à présent, le Vector3, BoundingBox, et ContainmentType sont XNA. Je nourris en points max et min, et une liste de points qui sont dans les limites. Cependant, aucun des points n'est réellement ajouté à l'arbre. Toute aide serait grandement appréciée!Comment implémenter un octree en C#?
public class Octree<T> : ISerializable
{
Vector3 max;
Vector3 min;
OctreeNode head;
public Octree(Vector3 min, Vector3 max, List<Vector3> values)
{
this.max = max;
this.min = min;
head = new OctreeNode(min, max, values);
}
public Octree() { }
public Octree(SerializationInfo info, StreamingContext context)
{
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
}
internal class OctreeNode
{
Vector3 max;
Vector3 min;
Vector3 center;
public Vector3 position;
public T data;
public BoundingBox nodeBox;
public List<OctreeNode> subNodes;
public OctreeNode(Vector3 min, Vector3 max,List<Vector3> coords)
{
nodeBox = new BoundingBox(min, max);
subNodes = new List<OctreeNode>();
this.min = min;
this.max = max;
center = (min + ((max - min)/2));
nodeBox = new BoundingBox(min, max);
if (coords.Count == 0)
{ return; }
subNodes.Add(new OctreeNode(center, max));
subNodes.Add(new OctreeNode(new Vector3(min.X, center.Y, center.Z), new Vector3(center.X, max.Y, min.Z)));
subNodes.Add(new OctreeNode(new Vector3(min.X, center.Y, max.Z), new Vector3(center.X, max.Y, center.Z)));
subNodes.Add(new OctreeNode(new Vector3(center.X, center.Y, max.Z), new Vector3(max.X, max.Y, center.Z)));
subNodes.Add(new OctreeNode(new Vector3(center.X, min.Y, center.Z), new Vector3(max.X, center.Y, min.Z)));
subNodes.Add(new OctreeNode(new Vector3(min.X, min.Y, center.Z), new Vector3(center.X, center.Y, min.Z)));
subNodes.Add(new OctreeNode(new Vector3(min.X, min.Y, max.Z), center));
subNodes.Add(new OctreeNode(new Vector3(center.X,min.Y,max.Z), new Vector3(max.X,center.Y,center.Z)));
List<List<Vector3>> octants = new List<List<Vector3>>();
for (int i = 0; i < 8; i++)
{
octants.Add(new List<Vector3>());
}
foreach (Vector3 v in coords)
{
int i = 0;
foreach(OctreeNode n in subNodes)
{
ContainmentType t = n.nodeBox.Contains(v);
if (t.Equals(ContainmentType.Contains))
{
octants[i].Add(v);
}
i++;
}
}
for (int i=0;i<subNodes.Count;i++)
{
if (octants[i].Count > 0)
{
Vector3 v = octants[i][0];
octants[i].Remove(v);
subNodes[i] = new OctreeNode(subNodes[i].min, subNodes[i].max, octants[i]);
}
}
}
public OctreeNode(Vector3 min, Vector3 max)
{
nodeBox = new BoundingBox(min, max);
}
}
}
Avez-vous essayé d'écrire des tests à développer? – ChaosPandion
Si vous faites référence à des tests unitaires automatisés alors non, je n'ai pas. J'envisageais de le faire une fois que je pourrais réellement faire en sorte que le constructeur peuplerait l'arbre d'une manière ou d'une autre. – user1927218