📄 rtnode.cpp
字号:
// -*- Mode: C++ -*-// RTnode.cpp//// Copyright (c) 1996, Regents of the University of California// $Header: /usr/local/devel/GiST/libGiST/RTree/RTnode.cpp,v 1.1.1.1 1996/08/06 23:47:25 jmh Exp $#include <string.h>#include "RT.h"GiSTnode *RTnode::PickSplit(){ int i; int j; double max = -1, tmp; int seed1 = -1, seed2 = -1; RTkey cover1, cover2, *expand1, *expand2; RTnode *rightnode; RTentry *tmpentry1, *tmpentry2; int rightdeletes = 0, leftdeletes = 0; int *rightvec, *leftvec; // Guttman's poly-time split algorithm // first, pick furthest-distance seeds for (i = 0; i < NumEntries(); i++) for (j = i+1; j < NumEntries(); j++) { tmpentry1 = (RTentry *)((*this)[i].Ptr()); tmpentry2 = (RTentry *)((*this)[j].Ptr()); tmp = ((RTkey)tmpentry1->bbox()).dist(tmpentry2->bbox()); if (tmp > max) { seed1 = i; seed2 = j; max = tmp; } } tmpentry1 = (RTentry *)((*this)[seed1].Ptr()); tmpentry2 = (RTentry *)((*this)[seed2].Ptr()); cover1 = tmpentry1->bbox(); cover2 = tmpentry2->bbox(); // copy current node into rightnode; we'll delete from the nodes // as appropriate rightnode = (RTnode *)Copy(); // now assign entries to the appropriate deletion vectors rightvec = new int[NumEntries()]; leftvec = new int[NumEntries()]; for (i = 0; i < NumEntries(); i++) { if (i == seed1) { rightvec[rightdeletes++] = i; continue; } if (i == seed2) { leftvec[leftdeletes++] = i; continue; } tmpentry1 = (RTentry *)((*this)[i].Ptr()); expand1 = cover1.expand(tmpentry1->bbox()); expand2 = cover2.expand(tmpentry1->bbox()); if (expand2->area() > expand1->area()) leftvec[leftdeletes++] = i; else rightvec[rightdeletes++] = i; delete expand1; delete expand2; } // given the deletion vectors, do bulk deletes DeleteBulk(leftvec, leftdeletes); rightnode->DeleteBulk(rightvec, rightdeletes); delete leftvec; delete rightvec; // Return the right node return rightnode;}GiSTentry * RTnode::Union() const{ RTentry *u = new RTentry; int first = 1; u->InitKey(); for (int i=0; i<NumEntries(); i++) { RTentry *rte = (RTentry*) (*this)[i].Ptr(); if (first || rte->xlower() < u->xlower()) u->setxlower(rte->xlower()); if (first || rte->xupper() > u->xupper()) u->setxupper(rte->xupper()); if (first || rte->ylower() < u->ylower()) u->setylower(rte->ylower()); if (first || rte->yupper() > u->yupper()) u->setyupper(rte->yupper()); first = 0; } return u;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -