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

📄 nodebase.cpp

📁 在Linux下做的QuadTree的程序
💻 CPP
字号:
/********************************************************************** * $Id: NodeBase.cpp 1820 2006-09-06 16:54:23Z mloskot $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2006 Refractions Research Inc. * Copyright (C) 2001-2002 Vivid Solutions Inc. * * This is free software; you can redistribute and/or modify it under * the terms of the GNU Lesser General Public Licence as published * by the Free Software Foundation.  * See the COPYING file for more information. * **********************************************************************/#include <geos/index/quadtree/NodeBase.h> #include <geos/index/quadtree/Node.h> #include <geos/index/ItemVisitor.h> #include <geos/geom/Envelope.h>#include <geos/geom/Coordinate.h>#include <sstream>#include <vector>#include <algorithm>#ifndef GEOS_DEBUG#define GEOS_DEBUG 0#endif#if GEOS_DEBUG#include <iostream>#endifusing namespace std;using namespace geos::geom;namespace geos {namespace index { // geos.indexnamespace quadtree { // geos.index.quadtreeintNodeBase::getSubnodeIndex(const Envelope *env, const Coordinate& centre){	int subnodeIndex=-1;	if (env->getMinX()>=centre.x) {		if (env->getMinY()>=centre.y) subnodeIndex=3;		if (env->getMaxY()<=centre.y) subnodeIndex=1;	}	if (env->getMaxX()<=centre.x) {		if (env->getMinY()>=centre.y) subnodeIndex=2;		if (env->getMaxY()<=centre.y) subnodeIndex=0;	}#if GEOS_DEBUG	cerr<<"getSubNodeIndex("<<env->toString()<<", "<<centre.toString()<<") returning "<<subnodeIndex<<endl;#endif	return subnodeIndex;}NodeBase::NodeBase() {	items=new vector<void*>();	subnode[0]=NULL;	subnode[1]=NULL;	subnode[2]=NULL;	subnode[3]=NULL;}NodeBase::~NodeBase() {	delete subnode[0];	delete subnode[1];	delete subnode[2];	delete subnode[3];	subnode[0]=NULL;	subnode[1]=NULL;	subnode[2]=NULL;	subnode[3]=NULL;	delete items;}vector<void*>* NodeBase::getItems() {	return items;}void NodeBase::add(void* item) {	items->push_back(item);	//GEOS_DEBUG itemCount++;	//GEOS_DEBUG System.out.print(itemCount);}vector<void*>*NodeBase::addAllItems(vector<void*> *resultItems){	//<<TODO:ASSERT?>> Can we assert that this node cannot have both items	//and subnodes? [Jon Aquino]	resultItems->insert(resultItems->end(),items->begin(),items->end());	for(int i=0;i<4;i++) {		if (subnode[i]!=NULL) {			subnode[i]->addAllItems(resultItems);		}	}	return resultItems;}voidNodeBase::addAllItemsFromOverlapping(const Envelope *searchEnv, vector<void*> *resultItems){	if (!isSearchMatch(searchEnv))		return;	//<<TODO:ASSERT?>> Can we assert that this node cannot have both items	//and subnodes? [Jon Aquino]	resultItems->insert(resultItems->end(),items->begin(),items->end());	for(int i=0;i<4;i++) {		if (subnode[i]!=NULL) {			subnode[i]->addAllItemsFromOverlapping(searchEnv,resultItems);		}	}}//<<TODO:RENAME?>> In Samet's terminology, I think what we're returning here is//actually level+1 rather than depth. (See p. 4 of his book) [Jon Aquino]int NodeBase::depth() {	int maxSubDepth=0;	for(int i=0;i<4;i++) {		if (subnode[i]!=NULL) {			int sqd=subnode[i]->depth();			if (sqd>maxSubDepth)				maxSubDepth=sqd;		}	}	return maxSubDepth+1;}//<<TODO:RENAME?>> "size" is a bit generic. How about "itemCount"? [Jon Aquino]int NodeBase::size() {	int subSize=0;	for(int i=0;i<4;i++) {		if (subnode[i]!=NULL) {			subSize+=subnode[i]->size();		}	}	return subSize+(int)items->size();}//<<TODO:RENAME?>> The Java Language Specification recommends that "Methods to//get and set an attribute that might be thought of as a variable V should be//named getV and setV" (6.8.3). Perhaps this and other methods should be//renamed to "get..."? [Jon Aquino]int NodeBase::nodeCount() {	int subSize=0;	for(int i=0;i<4;i++) {		if (subnode[i]!=NULL) {			subSize+=subnode[i]->size();		}	}	return subSize+1;}stringNodeBase::toString() const{	ostringstream s;	s<<"ITEMS:"<<items->size()<<endl;	for (int i=0; i<4; i++)	{		s<<"subnode["<<i<<"] ";		if ( subnode[i] == NULL ) s<<"NULL";		else s<<subnode[i]->toString();		s<<endl;	}	return s.str();}/*public*/voidNodeBase::visit(const Envelope* searchEnv, ItemVisitor& visitor){	if (! isSearchMatch(searchEnv)) return;	// this node may have items as well as subnodes (since items may not	// be wholely contained in any single subnode	visitItems(searchEnv, visitor);	for (int i = 0; i < 4; i++) {		if (subnode[i] != NULL) {			subnode[i]->visit(searchEnv, visitor);		}	}}/*private*/voidNodeBase::visitItems(const Envelope* searchEnv, ItemVisitor& visitor){	// would be nice to filter items based on search envelope, but can't	// until they contain an envelope	for (vector<void*>::iterator i=items->begin(), e=items->end();			i!=e; i++)	{		visitor.visitItem(*i);	}}/*public*/boolNodeBase::remove(const Envelope* itemEnv, void* item){	// use envelope to restrict nodes scanned	if (! isSearchMatch(itemEnv)) return false;	bool found = false;	for (int i = 0; i < 4; i++) {		if (subnode[i] != NULL) {			found = subnode[i]->remove(itemEnv, item);			if (found) {				// trim subtree if empty				if (subnode[i]->isPrunable())				subnode[i] = NULL;				break;			}		}	}	// if item was found lower down, don't need to search for it here	if (found) return found;	// otherwise, try and remove the item from the list of items	// in this node	vector<void*>::iterator foundIter = 		find(items->begin(), items->end(), item);	if ( foundIter != items->end() ) {		items->erase(foundIter);		return true;	} else {		return false;	}}} // namespace geos.index.quadtree} // namespace geos.index} // namespace geos/********************************************************************** * $Log$ * Revision 1.2  2006/03/23 13:31:58  strk * Fixed to allow build with GEOS_DEBUG * * Revision 1.1  2006/03/22 14:28:53  strk * Filenames renamed to match class names (matching JTS) * * Revision 1.19  2006/03/22 12:22:50  strk * indexQuadtree.h split * **********************************************************************/

⌨️ 快捷键说明

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