1
This commit is contained in:
84
Src/Core/Quadtree/QuadtreeNode.cs
Normal file
84
Src/Core/Quadtree/QuadtreeNode.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Concurrent;
|
||||
using Unity.Mathematics;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Net.BITKit.Quadtree
|
||||
{
|
||||
public struct QuadtreeNode
|
||||
{
|
||||
public readonly Quadtree Root;
|
||||
|
||||
public int Depth;
|
||||
|
||||
public float2 Center; // 节点中心
|
||||
public float2 Size; // 节点大小
|
||||
|
||||
public readonly QuadtreeNode[] Children; // 子节点
|
||||
public readonly HashSet<int> Objects; // 存储的对象ID
|
||||
|
||||
public QuadtreeNode(Quadtree root,float2 center, float2 size)
|
||||
{
|
||||
Root = root;
|
||||
Center = center;
|
||||
Size = size;
|
||||
|
||||
Children = new QuadtreeNode[4];
|
||||
|
||||
Objects = new HashSet<int>();
|
||||
|
||||
Depth = 0;
|
||||
}
|
||||
|
||||
public bool Contains(float2 point)
|
||||
{
|
||||
var min = Center - Size * 0.5f;
|
||||
var max = Center + Size * 0.5f;
|
||||
|
||||
return math.all(point >= min & point <= max);
|
||||
}
|
||||
|
||||
public void Split()
|
||||
{
|
||||
var childSize = Size / 2;
|
||||
var offset = childSize / 2;
|
||||
|
||||
foreach (var node in Children)
|
||||
{
|
||||
foreach (var id in Objects)
|
||||
{
|
||||
var pos = Root.Positions[id];
|
||||
if (node.Contains(pos))
|
||||
{
|
||||
node.Objects.Add(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Objects.Clear();
|
||||
|
||||
Children[0] = new QuadtreeNode(Root, Center + new float2(-offset.x, offset.y), childSize)
|
||||
{
|
||||
Depth = Depth + 1,
|
||||
};
|
||||
Children[1] = new QuadtreeNode(Root, Center + new float2(offset.x, offset.y), childSize)
|
||||
{
|
||||
Depth = Depth + 1,
|
||||
};
|
||||
Children[2] = new QuadtreeNode(Root, Center + new float2(-offset.x, -offset.y), childSize)
|
||||
{
|
||||
Depth = Depth + 1,
|
||||
};
|
||||
Children[3] = new QuadtreeNode(Root, Center + new float2(offset.x, -offset.y), childSize)
|
||||
{
|
||||
Depth = Depth + 1,
|
||||
};
|
||||
}
|
||||
|
||||
public bool IsLeaf()
|
||||
{
|
||||
return Children[0].Size.x == 0; // 如果子节点未初始化,说明是叶子节点
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user