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

/*=============================================================================
                                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; i<SIDES_NUMB; i++)
        rc->bound[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; i<DIMS_NUMB; i++)
        rc.bound[i] = rc.bound[i+DIMS_NUMB] = (REALTYPE) 0;
    return rc;
}

/**
 * Print out the data for a rectangle.
 */
void RTreePrintRect( RTREEMBR *rc, int depth)
{
    int i;

    _RTreeTabIn(depth);
    fprintf (stdout, "mbr: ");
    for (i = 0; i < DIMS_NUMB; i++)
    {
        _RTreeTabIn(depth+1);
        fprintf (stdout, "%f %f ", rc->bound[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[1]);
}

/**
 * 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; i<DIMS_NUMB; i++)
        vol *= (rc->bound[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; i<DIMS_NUMB; i++) {
        double half_extent = (rc->bound[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; i<DIMS_NUMB; i++) {
        REALTYPE face_area = (REALTYPE)1;
        for (j=0; j<DIMS_NUMB; j++)
            /* exclude i extent from product in this dimension */
            if(i != j) {
                REALTYPE j_extent =    rc->bound[j+DIMS_NUMB] - rc->bound[j];
                face_area *= j_extent;
            }
            sum += face_area;
    }
    return 2 * sum;
}

时间: 2024-12-23 19:02:06

RTree源代码——C语言实现(下)的相关文章

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

一.什么是RTree "R树是B树向多维空间发展的另一种形式,它将空间对象按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的所有子结点的区域都落在它的区域范围之内:叶结点的磁盘页中存储其区域范围之内的所有空间对象的外接矩形.每个结点所能拥有的子结点数目有上.下限,下限保证对磁盘空间的有效利用,上限保证每个结点对应一个磁盘页,当插入新的结点导致某结点要求的空间大于一个磁盘页时,该结点一分为二.R树是一种动态索引结构,即:它的查询可与插入或删除同

基于Selenium WebDriver实现多语言环境下自动化截图

TVT 的概念和 TVT 自动化的必要性 概念 翻译验证测试 (Translation Verification Testing,TVT) 是 IBM GSSC 部门为 IBM 的各种产品做本地化 (Localization) 的一个测试环节.众所周知,我们开发出一款产品,需要让全 球各地的用户都能够无障碍的使用,就必须精准的将产品 UI 和相关文档翻译成各种语言,这样不同国家和地区的用户才能 够顺畅使用.TVT 的过程就是一个产品翻译验证测试的过程. 必要性 从字面上看,TVT 是一个比较简单

string-Android应用图标在不同语言模式下如何在launcher中显示不同的名称

问题描述 Android应用图标在不同语言模式下如何在launcher中显示不同的名称 谷歌自带Downloads应用,要在不同的语言模式下显示不同的图标名称,例如:当系统是在中文模式,Downloads应用图标显示的名字是"下载",在英文模式下,应用名称显示的是"downloads",在德文模式下,要显示的名称是"Herunterladen",我在values-de那个目录下的strings.xml文件中修改""Herunt

c++的问题-c++与C语言混合使用下,我想获得这样一个链表

问题描述 c++与C语言混合使用下,我想获得这样一个链表 c++与C语言混合使用下,我想通过输入获得char*字符串的一个链表,但是如下代码构建的链表始终是空字符,这是为什么呢? char* str = (char*)malloc(30); list clist; cout<<"输入list的字符串: "< while(cin>>str) { cout<<str<<endl; clist.push_back(str); } ?fre

tcp/ip详解源代码在ubuntu14.04下编译出错

问题描述 tcp/ip详解源代码在ubuntu14.04下编译出错 源代码下载地址:http://www.kohala.com/start/tcpipiv1.html 毕竟是20年前的代码了.不知道在linux环境下要怎么编译? 解决方案 没有太好的办法,变化太大,只能改,而且如果我没记错那本书好像不是在Linux平台上讲的吧,貌似是Unix之类的 解决方案二: 只能根据错误自己对应的修改了.看错误提示. 解决方案三: 发出错误提示来,一起看看啊

浅析Oracle多语言环境下to_date时间转换

现象:在多语言环境下使用过Oracle的同学想必都遇到过这样一个问题, date_v&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;date;  date_v := to_date('2010/11/16′);–或'2010/11/16′  同一个服务器,不同Oracle clinet 不一定都行得通. 原因: 不指定转换字符串的情况下,Oracle使用既定的格式串进行日期转换操作,执行SELECT * FROM

求大神用通俗语言解析下这个javascript代码以及JS中原型的具体作用。

问题描述 求大神用通俗语言解析下这个javascript代码以及JS中原型的具体作用. window.onload=function () { var oTab=new TabSwitch('div1'); }; function TabSwitch(id) { var oDiv=document.getElementById(id); this.aBtn=oDiv.getElementsByTagName('input'); this.aDiv=oDiv.getElementsByTagNam

算12 三个数 加减乘除-在C语言环境下的算12问题

问题描述 在C语言环境下的算12问题 给定三个数,问你使用加减乘除能否得到12,要求三个数的顺序可以改变,计算的中间结果必须为整数.输入:输入三个整数,均大于0,小于1000.输出:输出为一个整数,当可以得到12时输出1,否则输出0.输入样例:2 2 3输出样例:1提示:输出格式:printf(""%dn""1);主要功能:(1)从文件中读出题目的输入:(2)向屏幕上打印出题目的计算结果. PS:最好能有多文件结构多函数结构,能有界面处理(这些我还不太会,所以只能附

求论坛或购物网站等类似的网站静态页面源代码,有的给下,谢谢!

问题描述 求论坛或购物网站等类似的网站静态页面源代码,有的给下,谢谢!简单复杂的都可以,呵呵!有的好心人,请发到邮箱:jzm7679@sina.cn谢谢!!! 解决方案 解决方案二:论坛推荐www.phpbb.com购物网站推荐www.prestashop.com都是开源的,而且有许多官方插件,供直接下载学习测试.解决方案三:你随便到几个这样的网站,查看代码,保存一下,或直接用"文件"菜单的保存页面.不就行了.