Stefan Müller 85fcd2358f Remove entity boundaries from Quadtree
The Quadtree did no meaningful management of entity boundaries. All it did was store the maximum and inflate the query rectangle accordingly. The caller can easily take over this responsibility. Consequently, this simplifies queries.
2025-09-27 23:23:38 +02:00

69 lines
1.8 KiB
C#

using SpatialCollections;
using System.Numerics;
namespace QuadtreeTests
{
public class Tests
{
private class TestEntity(Vector2 position)
{
public Vector2 Position { get; } = position;
}
private List<Vector2> _positions;
private List<TestEntity> _entities;
private Quadtree<TestEntity> _quadtree;
[SetUp]
public void Setup()
{
_positions = [new Vector2(1.0f, 1.0f), new Vector2(3.0f, 3.0f), new Vector2(5.0f, 8.0f)];
_entities = new();
_quadtree = new(20, 4, e => e.Position);
for (int i = 0; i < _positions.Count; i++)
{
var obj = new TestEntity(_positions[i]);
_entities.Add(obj);
}
}
[Test]
public void TestAdd()
{
AddObjectsAndAssertCount();
}
[Test]
public void TestAddRemove()
{
AddObjectsAndAssertCount();
for (int i = 0; i < _entities.Count; i++)
{
_quadtree.Remove(_entities[i]);
Assert.That(_quadtree.Count, Is.EqualTo(_entities.Count - i - 1));
}
}
[Test]
public void TestQuery()
{
AddObjectsAndAssertCount();
List<TestEntity> result = new();
_quadtree.Query(new Rectangle(new Vector2(2.5f, 2.5f), new Vector2(10.0f, 10.0f)), result);
Assert.That(result.Count, Is.EqualTo(2));
}
private void AddObjectsAndAssertCount()
{
for (int i = 0; i < _entities.Count; i++)
{
_quadtree.Add(_entities[i]);
Assert.That(_quadtree.Count, Is.EqualTo(i + 1));
}
}
}
}