int main(int argc, char *argv[]) { params_t params; int rc = EXIT_SUCCESS; cmdline_parse(¶ms, argc, argv); printf("********************************************************************************\n"); printf("sd (%d.%d.%d) Copyright 2011, GK.\n", VER_MAJOR, VER_MINOR, VER_SUBMINOR); printf(" nnbrs=%d, minsim=%.2f\n", params.nnbrs, params.minsim); gk_clearwctimer(params.timer_global); gk_clearwctimer(params.timer_1); gk_clearwctimer(params.timer_2); gk_clearwctimer(params.timer_3); gk_clearwctimer(params.timer_4); gk_startwctimer(params.timer_global); ComputeNeighbors(¶ms); gk_stopwctimer(params.timer_global); printf(" wclock: %.2lfs\n", gk_getwctimer(params.timer_global)); printf(" timer1: %.2lfs\n", gk_getwctimer(params.timer_1)); printf(" timer2: %.2lfs\n", gk_getwctimer(params.timer_2)); printf(" timer3: %.2lfs\n", gk_getwctimer(params.timer_3)); printf(" timer4: %.2lfs\n", gk_getwctimer(params.timer_4)); printf("********************************************************************************\n"); exit(rc); }
void SpatialGraph::ComputeNeighbors( SpatialGraphKDNode* node ) { if( node->HasChildren() ) { ComputeNeighbors(node->LHC); ComputeNeighbors(node->RHC); return; } Vector2 checkN = Vector2::UnitY * _smallestDimensions.Y; Vector2 checkS = Vector2::UnitY * -_smallestDimensions.Y; Vector2 checkE = Vector2::UnitX * _smallestDimensions.X; Vector2 checkW = Vector2::UnitX * -_smallestDimensions.X; /* Vector2 centroid = */ node->BBox.Centroid(); Vector2List gridPoints; int xPoints, yPoints; node->GetGridPoints(gridPoints, xPoints, yPoints ); //Check north neighbors for( int i = 0; i < xPoints; i++ ) { AddNeighbor( node, gridPoints[GetColumnMajorIndex(i,0,xPoints)] + checkN ); } //Check south neighbors for( int i = 0; i < xPoints; i++ ) { AddNeighbor( node, gridPoints[GetColumnMajorIndex(i,yPoints-1,xPoints)] + checkS ); } //Check east neighbors for( int i = 0; i < yPoints; i++ ) { AddNeighbor( node, gridPoints[GetColumnMajorIndex(xPoints-1,i,xPoints)] + checkE ); } //Check west neighbors for( int i = 0; i < yPoints; i++ ) { AddNeighbor( node, gridPoints[GetColumnMajorIndex(0,i,xPoints)] + checkW ); } }
SpatialGraph::SpatialGraph(float entityWidth, const BoundingBox& startBox ) { _entityWidth = entityWidth; float maxDimension = MathUtil::Max( startBox.Max.Y - startBox.Min.Y, startBox.Max.X - startBox.Min.X ); int depth = 0; while( maxDimension > _entityWidth ) { maxDimension /= 2.0f; depth += 2; } _depth = MathUtil::Max(depth,1); if( _depth > 24 ) _depth = 24; int depthMask = ~(0xFFFFFFFF << _depth); _dirMasks[0] = 0x1; _dirMasks[1] = 0x2; _dirMasks[2] = 0xaaaaaaaa & depthMask; _dirMasks[3] = _dirMasks[2] >> 1; _root = CreateTree(_depth+1, startBox, NULL); //Get smallest dimension _smallestDimensions = startBox.Max - startBox.Min; for( int i = 0; i < _depth; i++ ) { if( i % 2 ) _smallestDimensions.Y *= 0.5f; else _smallestDimensions.X *= 0.5f; } ComputeNeighbors( _root ); ValidateNeighbors( _root ); }