Это будут объекты, находящиеся между границами двух или более октре.В настоящее время, как я это делаю, я копирую основной список сущностей и передаю его как ссылку на дочерние октдари, которые будут брать объекты из списка, если объект полностью вписывается в их границы.Все, что осталось в этом списке, сравнивается на предмет столкновений с основным списком.Но я не уверен, что это лучший способ сделать это, учитывая, что мне нужно продублировать список (который я, вероятно, тоже не делаю правильно), который потенциально может содержать тысячи элементов.
using System.Collections.Generic;
public class Octree
{
BoundingCube boundingCube;
List<Entity> containedEntities;
List<Entity> unreservedEntities;
Octree[] children;
static readonly int capacity = 10;
static readonly int smallestSize = 8;
public Octree(BoundingCube givenBoundingCube, ref List<Entity> givenEntities)
{
boundingCube = givenBoundingCube;
containedEntities = new List<Entity>();
for (int i = givenEntities.Count - 1; i > -1; i--)
{
if (boundingCube.InBounds(givenEntities[i].posdim))
{
containedEntities.Add(givenEntities[i]);
givenEntities.Remove(givenEntities[i]);
}
}
if (containedEntities.Count > capacity && boundingCube.size > smallestSize)
{
Divide();
}
}
public void Divide()
{
unreservedEntities = Methods.CloneList(containedEntities);
children = new Octree[8];
children[0] = new Octree(boundingCube.LeftBottomFront, ref unreservedEntities);
children[1] = new Octree(boundingCube.RightBottomFront, ref unreservedEntities);
children[2] = new Octree(boundingCube.LeftTopFront, ref unreservedEntities);
children[3] = new Octree(boundingCube.RightTopFront, ref unreservedEntities);
children[4] = new Octree(boundingCube.LeftBottomBack, ref unreservedEntities);
children[5] = new Octree(boundingCube.RightBottomBack, ref unreservedEntities);
children[6] = new Octree(boundingCube.LeftTopBack, ref unreservedEntities);
children[7] = new Octree(boundingCube.RightTopBack, ref unreservedEntities);
}
public void CheckForCollisions()
{
for (int i = unreservedEntities.Count; i > 0; i++)
{
for (int j = containedEntities.Count; j > 0; j++)
{
if (unreservedEntities[j].posdim.IntersectsWith(containedEntities[i].posdim))
{
unreservedEntities[j].RunCollision(containedEntities[i]);
break;
}
}
}
}
}
public static List<T> CloneList<T>(List<T> originalList)
{
List<T> newList = new List<T>();
for (int i = 0; i < originalList.Count; i++)
{
newList.Add(originalList[i]);
}
return newList;
}