Exemple #1
0
 void OnAttachAccumutor(ISpacePartitioner accum)
 {
     foreach (Drawable drawable in drawables)
     {
         accum.InsertDrawable(drawable);
     }
 }
Exemple #2
0
        public static void GetClosestObjectTest(ISpacePartitioner <TestObject> partitioner)
        {
            TestObject[] objs =
            {
                new TestObject(0,  0),
                new TestObject(10, 0),
                new TestObject(7,  7),
                new TestObject(50, 50)
            };

            for (int i = 0; i < objs.Length; i++)
            {
                partitioner.Add(objs[i]);
            }

            partitioner.Update();

            Assert.AreEqual(partitioner.GetClosestObject(new Vector2f(0, 0)), objs[0]);
            Assert.AreEqual(partitioner.GetClosestObject(new Vector2f(5, 5)), objs[2]);
            Assert.AreEqual(partitioner.GetClosestObject(new Vector2f(5, 5)), objs[2]);
            Assert.AreEqual(partitioner.GetClosestObject(new Vector2f(5, 5), 1), null);
            Assert.AreEqual(partitioner.GetClosestObject(new Vector2f(-1, -1)), objs[0]);

#if DEBUG
            AssertThrows <ArgumentException>(() => partitioner.GetClosestObject(new Vector2f(0, 0), -1f));
#endif
        }
Exemple #3
0
        public static void GetKClosestObjectsTest(ISpacePartitioner <TestObject> partitioner)
        {
            TestObject[] objs =
            {
                new TestObject(0,  0),
                new TestObject(10, 0),
                new TestObject(7,  7),
                new TestObject(50, 50)
            };

            for (int i = 0; i < objs.Length; i++)
            {
                partitioner.Add(objs[i]);
            }

            partitioner.Update();

            Transformable[] results = partitioner.GetKClosestObjects(new Vector2f(1, 1), 1);
            HaveSameElements(results, new[] { objs[0] });

            results = partitioner.GetKClosestObjects(new Vector2f(1, 1), 3);
            Assert.IsTrue(HaveSameElements(results, new[] { objs[0], objs[1], objs[2] }));

            results = partitioner.GetKClosestObjects(new Vector2f(51, 51), 3);
            Assert.IsTrue(HaveSameElements(results, new[] { objs[1], objs[2], objs[3] }));

            results = partitioner.GetKClosestObjects(new Vector2f(51, 51), 3, 10f);
            Assert.IsTrue(HaveSameElements(results, new[] { objs[3] }));

#if DEBUG
            AssertThrows <ArgumentException>(
                () => partitioner.GetKClosestObjects(new Vector2f(51, 51), 3, -10f));
#endif

            FastPriorityQueue <ItemNode <TestObject> > resultsQueue = new FastPriorityQueue <ItemNode <TestObject> >(1);
            partitioner.GetKClosestObjects(new Vector2f(1, 1), 1, float.MaxValue, resultsQueue);
            Assert.IsTrue(HaveSameElements(resultsQueue.Select(node => node.Item).ToArray(), new[] { objs[0] }));

            resultsQueue = new FastPriorityQueue <ItemNode <TestObject> >(3);
            partitioner.GetKClosestObjects(new Vector2f(1, 1), 3, float.MaxValue, resultsQueue);
            Assert.IsTrue(HaveSameElements(resultsQueue.Select(node => node.Item).ToArray(), new[] { objs[0], objs[1], objs[2] }));

            resultsQueue = new FastPriorityQueue <ItemNode <TestObject> >(3);
            partitioner.GetKClosestObjects(new Vector2f(51, 51), 3, float.MaxValue, resultsQueue);
            Assert.IsTrue(HaveSameElements(resultsQueue.Select(node => node.Item).ToArray(), new[] { objs[1], objs[2], objs[3] }));

            resultsQueue = new FastPriorityQueue <ItemNode <TestObject> >(3);
            partitioner.GetKClosestObjects(new Vector2f(51, 51), 3, 10f, resultsQueue);
            Assert.IsTrue(HaveSameElements(resultsQueue.Select(node => node.Item).ToArray(), new[] { objs[3] }));

#if DEBUG
            resultsQueue = new FastPriorityQueue <ItemNode <TestObject> >(3);
            AssertThrows <ArgumentException>(
                () => partitioner.GetKClosestObjects(new Vector2f(51, 51), 3, -10f, resultsQueue));
            AssertThrows <ArgumentException>(
                () => partitioner.GetKClosestObjects(new Vector2f(51, 51), 3, 10f, null));
#endif
        }
Exemple #4
0
        public static void GetObjectsInRangeTest(ISpacePartitioner <TestObject> partitioner)
        {
            TestObject[] objs =
            {
                new TestObject(0,  0),
                new TestObject(10, 0),
                new TestObject(7,  7),
                new TestObject(50, 50)
            };

            for (int i = 0; i < objs.Length; i++)
            {
                partitioner.Add(objs[i]);
            }

            partitioner.Update();

            Transformable[] results = partitioner.GetObjectsInRange(new Vector2f(-1, -1), 1);
            Assert.IsTrue(HaveSameElements(results, new Transformable[0]));

            results = partitioner.GetObjectsInRange(new Vector2f(0, 0), 5);
            Assert.IsTrue(HaveSameElements(results, new[] { objs[0] }));

            results = partitioner.GetObjectsInRange(new Vector2f(5, 5), 10);
            Assert.IsTrue(HaveSameElements(results, new[] { objs[0], objs[1], objs[2] }));

            results = partitioner.GetObjectsInRange(new Vector2f(5, 5));
            Assert.IsTrue(HaveSameElements(results, new[] { objs[0], objs[1], objs[2], objs[3] }));

#if DEBUG
            AssertThrows <ArgumentException>(
                () => partitioner.GetObjectsInRange(new Vector2f(0, 0), -5f));
#endif

            List <TestObject> resultsList = new List <TestObject>();
            partitioner.GetObjectsInRange(new Vector2f(-1, -1), 1, resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new TestObject[0]));

            resultsList.Clear();
            partitioner.GetObjectsInRange(new Vector2f(0, 0), 5, resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new[] { objs[0] }));

            resultsList.Clear();
            partitioner.GetObjectsInRange(new Vector2f(5, 5), 10, resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new[] { objs[0], objs[1], objs[2] }));

            resultsList.Clear();
            partitioner.GetObjectsInRange(new Vector2f(5, 5), float.MaxValue, resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new[] { objs[0], objs[1], objs[2], objs[3] }));

#if DEBUG
            AssertThrows <ArgumentException>(
                () => partitioner.GetObjectsInRange(new Vector2f(0, 0), -5f, resultsList));
            AssertThrows <ArgumentException>(
                () => partitioner.GetObjectsInRange(new Vector2f(0, 0), 5f, null));
#endif
        }
Exemple #5
0
        public static void GetObjectsInRectTest(ISpacePartitioner <TestObject> partitioner)
        {
            TestObject[] objs =
            {
                new TestObject(0,  0),
                new TestObject(10, 0),
                new TestObject(7,  7),
                new TestObject(50, 50)
            };

            for (int i = 0; i < objs.Length; i++)
            {
                partitioner.Add(objs[i]);
            }

            partitioner.Update();

            TestObject[] results = partitioner.GetObjectsInRect(new FloatRect(-1, -1, 0, 0));
            Assert.IsTrue(HaveSameElements(results, new TestObject[0]));

            results = partitioner.GetObjectsInRect(new FloatRect(8, -1, 7, 7));
            Assert.IsTrue(HaveSameElements(results, new[] { objs[1] }));

            results = partitioner.GetObjectsInRect(new FloatRect(-1, -1, 15, 20));
            Assert.IsTrue(HaveSameElements(results, new[] { objs[0], objs[1], objs[2] }));

            results = partitioner.GetObjectsInRect(new FloatRect(-1, -1, 60, 60));
            Assert.IsTrue(HaveSameElements(results, new[] { objs[0], objs[1], objs[2], objs[3] }));

            List <TestObject> resultsList = new List <TestObject>();

            partitioner.GetObjectsInRect(new FloatRect(-1, -1, 0, 0), resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new TestObject[0]));

            resultsList.Clear();
            partitioner.GetObjectsInRect(new FloatRect(8, -1, 7, 7), resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new[] { objs[1] }));

            resultsList.Clear();
            partitioner.GetObjectsInRect(new FloatRect(-1, -1, 15, 20), resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new[] { objs[0], objs[1], objs[2] }));

            resultsList.Clear();
            partitioner.GetObjectsInRect(new FloatRect(-1, -1, 60, 60), resultsList);
            Assert.IsTrue(HaveSameElements(resultsList.ToArray(), new[] { objs[0], objs[1], objs[2], objs[3] }));

#if DEBUG
            AssertThrows <ArgumentException>(
                () => partitioner.GetObjectsInRect(new FloatRect(1, 1, 0, 0), null));
#endif
        }
Exemple #6
0
        public void ComponentRemoved(Component component)
        {
            if (component == null)
            {
                return;
            }

            component.OnSceneSet(null);

            if (component.Node == this)
            {
                if (component == SpacePartitioner)
                {
                    SpacePartitioner = null;
                }
            }
        }
Exemple #7
0
        public void ComponentAdded(Component component)
        {
            if (component == null)
            {
                return;
            }

            component.OnSceneSet(this);

            if (component.Node == this)
            {
                if (component is ISpacePartitioner)
                {
                    SpacePartitioner = component as ISpacePartitioner;
                    OnAttachAccumutor(SpacePartitioner);
                }
            }
        }
Exemple #8
0
        public static void AddRemoveTest(ISpacePartitioner <TestObject> partitioner)
        {
            TestObject one    = new TestObject();
            TestObject two    = new TestObject();
            Random     random = new Random();

            Assert.AreEqual(partitioner.Count, 0);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 0);

            partitioner.Add(one);
            Assert.AreEqual(partitioner.Count, 0);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 1);

            partitioner.Add(two);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 2);

            Assert.AreEqual(partitioner.Count, 2);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 2);

            partitioner.Remove(one);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 1);
            partitioner.Remove(two);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 0);

            partitioner.Add(one);
            Assert.AreEqual(partitioner.Count, 0);
            partitioner.Add(two);
            Assert.AreEqual(partitioner.Count, 0);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 2);

            partitioner.Remove(one);
            Assert.AreEqual(partitioner.Count, 2);
            partitioner.Remove(two);
            Assert.AreEqual(partitioner.Count, 2);
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 0);

            // Making sure removing an object not
            // in the partitioner doesn't cause any problems
            partitioner.Add(one);
            partitioner.Remove(two); // Not in partitioner
            partitioner.Update();
            Assert.AreEqual(partitioner.Count, 1);
            partitioner.Remove(one);

            for (int i = 0; i < 100; i++)
            {
                partitioner.Add(new TestObject((float)(random.NextDouble() * 100), (float)(random.NextDouble() * 100)));
            }
            partitioner.Update();
            Assert.AreEqual(100, partitioner.Count);


#if DEBUG
            AssertThrows <ArgumentException>(() => partitioner.Add(null));
            AssertThrows <ArgumentException>(() => partitioner.Remove(null));
#endif
        }