82 lines
2.1 KiB
C
82 lines
2.1 KiB
C
|
#ifndef __RTREE_PRIVATE_H__
|
||
|
#define __RTREE_PRIVATE_H__ 1
|
||
|
|
||
|
#include "udi_common.h"
|
||
|
|
||
|
#define NUMDIMS 2 /* we will work in 2d changing this will
|
||
|
break some functions */
|
||
|
|
||
|
// Do not kown where it is defined but I need it
|
||
|
extern int Yap_page_size;
|
||
|
#define MAXCARD (int)((Yap_page_size-(2*sizeof(int)))/ sizeof(struct Branch))
|
||
|
#define MINCARD (MAXCARD / 2)
|
||
|
|
||
|
struct Rect
|
||
|
{
|
||
|
double coords[2*NUMDIMS]; /* x1min, y1min, ... , x1max, y1max, ...*/
|
||
|
};
|
||
|
typedef struct Rect rect_t;
|
||
|
|
||
|
typedef size_t index_t;
|
||
|
|
||
|
struct Branch
|
||
|
{
|
||
|
rect_t mbr;
|
||
|
void * child; /*void * so user can store whatever he needs, in case
|
||
|
of non-leaf ndes it stores the child-pointer*/
|
||
|
};
|
||
|
typedef struct Branch branch_t;
|
||
|
|
||
|
struct Node
|
||
|
{
|
||
|
int count;
|
||
|
int level;
|
||
|
branch_t branch[FLEXIBLE_SIZE];
|
||
|
};
|
||
|
typedef struct Node * node_t;
|
||
|
#define SIZEOF_NODE SIZEOF_FLEXIBLE(struct Node, branch, MAXCARD)
|
||
|
|
||
|
typedef node_t rtree_t;
|
||
|
|
||
|
struct Partition
|
||
|
{
|
||
|
int n;
|
||
|
rect_t cover_all;
|
||
|
rect_t cover[2];
|
||
|
branch_t buffer[FLEXIBLE_SIZE];
|
||
|
};
|
||
|
typedef struct Partition * partition_t;
|
||
|
#define SIZEOF_PARTITION SIZEOF_FLEXIBLE(struct Partition, buffer, MAXCARD + 1)
|
||
|
|
||
|
/* #define ALIGN(addr, size) (((addr)+(size-1))&(~(size-1))) */
|
||
|
|
||
|
#include "rtree.h"
|
||
|
|
||
|
static node_t RTreeNewNode (void);
|
||
|
static void RTreeDestroyNode (node_t);
|
||
|
static void RTreeNodeInit (node_t);
|
||
|
|
||
|
static int RTreeSearchNode (node_t, rect_t, SearchHitCallback, void *);
|
||
|
static int RTreeInsertNode (node_t, int, rect_t,void *,node_t *);
|
||
|
|
||
|
static int RTreePickBranch (rect_t, node_t);
|
||
|
static int RTreeAddBranch(node_t, branch_t, node_t *);
|
||
|
static void RTreeSplitNode (node_t, branch_t, node_t *);
|
||
|
|
||
|
static void RTreePickSeeds(partition_t, node_t, node_t);
|
||
|
static void RTreeNodeAddBranch(rect_t *, node_t, branch_t);
|
||
|
static void RTreePickNext(partition_t, node_t, node_t);
|
||
|
|
||
|
static rect_t RTreeNodeCover(node_t);
|
||
|
|
||
|
static double RectArea (rect_t);
|
||
|
static rect_t RectCombine (rect_t, rect_t);
|
||
|
static int RectOverlap (rect_t, rect_t);
|
||
|
|
||
|
static partition_t PartitionNew (void);
|
||
|
static void PartitionPush (partition_t, branch_t);
|
||
|
static branch_t PartitionPop (partition_t);
|
||
|
static branch_t PartitionGet (partition_t, int);
|
||
|
|
||
|
#endif /* __RTREE_PRIVATE_H__ */
|