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__ */
							 |