UNPKG

quadtree2

Version:

JavaScript implementation of quadtree datastructure for collision detection.

117 lines (89 loc) 4.48 kB
# Quadtree2.js is a Node.js [npm-package][npm] / JavaScript implementation of two dimensional quadtree for collision detection. Exported for client side use with the help of [browserify][browserify]. It is a work in progress, look for the first stable release if interested. [![Build Status][travis-img-src]][travis-a-href] ## Important notes After experimenting around with performance tests, the current implementation does not justify the use in **game projects**. I've started the [grid2.js][github-grid2] project for collision detection and ray casting calculations in two dimensional space. It is not scaling structure, but performs lot better at the moment in browser games. Give it a try, if that is your use case. ## Try it! Visit the projects [GitHub IO Page][github-io] and play around. If you notice incorrect behavior please click on the "Log" button, copy the stuff and post it in the [issues][github-issues] and describe the problem \(or see the [contribute](#contribute) section\). ## About A quadtree is a scaling data structure for collision detection. You can find theory on the [WIKI][wiki]. A simple example usecase would be a two dimensional game, with some moving objects like bullets and players. You want to know when a collision occours. Could easly just compare all the objects position with each other, but if there are a lot of them, that is not the right thing to do. Upon adding objects to the quadtree you either specify the unique number identifier attribute of the objects, like `id`, or the quadtree will do this automatically. ## Install - browser - include the [quadtree2.min.js][minified] - Node.js - `var Vec2 = require('vec2');` - `var Quadtree2 = require('quadtree2');` ## Contribute If you want to submit a bugfix, push a test for it as well \(should fail without the fix\). - test with mocha \(after `npm install`\) `grunt test` or `grunt watch` if you want to run the tests on every change in source files - test with browser by opening the index.html - build it with `grunt` If you've played around on the [GitHub IO Page][github-io] and noticed some incorrect behavior click on the "Log" button, copy the code and create a test case in the [test/demos.js][test-demo] file. I'm glad for just a test without any fix as well. Please follow the [git flow][gitflow] branching model. ## Use ```javascript var // Variable to save the collisions alicesCollisions, bobsCollisions, bobsDeadlyCollisions, // This will initialize a quadtree with a 100x100 resolution, // with an object limit of 3 inside a quadrant. quadtree = new Quadtree2(new Vec2(100, 100), 3), // Alice will be staying fierce in the top left ... alice = { pos_ : new Vec2(20, 20), rad_ : 3 }, // ... with his rocket luncher, gonna try to shoot bob ... rocket = { pos_ : new Vec2(20, 20), rad_ : 5 }, // ... however there is a bunker on the field ... bunker = { pos_ : new Vec2(50, 50), rad_ : 10 }, // ... will it save bob? bob = { pos_ : new Vec2(80, 80), rad_ : 3 }; // Add all of our beloved character to the quadtree. quadtree.addObjects([alice, rocket, bunker, bob]); // On the start Alice collides with her own rocket. alicesCollisions = quadtree.getCollisionsForObject(alice); // Object.keys(alicesCollisions).length; // >> 1; // Bob is just sitting and waiting. bobsCollisions = quadtree.getCollisionsForObject(bob); // Object.keys(bobsCollisions).length; // >> 0; // The rocket flys over to bob rocket.pos_.x = 78; rocket.pos_.y = 78; // Update our data structure quadtree.updateObject(rocket); // Lets get the deadly hit bobsDeadlyCollisions = quadtree.getCollisionsForObject(bob); // Object.keys(bobsDeadlyCollisions).length; // >> 1; ``` ## License [MIT License][git-LICENSE] [git-LICENSE]: LICENSE [travis-img-src]: https://travis-ci.org/p1100i/quadtree2.js.png?branch=master [travis-a-href]: https://travis-ci.org/p1100i/quadtree2.js [minified]: https://github.com/p1100i/quadtree2.js/blob/master/quadtree2.min.js [wiki]: http://en.wikipedia.org/wiki/Quadtree [browserify]: http://browserify.org/ [gitflow]: https://github.com/nvie/gitflow [github-io]: http://p1100i.github.io/quadtree2.js [github-issues]: https://github.com/p1100i/quadtree2.js/issues [github-grid2]: https://github.com/p1100i/grid2.js [test-demo]: test/demos.js [npm]: https://www.npmjs.org/package/quadtree2