c # Как я могу проверить наличие столкновений между объектами, которые не полностью вписываются в границы октри? - PullRequest
0 голосов
/ 18 ноября 2018

Это будут объекты, находящиеся между границами двух или более октре.В настоящее время, как я это делаю, я копирую основной список сущностей и передаю его как ссылку на дочерние октдари, которые будут брать объекты из списка, если объект полностью вписывается в их границы.Все, что осталось в этом списке, сравнивается на предмет столкновений с основным списком.Но я не уверен, что это лучший способ сделать это, учитывая, что мне нужно продублировать список (который я, вероятно, тоже не делаю правильно), который потенциально может содержать тысячи элементов.

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;
}
...