C语言实现一个四叉树(quadtree)

用C语言实现一个2维四叉树quadtree,具有一定的实际意义。你可以把几何图形的索引(用long型的id标识)放到这个树中(根据最小边界矩形)。quadtree可以用来快速区域查找图形,虽然不是那么精确,但是毕竟没有漏掉的。虽然quadtree的效率不如RTree?但是RTree的实现毕竟复杂了些,我会尽快收集整理出RTree的代码。RTree确实比QuadTree好的多?(起码RTree很时髦啊!)

头文件如下:

/*
 * quadtree.h
 *        Quad tree structure -- for spatial quick searching
 *        cheungmine
 *      Oct. 5, 2007.  All rights reserved.
 */
#ifndef QUADTREE_H_INCLUDED
#define QUADTREE_H_INCLUDED

#include "unistd.h"

#include "list.h"

#define QUAD_SUBNODES 4

#define QBOX_OVERLAP_MAX 0.4
#define QBOX_OVERLAP_MIN 0.02

#define QTREE_DEPTH_MAX 8
#define QTREE_DEPTH_MIN 4

#define QUADRANT_BITS  3

/* a quadrant defined below:

        NW(1)   |    NE(0)
        -----------|-----------
        SW(2)   |    SE(3)
*/
typedef enum
{
    NE = 0,
    NW = 1,
    SW = 2,
    SE = 3
}QuadrantEnum;

/* a box defined below:
           _____max
          |__|__|
          |__|__|
   min
*/
typedef struct _quadbox_t
{   
    double _xmin,
        _ymin,
        _xmax,
        _ymax;
}quadbox_t;

/* quad node */
typedef struct _quadnode_t
{
    quadbox_t  _box;  /* node bound box */
    list_t   *_lst;  /* node data list */
    struct _quadnode_t  *_sub[QUAD_SUBNODES];  /* pointer to subnodes of this node */
}quadnode_t;

/* quad tree */
typedef struct _quadtree_t
{
    quadnode_t *_root;
    int    _depth;  /* max depth of tree: 0-based */
    float   _overlap;  /* overlapped ratio of quanbox */
}quadtree_t;

/*=============================================================================
                        Public Functions
=============================================================================*/
/* creates a quadtree and returns a pointer to it */
extern  quadtree_t*
quadtree_create (quadbox_t    box,
                 int  depth,  /* 4~8 */
                 float overlap /* 0.02 ~ 0.4 */
                 );

/* destroys a quad tree and free all memory */
extern  void
quadtree_destroy (IN  quadtree_t  *qtree
                  );

/* inserts a node identified by node_key into a quadtree, returns the node quadtree encoding */
extern  quadnode_t *
quadtree_insert (IN  quadtree_t            *qtree,
                 IN  long                 node_key,
                 IN  quadbox_t            *node_box
                 );

/* searches nodes inside search_box */
extern  void
quadtree_search (IN  const quadtree_t    *qtree,
                  IN  quadbox_t            *search_box,
                 OUT list_t                *results_list
                 );

#endif // QUADTREE_H_INCLUDED

时间: 2024-11-08 22:21:56

C语言实现一个四叉树(quadtree)的相关文章

erilog-用verilong语言编写一个走马灯的代码

问题描述 用verilong语言编写一个走马灯的代码 多模式LED发光控制器(Basys3)1)采用16个并排LED实现跑马灯发光器件:2)具有异步复位功能(按钮),复位时,LED全亮:3)模式选择(利用两位滑动开关):00-左循环跑马灯,01-右循环跑马灯,10-交叉闪烁跑马灯,11-全亮全灭闪烁4)速度选择(利用两位滑动开关):通过00-11实现四个速度等级的闪烁效果 解决方案 参考http://download.csdn.net/detail/xkdhdl/1745598http://ww

c语言-C语言的一个程序,求大神

问题描述 C语言的一个程序,求大神 三.实验内容 1.实验题目:手动输入10个0~100之内的整数,按从小到大排列输出.: (1)要求 排序算法: 使数组从小到大排序的规则如下: ⑴ 设数组为a[0],a[1],-,a[n-1],构造i循环从0,1,-,n-2变化,构造j循环从i+1,i+2,-,n-1变化,即j>i. ⑵ 对于任何一个a[i],如果a[i]>a[j],表面前面有一个元素a[i]比它后面的元素a[j]大,a[i]应该在后面,a[j]应该在前面,交换a[i]与a[j]. ⑶ 对于

用c语言做一个学籍系统登陆界面,求源代码

问题描述 用c语言做一个学籍系统登陆界面,求源代码 请问我要用c语言做一个学籍系统登陆界面咋做,有没有源代码,格式如下: ****************学生学籍管理系统**************** 1,注册 2,登陆 3,修改密码 0,退出系统 请选择0~3 解决方案 http://www.docin.com/p-565175373.htmlhttp://wenku.baidu.com/link?url=k0FVy3GjeXwWYcZsHz3X5ir_qGRBS_OElVg5XDcTydD

中文字符-如何用C语言编写一个简单的输入法程序,要求可以输入汉字。

问题描述 如何用C语言编写一个简单的输入法程序,要求可以输入汉字. 不太清楚汉字在计算机中是如何存储的,想知道例如微软的智能ABC以及搜狗输入法是怎样实现拼音拼写下的汉字输入. 解决方案 首先要有一个汉字的编码库,比如GB2312编写的是拼音输入法的话,还要建立一个拼音与汉字对应的数据库然后根据用户输入的拼音,提示出对应的汉字(汉字的优先顺序由数据库决定,同时还可以学习该用户的使用习惯)如果输入法还支持智能联想输入的话,还要加入词库(也有优先级),这样可以根据前一个字来推断出下一个可能的字 解决

c语言的一个问题,请大牛帮忙看看,感激不尽

问题描述 c语言的一个问题,请大牛帮忙看看,感激不尽 我写的一个小程序: #include #include #include void main(){ pid_t pid; int i; for(i=1; i<2; i++) { pid = fork(); if(pid == 0 || pid < 0) break; } //pid = fork(); if(pid == 0){ printf("this is child process! "); char *s; in

C语言实现一个简单的单向链表list

用C语言实现一个简单实用的单向链表list,具有一定的实际意义.尤其我们不想使用STL里面的list<...>类的时候.我实现的这个list,结点存储任何调用者分配的任意类型的数据(void*).这个list适用于一些简单的场合,消耗极少的资源. 头文件: /* * list.h * Generic sequential linked list node structure -- can hold any type data. * cheungmine * Sep. 22, 2007. All

c语言-C语言的一个小问题 求解答

问题描述 C语言的一个小问题 求解答 计算机问题求解答">如题 我的代码是这样 #includeint main(){ double xy; printf(""输入数据:""); scanf(""%lf""&x); if(x<1) y=x;else if(x>=1&&x<=10) y=2*x-1;else if(x>10) y=3*x-11;printf(&quo

c语言-C语言编写一个输出的函数

问题描述 C语言编写一个输出的函数 编写一个函数,输出数组,要求通过参数指定每行输出的元素个数,以 及每个元素占有的列数. 假设自己定义一个参数为x 那么打印的时候printf(""%xd"")怎么用一个参数来满足每次打印时候 元素所占列数的不同呢 解决方案 #include <stdio.h>void display(int data[] int n int cols int w){ for (int i = 0; i < n; i++) { p

写入时冲突-用c语言建立一个顺序表,并且对表进行操作

问题描述 用c语言建立一个顺序表,并且对表进行操作 写了个小程序,目的要求:用c语言建立一个顺序表,表中元素为学生,每个学生信息包含姓名.学号和成绩三部分,对该表实现:① 输出.② 插入.③ 删除.④ 查找功能,并计算出平均成绩和总成绩 感觉我的代码没什么问题,编译也正常通过,但是每次运行都会出现这样的问题,不知道是什么原因,希望又高手能帮忙解答下,谢了 #include#include void chu(int a); void zhao(int a);void cha(int a); voi