linemerger.cpp

来自「一个很好的vc底层代码」· C++ 代码 · 共 204 行

CPP
204
字号
/********************************************************************** * $Id: LineMerger.cpp,v 1.4 2004/12/08 13:54:44 strk Exp $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * 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/opLinemerge.h>#include <geos/util.h>#include <typeinfo>namespace geos {voidLineMerger::add(vector<Geometry*> *geometries){	for(int i=0;i<(int)geometries->size();i++) {		Geometry *geometry=(*geometries)[i];		add(geometry);	}}LineMerger::LineMerger(){	graph=new LineMergeGraph();	mergedLineStrings=NULL;	edgeStrings=NULL;	factory=NULL;}LineMerger::~LineMerger(){	delete graph;//	delete mergedLineStrings;	if ( edgeStrings )	{		for (unsigned int i=0; i<edgeStrings->size(); i++)			delete (*edgeStrings)[i];		delete edgeStrings;	}}LMGeometryComponentFilter::LMGeometryComponentFilter(LineMerger *newLm):	lm(newLm){}voidLMGeometryComponentFilter::filter_rw(Geometry *geom){	if (typeid(*geom)==typeid(LineString)) {		lm->add((LineString*)geom);	}	}/** * Adds a Geometry to be processed. May be called multiple times. * Any dimension of Geometry may be added; the constituent linework will be * extracted. */  voidLineMerger::add(Geometry *geometry){	LMGeometryComponentFilter lmgcf(this);	geometry->apply_rw(&lmgcf);}voidLineMerger::add(LineString *lineString){	if (factory==NULL) {		factory=lineString->getFactory();	}	graph->addEdge(lineString);}voidLineMerger::merge(){	if (mergedLineStrings!=NULL) { 		return;	}	edgeStrings=new vector<EdgeString*>();	buildEdgeStringsForObviousStartNodes();	buildEdgeStringsForIsolatedLoops();	mergedLineStrings=new vector<LineString*>();    	for (int i=0;i<(int)edgeStrings->size();i++) {		EdgeString *edgeString=(*edgeStrings)[i];		mergedLineStrings->push_back(edgeString->toLineString());	}    }voidLineMerger::buildEdgeStringsForObviousStartNodes(){	buildEdgeStringsForNonDegree2Nodes();}voidLineMerger::buildEdgeStringsForIsolatedLoops(){	buildEdgeStringsForUnprocessedNodes();}  voidLineMerger::buildEdgeStringsForUnprocessedNodes(){	vector<planarNode*> *nodes=graph->getNodes();	for (int i=0;i<(int)nodes->size();i++) {		planarNode *node=(*nodes)[i];		if (!node->isMarked()) { 			Assert::isTrue(node->getDegree()==2);			buildEdgeStringsStartingAt(node);			node->setMarked(true);		}	}	delete nodes;}voidLineMerger::buildEdgeStringsForNonDegree2Nodes(){	vector<planarNode*> *nodes=graph->getNodes();	for (int i=0;i<(int)nodes->size();i++) {		planarNode *node=(*nodes)[i];		if (node->getDegree()!=2) { 			buildEdgeStringsStartingAt(node);			node->setMarked(true);		}	}	delete nodes;}voidLineMerger::buildEdgeStringsStartingAt(planarNode *node){	vector<planarDirectedEdge*> *edges=node->getOutEdges()->getEdges();	for (int i=0;i<(int)edges->size();i++)	{		LineMergeDirectedEdge *directedEdge=(LineMergeDirectedEdge*) (*edges)[i];		if (directedEdge->getEdge()->isMarked()) {			continue;		}		edgeStrings->push_back(buildEdgeStringStartingWith(directedEdge));	}}EdgeString*LineMerger::buildEdgeStringStartingWith(LineMergeDirectedEdge *start){    	EdgeString *edgeString = new EdgeString(factory);	LineMergeDirectedEdge *current=start;	do {		edgeString->add(current);		current->getEdge()->setMarked(true);		current=current->getNext();      	} while (current!=NULL && current!=start);	return edgeString;}/** * Returns the LineStrings built by the merging process. */vector<LineString*>*LineMerger::getMergedLineStrings(){	merge();	return mergedLineStrings;}} // namespace geos/********************************************************************** * $Log: LineMerger.cpp,v $ * Revision 1.4  2004/12/08 13:54:44  strk * gcc warnings checked and fixed, general cleanups. * * Revision 1.3  2004/10/13 10:03:02  strk * Added missing linemerge and polygonize operation. * Bug fixes and leaks removal from the newly added modules and * planargraph (used by them). * Some comments and indentation changes. * * Revision 1.2  2004/07/02 13:28:28  strk * Fixed all #include lines to reflect headers layout change. * Added client application build tips in README. * * Revision 1.1  2004/04/07 06:55:50  ybychkov * "operation/linemerge" ported from JTS 1.4 * * **********************************************************************/ 

⌨️ 快捷键说明

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