UNPKG

quadtree2

Version:

JavaScript implementation of quadtree datastructure for collision detection.

299 lines (273 loc) 11.1 kB
var Quadtree2 = require('../../../src/quadtree2'), Vec2 = require('vec2'), assert = require('assert'), should = require('should'); describe('Quadtree2 - e2e - generated', function(){ describe('.getCollidables()', function(){ context('with object in the middle - A', function() { it('should not return all other objects as possible colliding', function() { var qt = new Quadtree2({ 'size' : new Vec2(500, 500), 'objectLimit' : 4 }); var o1 = { pos : new Vec2(472, 276), rad : 8 }; qt.addObject(o1); var o2 = { pos : new Vec2(142, 407), rad : 20 }; qt.addObject(o2); var o3 = { pos : new Vec2(44, 43), rad : 8 }; qt.addObject(o3); var o4 = { pos : new Vec2(437, 46), rad : 12 }; qt.addObject(o4); var o5 = { pos : new Vec2(457, 462), rad : 14 }; qt.addObject(o5); var o6 = { pos : new Vec2(406, 464), rad : 13 }; qt.addObject(o6); var o7 = { pos : new Vec2(409, 414), rad : 20 }; qt.addObject(o7); var o8 = { pos : new Vec2(459, 410), rad : 18 }; qt.addObject(o8); var o9 = { pos : new Vec2(325, 329), rad : 19 }; qt.addObject(o9); var o10 = { pos : new Vec2(250, 251), rad : 11 }; qt.addObject(o10); qt.getCollidables(o10).should.eql({ 3 : o3, 4 : o4, 2 : o2, 9 : o9 }); }); }); context('with object in the middle - B', function() { it('should return correct possible colliding objects', function() { var qt = new Quadtree2({ 'size' : new Vec2(500, 500), 'objectLimit' : 4 }); var o1 = { pos : new Vec2(119, 393.5), rad : 10 }; qt.addObject(o1); var o2 = { pos : new Vec2(333, 429.5), rad : 11 }; qt.addObject(o2); var o3 = { pos : new Vec2(390, 428.5), rad : 13 }; qt.addObject(o3); var o4 = { pos : new Vec2(397, 95.5), rad : 14 }; qt.addObject(o4); var o5 = { pos : new Vec2(373, 71.5), rad : 7 }; qt.addObject(o5); var o6 = { pos : new Vec2(28, 64.5), rad : 2 }; qt.addObject(o6); var o7 = { pos : new Vec2(251, 251.5), rad : 20 }; qt.addObject(o7); qt.getCollidables(o7).should.eql({ 1 : o1, 2 : o2, 3 : o3, 4 : o4, 5 : o5, 6 : o6 }); }); }); context('with object in the middle - C', function() { it('should return all the possible colliding objects', function() { var qt = new Quadtree2({ 'size' : new Vec2(500, 500), 'objectLimit' : 4 }); var o1 = { pos : new Vec2(99, 75.5), rad : 20 }; qt.addObject(o1); var o2 = { pos : new Vec2(397, 76.5), rad : 19 }; qt.addObject(o2); var o3 = { pos : new Vec2(139, 372.5), rad : 15 }; qt.addObject(o3); var o4 = { pos : new Vec2(425, 427.5), rad : 11 }; qt.addObject(o4); var o5 = { pos : new Vec2(439, 339.5), rad : 7 }; qt.addObject(o5); var o6 = { pos : new Vec2(251, 251.5), rad : 9 }; qt.addObject(o6); var o7 = { pos : new Vec2(287, 337.5), rad : 20 }; qt.addObject(o7); var o8 = { pos : new Vec2(335, 294.5), rad : 17 }; qt.addObject(o8); qt.getCollidables(o6).should.eql({ 1 : o1, 2 : o2, 3 : o3, 7 : o7, 8 : o8 }); }); }); context('with object in the middle - D', function() { it('should refactor itself', function() { var qt = new Quadtree2({ 'size' : new Vec2(500, 500), 'objectLimit' : 4 }); var o1 = { pos : new Vec2(106, 80.5), rad : 7 }; qt.addObject(o1); var o2 = { pos : new Vec2(345, 86.5), rad : 6 }; qt.addObject(o2); var o3 = { pos : new Vec2(102, 473.5), rad : 2 }; qt.addObject(o3); var o4 = { pos : new Vec2(397, 473.5), rad : 11 }; qt.addObject(o4); var o5 = { pos : new Vec2(425, 441.5), rad : 15 }; qt.addObject(o5); var o6 = { pos : new Vec2(250, 251.5), rad : 20 }; qt.addObject(o6); var o7 = { pos : new Vec2(274, 343.5), rad : 6 }; qt.addObject(o7); var o8 = { pos : new Vec2(326, 340.5), rad : 17 }; qt.addObject(o8); var o9 = { pos : new Vec2(338, 301.5), rad : 20 }; qt.addObject(o9); qt.getCollidables(o6).should.eql({ 1 : o1, 2 : o2, 3 : o3, 7 : o7, 8 : o8, 9 : o9 }); }); }); context('with moving objects', function() { it('should refactor itself', function() { var qt = new Quadtree2({ 'size' : new Vec2(500, 500), 'objectLimit' : 4 }); var o1 = { pos : new Vec2(37, 413.5), rad : 4 }; qt.addObject(o1); var o2 = { pos : new Vec2(27, 302.5), rad : 12 }; qt.addObject(o2); var o3 = { pos : new Vec2(185, 320.5), rad : 10 }; qt.addObject(o3); var o4 = { pos : new Vec2(118, 464.5), rad : 12 }; qt.addObject(o4); var o5 = { pos : new Vec2(277, 441.5), rad : 2 }; qt.addObject(o5); var o6 = { pos : new Vec2(364, 191.5), rad : 19 }; qt.addObject(o6); var o7 = { pos : new Vec2(285, 58.5), rad : 14 }; qt.addObject(o7); var o8 = { pos : new Vec2(143, 58.5), rad : 5 }; qt.addObject(o8); var o9 = { pos : new Vec2(51, 101.5), rad : 18 }; qt.addObject(o9); var o10 = { pos : new Vec2(104, 204.5), rad : 9 }; qt.addObject(o10); var o11 = { pos : new Vec2(186, 194.5), rad : 18 }; qt.addObject(o11); var o12 = { pos : new Vec2(386, 316.5), rad : 18 }; qt.addObject(o12); var o13 = { pos : new Vec2(488, 418.5), rad : 20 }; qt.addObject(o13); var o14 = { pos : new Vec2(370, 455.5), rad : 3 }; qt.addObject(o14); o12.pos = new Vec2(394, 333.5); o12.pos = new Vec2(394, 333.5); qt.updateObject(o12); o12.pos = new Vec2(394, 334.5); o12.pos = new Vec2(393, 335.5); o12.pos = new Vec2(392, 337.5); qt.updateObject(o12); o12.pos = new Vec2(391, 338.5); o12.pos = new Vec2(390, 339.5); o12.pos = new Vec2(388, 341.5); o12.pos = new Vec2(386, 343.5); o12.pos = new Vec2(384, 343.5); o12.pos = new Vec2(379, 347.5); o12.pos = new Vec2(372, 348.5); o12.pos = new Vec2(368, 350.5); qt.updateObject(o12); o12.pos = new Vec2(364, 352.5); o12.pos = new Vec2(362, 352.5); o12.pos = new Vec2(362, 353.5); o12.pos = new Vec2(360, 353.5); o12.pos = new Vec2(358, 355.5); o12.pos = new Vec2(354, 358.5); o12.pos = new Vec2(350, 361.5); qt.updateObject(o12); o12.pos = new Vec2(343, 364.5); o12.pos = new Vec2(331, 368.5); o12.pos = new Vec2(319, 372.5); o12.pos = new Vec2(307, 376.5); o12.pos = new Vec2(295, 379.5); o12.pos = new Vec2(284, 383.5); o12.pos = new Vec2(275, 387.5); o12.pos = new Vec2(271, 387.5); qt.updateObject(o12); o12.pos = new Vec2(267, 387.5); o12.pos = new Vec2(263, 388.5); o12.pos = new Vec2(261, 388.5); o12.pos = new Vec2(256, 388.5); o12.pos = new Vec2(251, 388.5); o12.pos = new Vec2(244, 388.5); o12.pos = new Vec2(238, 388.5); qt.updateObject(o12); o12.pos = new Vec2(232, 388.5); o12.pos = new Vec2(225, 388.5); o12.pos = new Vec2(217, 388.5); o12.pos = new Vec2(210, 390.5); o12.pos = new Vec2(205, 390.5); o12.pos = new Vec2(204, 390.5); o12.pos = new Vec2(203, 390.5); qt.updateObject(o12); o12.pos = new Vec2(202, 390.5); o12.pos = new Vec2(201, 390.5); qt.updateObject(o12); o12.pos = new Vec2(200, 390.5); o12.pos = new Vec2(199, 390.5); qt.updateObject(o12); o12.pos = new Vec2(201, 390.5); o12.pos = new Vec2(202, 390.5); o12.pos = new Vec2(203, 390.5); o12.pos = new Vec2(206, 389.5); qt.updateObject(o12); o12.pos = new Vec2(209, 388.5); o12.pos = new Vec2(216, 386.5); o12.pos = new Vec2(229, 383.5); o12.pos = new Vec2(244, 380.5); o12.pos = new Vec2(259, 373.5); o12.pos = new Vec2(276, 368.5); o12.pos = new Vec2(293, 362.5); o12.pos = new Vec2(312, 355.5); qt.updateObject(o12); o12.pos = new Vec2(329, 348.5); o12.pos = new Vec2(340, 346.5); o12.pos = new Vec2(351, 343.5); o12.pos = new Vec2(358, 340.5); o12.pos = new Vec2(359, 340.5); qt.updateObject(o12); qt.getCollidables(o3).should.eql({ 1 : o1, 2 : o2, 4 : o4 }); }); }); context('with moving objects on quadrant corners', function() { it('should not remove necessary quadrant', function() { var qt = new Quadtree2({ 'size' : new Vec2(500, 500), 'objectLimit' : 4 }); var o1 = { pos : new Vec2(300, 463.79999542), rad : 16 }; qt.addObject(o1); var o2 = { pos : new Vec2(314, 328.79999542), rad : 4 }; qt.addObject(o2); var o3 = { pos : new Vec2(170, 322.79999542), rad : 6 }; qt.addObject(o3); var o4 = { pos : new Vec2(170, 440.79999542), rad : 3 }; qt.addObject(o4); var o5 = { pos : new Vec2(424, 461.79999542), rad : 4 }; qt.addObject(o5); var o6 = { pos : new Vec2(439, 325.79999542), rad : 18 }; qt.addObject(o6); var o7 = { pos : new Vec2(40, 306.79999542), rad : 14 }; qt.addObject(o7); var o8 = { pos : new Vec2(36, 443.79999542), rad : 4 }; qt.addObject(o8); var o9 = { pos : new Vec2(181, 41.79999542), rad : 17 }; qt.addObject(o9); var o10 = { pos : new Vec2(59, 42.79999542), rad : 13 }; qt.addObject(o10); var o11 = { pos : new Vec2(33, 116.79999542), rad : 17 }; qt.addObject(o11); var o12 = { pos : new Vec2(318, 25.79999542), rad : 7 }; qt.addObject(o12); var o13 = { pos : new Vec2(440, 30.79999542), rad : 2 }; qt.addObject(o13); var o14 = { pos : new Vec2(477, 130.79999542), rad : 1 }; qt.addObject(o14); o9.pos = new Vec2(250, 100); qt.updateObject(o9); var o15 = { pos : new Vec2(385, 39), rad : 17 }; qt.addObject(o15); o9.pos = new Vec2(250, 270); qt.updateObject(o9); qt.getCollidables(o9).should.eql({ 2 : o2, 3 : o3 }); o9.pos = new Vec2(250, 265); qt.updateObject(o9); qt.getCollidables(o9).should.eql({ 2 : o2, 3 : o3, 10 : o10, 11 : o11 }); o9.pos = new Vec2(250, 264.79999542); qt.updateObject(o9); qt.getCollidables(o9).should.eql({ 2 : o2, 3 : o3, 10 : o10, 11 : o11 }); }); }); }); });