RTree源代码——C 语言实现(下)

2012/6/13 11:08:00  请友读忠(更多)  E界MRP开发下载网  397阅

/*=============================================================================
                                Public functions:
 =============================================================================*/ int RTreeSetNodeMax(int new_max) { return set_max(&NODECARD, new_max); }
int RTreeSetLeafMax(int new_max) { return set_max(&LEAFCARD, new_max); }
int RTreeGetNodeMax(void) { return NODECARD; }
int RTreeGetLeafMax(void) { return LEAFCARD; } /**
 * Initialize a rectangle to have all 0 coordinates.
 *
/void RTreeInitRect( RTREEMBR *rc)
{
    int i;
    for (i=0; ibound[i] = (REALTYPE) 0;
}
/**
 * Return a mbr whose first low side is higher than its opposite side -
 * interpreted as an undefined mbr.
 *
/RTREEMBR RTreeNullRect(void)
{
    RTREEMBR rc;
    int i;     rc.bound[0] = (REALTYPE) 1;
    rc.bound[DIMS_NUMB] = (REALTYPE)-1;
    for (i=1; ibound[i], rc->bound[i + DIMS_NUMB]);
    }
} /**
 * Calculate the 2-dimensional area of a rectangle
 *
/REALTYPE RTreeRectArea( RTREEMBR *rc )
{
    if (INVALID_RECT(rc))
        return (REALTYPE) 0;     return (rc->bound[DIMS_NUMB] - rc->bound[0]) * (rc->bound[DIMS_NUMB+1] - rc->bound);
}
/**
 * Calculate the n-dimensional volume of a rectangle
 *
/REALTYPE RTreeRectVolume( RTREEMBR *rc )
{
    int i;
    REALTYPE vol = (REALTYPE) 1;     if (INVALID_RECT(rc))
        return (REALTYPE) 0;     for(i=0; ibound[i+DIMS_NUMB] - rc->bound[i]);
    assert(vol >= 0.0);
    return vol;
}
/**
 * Precomputed volumes of the unit spheres for the first few dimensions
 *
/const double UnitSphereVolumes[] = {
    0.000000,  /* dimension   0 *
/    2.000000,  /* dimension   1 *
/    3.141593,  /* dimension   2 *
/    4.188790,  /* dimension   3 *
/    4.934802,  /* dimension   4 *
/    5.263789,  /* dimension   5 *
/    5.167713,  /* dimension   6 *
/    4.724766,  /* dimension   7 *
/    4.058712,  /* dimension   8 *
/    3.298509,  /* dimension   9 *
/    2.550164,  /* dimension  10 *
/    1.884104,  /* dimension  11 *
/    1.335263,  /* dimension  12 *
/    0.910629,  /* dimension  13 *
/    0.599265,  /* dimension  14 *
/    0.381443,  /* dimension  15 *
/    0.235331,  /* dimension  16 *
/    0.140981,  /* dimension  17 *
/    0.082146,  /* dimension  18 *
/    0.046622,  /* dimension  19 *
/    0.025807,  /* dimension  20 *
/}; #if DIMS_NUMB > 20
    #error “not enough precomputed sphere volumes“
endif #define UnitSphereVolume UnitSphereVolumes[DIMS_NUMB] /**
 * Calculate the n-dimensional volume of the bounding sphere of a rectangle.
 * The exact volume of the bounding sphere for the given RTREEMBR.
 *
/REALTYPE RTreeRectSphericalVolume( RTREEMBR *rc )
{
    int i;
    double sum_of_squares=0, radius;     if (INVALID_RECT(rc))
        return (REALTYPE) 0;
   
    for (i=0; ibound[i+DIMS_NUMB] - rc->bound[i]) / 2;
        sum_of_squares += half_extent * half_extent;
    }
    radius = sqrt(sum_of_squares);
    return (REALTYPE)(pow(radius, DIMS_NUMB) * UnitSphereVolume);
}
/**
 * Calculate the n-dimensional surface area of a rectangle
 *
/REALTYPE RTreeRectSurfaceArea( RTREEMBR *rc )
{
    int i, j;
    REALTYPE sum = (REALTYPE) 0;     if (INVALID_RECT(rc))
        return (REALTYPE) 0;     for (i=0; ibound[j+DIMS_NUMB] - rc->bound[j];
                face_area *= j_extent;
            }
            sum += face_area;
    }
    return 2 * sum;
}
分享至:
good 17

发表评论

文明评论,重在参与

暂无评论!
返回上级
首页合作客服留言QQ群简版
E界,引领视界
mrpej.com @CopyRight