⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 index.c

📁 R+树的c实现源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		break;	if (i==rp->count)             rp = rp->next2;	else break;    }    if (rp==NULL) return 0;    rq = over;    while (rq->next2 != NULL) {	if (rq->next2->count == 1) {	    rp->rect[i] = rq->next2->rect[0];	    rq->next2 = NULL;	    return 1;	}	rq = rq->next2;    }    rq->count --;    rp->rect[i] = rq->rect[rq->count];    if (over->count == NODECARD) {	*node = (struct Node *)myalloc( sizeof( struct Node ) );	for (i=0; i<NODECARD; i++) {	    (*node)->branch[i].rect = rp->rect[i];	    (*node)->branch[i].minrect = IntersectRect( &rp->rect[i], &rect );	    (*node)->branch[i].son = 0;	}	(*node)->count = NODECARD;	(*node)->rect = rect;        (*node)->pageNo = over->pageNo;	(*node)->level = 0;        return 2;     }    else return 1;}/* Add a node to the reinsertion list.  All its branches will later** be reinserted into the index structure.*/ReInsert(n, ee)register struct Node *n;register struct ListNode **ee;{        register struct ListNode *l;        struct ListNode *NewListNode();        l = NewListNode();        l->node = n;        l->next = *ee;        *ee = l;}/* Allocate space for a node in the list used in DeletRect to** store Nodes that are too empty.*/struct ListNode *NewListNode(){        char *myalloc();        return (struct ListNode *) myalloc(sizeof(struct ListNode));}FreeListNode(p)register struct ListNode *p;{        myfree(p);}/* Print out the data in a node.*/TPrintNode(n)struct Node *n;{        int i;        assert(n);                printf("node");                if (n->level == 0)                        printf(" LEAF");                else if (n->level > 0)                        printf(" NONLEAF");                else                        printf(" TYPE=?");                printf("  level=%d  count=%d  page=%d\n", n->level, n->count, n->pageNo);		PrintRectIdent(&n->rect);                for (i=0; i<n->count; i++)                {                        printf("branch %d\n", i);                        PrintBranch(&n->branch[i]);                }}/**********************************************************      relations for intermediate and terminal nodes **********************************************************/Irel(idxp, r1, r2, rel, mode)int idxp;register struct Rect *r1;register struct Rect *r2;char 	*rel;           /* topological or direction relation */char 	*mode;          /* mode of relation: OBJ / MBR */{	int mbr;        if (strcmp(mode,"OBJ")==0)                mbr = 0;        else if (strcmp(mode,"MBR")==0)                mbr = 1;	else	{		fprintf(stderr, "ERROR:\taccepted modes are: OBJ MBR\n");		CloseIndex(idxp, Root);		exit(1);	}	if (strcmp(rel,"OV")==0)		return MyOverlap(r1, r2, NUMDIMS);	else if (strcmp(rel,"DJ")==0)	{		if (mbr==0)			return Disjoint1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"EO")==0)	{		if (mbr==0)			return EOverlap1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"CV")==0)	{		if (mbr==0)			return Cover1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"CN")==0)	{		if (mbr==0)			return Contain1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"EQ")==0)	{		if (mbr==0)			return Equal1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"IN")==0)	{		if (mbr==0)			return Inside1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"CB")==0)	{		if (mbr==0)			return Covered_by1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"MT")==0)	{		if (mbr==0)			return Meet1(r1, r2, NUMDIMS);		else			return MyOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"SN")==0)		return Strong_North1(r1, r2, NUMDIMS);	else if (strcmp(rel,"WN")==0)		return Weak_North1(r1, r2, NUMDIMS);	else if (strcmp(rel,"SBN")==0)		return Strong_Bounded_North1(r1, r2, NUMDIMS);	else if (strcmp(rel,"WBN")==0)		return Weak_Bounded_North1(r1, r2, NUMDIMS);	else if (strcmp(rel,"SNE")==0)		return Strong_NorthEast1(r1, r2, NUMDIMS);	else if (strcmp(rel,"WNE")==0)		return Weak_NorthEast1(r1, r2, NUMDIMS);	else if (strcmp(rel,"SL")==0)		return Same_Level1(r1, r2, NUMDIMS);	else if (strcmp(rel,"SSL")==0)		return Strong_Same_Level1(r1, r2, NUMDIMS);	else if (strcmp(rel,"JN")==0)		return Just_North1(r1, r2, NUMDIMS);	else if (strcmp(rel,"NS")==0)		return North_South1(r1, r2, NUMDIMS);	else if (strcmp(rel,"N")==0)		return North1(r1, r2, NUMDIMS);	else	{		fprintf(stderr, "ERROR:\taccepted topological relations are: OV DJ EO CV CN EQ IN CB MT\n");		fprintf(stderr, "\taccepted direction relations are: SN WN SBN WBN SNE WNE SL SSL JN NS N\n");		CloseIndex(idxp, Root);		exit(1);	}}Trel(idxp, r1, r2, rel, mode)int idxp;register struct Rect *r1;register struct Rect *r2;char 	*rel;           /* topological or direction relation */char 	*mode;          /* mode of relation: OBJ / MBR */{	int mbr;        if (strcmp(mode,"OBJ")==0)                mbr = 0;        else if (strcmp(mode,"MBR")==0)                mbr = 1;	else	{		fprintf(stderr, "ERROR:\taccepted modes are: OBJ MBR\n");		CloseIndex(idxp, Root);		exit(1);	}	if (strcmp(rel,"OV")==0)		return MyOverlap(r1, r2, NUMDIMS);	else if (strcmp(rel,"DJ")==0)	{		if (mbr==0)			return Disjoint2(r1, r2, NUMDIMS);		else			return Disjoint(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"EO")==0)	{		if (mbr==0)			return EOverlap2(r1, r2, NUMDIMS);		else			return EOverlap(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"CV")==0)	{		if (mbr==0)			return Cover2(r1, r2, NUMDIMS);		else			return Cover(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"CN")==0)	{		if (mbr==0)			return Contain2(r1, r2, NUMDIMS);		else			return Contain(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"EQ")==0)	{		if (mbr==0)			return Equal2(r1, r2, NUMDIMS);		else			return Equal(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"IN")==0)	{		if (mbr==0)			return Inside2(r1, r2, NUMDIMS);		else			return Inside(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"CB")==0)	{		if (mbr==0)			return Covered_by2(r1, r2, NUMDIMS);		else			return Covered_by(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"MT")==0)	{		if (mbr==0)			return Meet2(r1, r2, NUMDIMS);		else			return Meet(r1, r2, NUMDIMS);	}	else if (strcmp(rel,"SN")==0)		return Strong_North(r1, r2, NUMDIMS);	else if (strcmp(rel,"WN")==0)		return Weak_North(r1, r2, NUMDIMS);	else if (strcmp(rel,"SBN")==0)		return Strong_Bounded_North(r1, r2, NUMDIMS);	else if (strcmp(rel,"WBN")==0)		return Weak_Bounded_North(r1, r2, NUMDIMS);	else if (strcmp(rel,"SNE")==0)		return Strong_NorthEast(r1, r2, NUMDIMS);	else if (strcmp(rel,"WNE")==0)		return Weak_NorthEast(r1, r2, NUMDIMS);	else if (strcmp(rel,"SL")==0)		return Same_Level(r1, r2, NUMDIMS);	else if (strcmp(rel,"SSL")==0)		return Strong_Same_Level(r1, r2, NUMDIMS);	else if (strcmp(rel,"JN")==0)		return Just_North(r1, r2, NUMDIMS);	else if (strcmp(rel,"NS")==0)		return North_South(r1, r2, NUMDIMS);	else if (strcmp(rel,"N")==0)		return North(r1, r2, NUMDIMS);	else	{		fprintf(stderr, "ERROR:\taccepted topological relations are: OV DJ EO CV CN EQ IN CB MT\n");		fprintf(stderr, "\taccepted direction relations are: SN WN SBN WBN SNE WNE SL SSL JN NS N\n");		CloseIndex(idxp, Root);		exit(1);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -