// Divides the game arena into 4 quadrants and call initialize for each of them void board::initializeBoard(){ int ratio = 10; initializeQuadrant(leftTop, 0, 0, ratio); initializeQuadrant(rightTop, 500, 0, ratio); initializeQuadrant(leftBottom, 0, 500, ratio); initializeQuadrant(rightBottom, 500, 500, ratio); }
void initializeQuadtree(QuadTree* quadtree, const Box2D& worldBounds, unsigned int depth, unsigned int maxResultsPerQuery, unsigned int maxQuadrants, Quadrant* quadrants, QuadrantEdges* quadrantEdges) { quadtree->worldBounds = worldBounds; quadtree->maxDepth = depth; quadtree->maxResultsPerQuery = maxResultsPerQuery; quadtree->maxQuadrants = maxQuadrants; quadtree->quadrants = quadrants; quadtree->quadrantsEdges = quadrantEdges; quadtree->numQuadrantEdges = 0; #ifdef _DEBUG quadtree->numCollisionChecks = 0; quadtree->maxEdgesPerQuadrantInUse = 0; quadtree->maxResultsPerQueryInUse = 0; #endif quadtree->totalNumQuadrants = 0; for (unsigned int i = 0; i < quadtree->maxDepth; i++) { unsigned int numQuadrants = (unsigned int)pow(4.0f, (int)i); if (i == quadtree->maxDepth - 1) { quadtree->numLeafQuadrants = numQuadrants; } quadtree->totalNumQuadrants += numQuadrants; } initializeQuadrant(quadtree, worldBounds); }
void initializeQuadrant(QuadTree* quadtree, const Box2D& quadrantBounds, unsigned int depth, unsigned int index, unsigned int offset, unsigned int levelWidth) { unsigned int i = offset + index; // FIXME: checking boundaries if (i >= quadtree->maxQuadrants) { throw std::exception("max. quadrants overflow"); } Quadrant& quadrant = quadtree->quadrants[i]; quadrant.depth = depth; quadrant.bounds = quadrantBounds; if (depth == quadtree->maxDepth - 1) // leaf { quadrant.edges = quadtree->numQuadrantEdges++; return; } unsigned int baseIndex = (index * 4); unsigned int newOffset = offset + levelWidth; unsigned int newLevelWidth = levelWidth * 4; unsigned int newDepth = depth + 1; vml_vec2 subQuadrantSize = quadrantBounds.getExtents() / 2.0f; for (unsigned int y = 0, i = 0; y < 2; y++) { float subQuadrantY = quadrantBounds.min.y + ((float)y * subQuadrantSize.y); for (unsigned int x = 0; x < 2; x++, i++) { initializeQuadrant(quadtree, Box2D(quadrantBounds.min.x + ((float)x * subQuadrantSize.x), subQuadrantY, subQuadrantSize.x, subQuadrantSize.y), newDepth, baseIndex + i, newOffset, newLevelWidth); } } }