Beispiel #1
0
	// 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);
        }
    }
}