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

📄 segmentintersector.cpp

📁 在Linux下做的QuadTree的程序
💻 CPP
字号:
/********************************************************************** * $Id: SegmentIntersector.cpp 1820 2006-09-06 16:54:23Z mloskot $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2001-2002 Vivid Solutions Inc. * Copyright (C) 2005 Refractions Research 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 <vector>#include <geos/geomgraph/index/SegmentIntersector.h>#include <geos/geomgraph/Edge.h>#include <geos/geomgraph/Node.h>#include <geos/algorithm/LineIntersector.h>#include <geos/geom/Coordinate.h>#include <geos/geom/CoordinateSequence.h>#ifndef GEOS_DEBUG#define GEOS_DEBUG 0#endif#define DEBUG_INTERSECT 0#if GEOS_DEBUG || DEBUG_INTERSECT#include <iostream>#endifusing namespace std;using namespace geos::geom;namespace geos {namespace geomgraph { // geos.geomgraphnamespace index { // geos.geomgraph.indexusing namespace geos::algorithm;boolSegmentIntersector::isAdjacentSegments(int i1,int i2){	return abs(i1-i2)==1;}voidSegmentIntersector::setBoundaryNodes(vector<Node*> *bdyNodes0,	vector<Node*> *bdyNodes1){	bdyNodes[0]=bdyNodes0;	bdyNodes[1]=bdyNodes1;}/* * @return the proper intersection point, or <code>null</code> * if none was found */Coordinate&SegmentIntersector::getProperIntersectionPoint(){	return properIntersectionPoint;}boolSegmentIntersector::hasIntersection(){	return hasIntersectionVar;}/* * A proper intersection is an intersection which is interior to at least two * line segments.  Note that a proper intersection is not necessarily * in the interior of the entire Geometry, since another edge may have * an endpoint equal to the intersection, which according to SFS semantics * can result in the point being on the Boundary of the Geometry. */boolSegmentIntersector::hasProperIntersection(){	return hasProper;}/* * A proper interior intersection is a proper intersection which is <b>not</b> * contained in the set of boundary nodes set for this SegmentIntersector. */boolSegmentIntersector::hasProperInteriorIntersection(){	return hasProperInterior;}/* * A trivial intersection is an apparent self-intersection which in fact * is simply the point shared by adjacent line segments. * Note that closed edges require a special check for the point * shared by the beginning and end segments. */boolSegmentIntersector::isTrivialIntersection(Edge *e0,int segIndex0,Edge *e1,int segIndex1){//	if (e0->equals(e1)) 	if (e0==e1) {		if (li->getIntersectionNum()==1) {			if (isAdjacentSegments(segIndex0,segIndex1))				return true;			if (e0->isClosed()) {				int maxSegIndex=e0->getNumPoints()-1;				if ((segIndex0==0 && segIndex1==maxSegIndex)					|| (segIndex1==0 && segIndex0==maxSegIndex)) {					return true;				}			}		}	}	return false;}/** * This method is called by clients of the EdgeIntersector class to test * for and add intersections for two segments of the edges being intersected. * Note that clients (such as MonotoneChainEdges) may choose not to intersect * certain pairs of segments for efficiency reasons. */voidSegmentIntersector::addIntersections(Edge *e0,int segIndex0,Edge *e1,int segIndex1){#if GEOS_DEBUG	cerr<<"SegmentIntersector::addIntersections() called"<<endl;#endif//	if (e0->equals(e1) && segIndex0==segIndex1) return;	if (e0==e1 && segIndex0==segIndex1) return;	numTests++;	const CoordinateSequence* cl0=e0->getCoordinates();	const Coordinate& p00=cl0->getAt(segIndex0);	const Coordinate& p01=cl0->getAt(segIndex0+1);	const CoordinateSequence* cl1=e1->getCoordinates();	const Coordinate& p10=cl1->getAt(segIndex1);	const Coordinate& p11=cl1->getAt(segIndex1+1);	li->computeIntersection(p00,p01,p10,p11);	/*	 * Always record any non-proper intersections.	 * If includeProper is true, record any proper intersections as well.	 */	if (li->hasIntersection()) {		if (recordIsolated) {			e0->setIsolated(false);			e1->setIsolated(false);		}		//intersectionFound = true;		numIntersections++;		// If the segments are adjacent they have at least one trivial		// intersection, the shared endpoint.		// Don't bother adding it if it is the		// only intersection.		if (!isTrivialIntersection(e0,segIndex0,e1,segIndex1))		{#if GEOS_DEBUG			cerr<<"SegmentIntersector::addIntersections(): has !TrivialIntersection"<<endl;#endif // DEBUG_INTERSECT			hasIntersectionVar=true;			if (includeProper || !li->isProper()) {				//Debug.println(li);				e0->addIntersections(li,segIndex0,0);				e1->addIntersections(li,segIndex1,1);#if GEOS_DEBUG				cerr<<"SegmentIntersector::addIntersections(): includeProper || !li->isProper()"<<endl;#endif // DEBUG_INTERSECT			}			if (li->isProper())			{				properIntersectionPoint=li->getIntersection(0);#if GEOS_DEBUG				cerr<<"SegmentIntersector::addIntersections(): properIntersectionPoint: "<<properIntersectionPoint.toString()<<endl;#endif // DEBUG_INTERSECT				hasProper=true;				if (!isBoundaryPoint(li,bdyNodes))					hasProperInterior=true;			}			//if (li.isCollinear())			//hasCollinear = true;		}	}}/*private*/boolSegmentIntersector::isBoundaryPoint(LineIntersector *li,		vector<Node*> *tstBdyNodes){	if ( ! tstBdyNodes ) return false;	for(vector<Node*>::iterator i=tstBdyNodes->begin();i<tstBdyNodes->end();i++) {		Node *node=*i;		const Coordinate& pt=node->getCoordinate();		if (li->isIntersection(pt)) return true;	}	return false;}/*private*/boolSegmentIntersector::isBoundaryPoint(LineIntersector *li,		vector<vector<Node*>*>& tstBdyNodes){	if (isBoundaryPoint(li, tstBdyNodes[0])) return true;	if (isBoundaryPoint(li, tstBdyNodes[1])) return true;	return false;}} // namespace geos.geomgraph.index} // namespace geos.geomgraph} // namespace geos/********************************************************************** * $Log$ * Revision 1.18  2006/03/23 13:31:58  strk * Fixed to allow build with GEOS_DEBUG * * Revision 1.17  2006/03/15 17:16:31  strk * streamlined headers inclusion * * Revision 1.16  2006/03/09 16:46:47  strk * geos::geom namespace definition, first pass at headers split * * Revision 1.15  2006/03/03 10:46:21  strk * Removed 'using namespace' from headers, added missing headers in .cpp files, removed useless includes in headers (bug#46) * * Revision 1.14  2006/03/02 12:12:00  strk * Renamed DEBUG macros to GEOS_DEBUG, all wrapped in #ifndef block to allow global override (bug#43) * * Revision 1.13  2006/02/23 11:54:20  strk * - MCIndexPointSnapper * - MCIndexSnapRounder * - SnapRounding BufferOp * - ScaledNoder * - GEOSException hierarchy cleanups * - SpatialIndex memory-friendly query interface * - GeometryGraph::getBoundaryNodes memory-friendly * - NodeMap::getBoundaryNodes memory-friendly * - Cleanups in geomgraph::Edge * - Added an XML test for snaprounding buffer (shows leaks, working on it) * * Revision 1.12  2006/02/19 19:46:49  strk * Packages <-> namespaces mapping for most GEOS internal code (uncomplete, but working). Dir-level libs for index/ subdirs. * * Revision 1.11  2006/01/31 19:07:34  strk * - Renamed DefaultCoordinateSequence to CoordinateArraySequence. * - Moved GetNumGeometries() and GetGeometryN() interfaces *   from GeometryCollection to Geometry class. * - Added getAt(int pos, Coordinate &to) funtion to CoordinateSequence class. * - Reworked automake scripts to produce a static lib for each subdir and *   then link all subsystem's libs togheter * - Moved C-API in it's own top-level dir capi/ * - Moved source/bigtest and source/test to tests/bigtest and test/xmltester * - Fixed PointLocator handling of LinearRings * - Changed CoordinateArrayFilter to reduce memory copies * - Changed UniqueCoordinateArrayFilter to reduce memory copies * - Added CGAlgorithms::isPointInRing() version working with *   Coordinate::ConstVect type (faster!) * - Ported JTS-1.7 version of ConvexHull with big attention to *   memory usage optimizations. * - Improved XMLTester output and user interface * - geos::geom::util namespace used for geom/util stuff * - Improved memory use in geos::geom::util::PolygonExtractor * - New ShortCircuitedGeometryVisitor class * - New operation/predicate package * * Revision 1.10  2005/11/21 16:03:20  strk * * Coordinate interface change: *         Removed setCoordinate call, use assignment operator *         instead. Provided a compile-time switch to *         make copy ctor and assignment operators non-inline *         to allow for more accurate profiling. * * Coordinate copies removal: *         NodeFactory::createNode() takes now a Coordinate reference *         rather then real value. This brings coordinate copies *         in the testLeaksBig.xml test from 654818 to 645991 *         (tested in 2.1 branch). In the head branch Coordinate *         copies are 222198. *         Removed useless coordinate copies in ConvexHull *         operations * * STL containers heap allocations reduction: *         Converted many containers element from *         pointers to real objects. *         Made some use of .reserve() or size *         initialization when final container size is known *         in advance. * * Stateless classes allocations reduction: *         Provided ::instance() function for *         NodeFactories, to avoid allocating *         more then one (they are all *         stateless). * * HCoordinate improvements: *         Changed HCoordinate constructor by HCoordinates *         take reference rather then real objects. *         Changed HCoordinate::intersection to avoid *         a new allocation but rather return into a provided *         storage. LineIntersector changed to reflect *         the above change. * * Revision 1.9  2005/11/15 10:04:37  strk * * Reduced heap allocations (vectors, mostly). * Enforced const-correctness, changed some interfaces * to use references rather then pointers when appropriate. * * Revision 1.8  2005/04/06 11:09:41  strk * Applied patch from Jon Schlueter (math.h => cmath; ieeefp.h in "C" block) * * Revision 1.7  2004/11/23 19:53:06  strk * Had LineIntersector compute Z by interpolation. * * Revision 1.6  2004/11/17 08:41:42  strk * Fixed a bug in Z computation and removed debugging output by default. * * Revision 1.5  2004/11/17 08:13:16  strk * Indentation changes. * Some Z_COMPUTATION activated by default. * * Revision 1.4  2004/10/20 17:32:14  strk * Initial approach to 2.5d intersection() * * Revision 1.3  2004/07/08 19:34:49  strk * Mirrored JTS interface of CoordinateSequence, factory and * default implementations. * Added CoordinateArraySequenceFactory::instance() function. * * Revision 1.2  2004/07/02 13:28:26  strk * Fixed all #include lines to reflect headers layout change. * Added client application build tips in README. * * Revision 1.1  2004/04/14 06:04:26  ybychkov * "geomgraph/index" committ problem fixed. * * Revision 1.18  2004/03/19 09:49:29  ybychkov * "geomgraph" and "geomgraph/indexl" upgraded to JTS 1.4 * * Revision 1.17  2003/11/07 01:23:42  pramsey * Add standard CVS headers licence notices and copyrights to all cpp and h * files. * * Revision 1.16  2003/10/15 16:39:03  strk * Made Edge::getCoordinates() return a 'const' value. Adapted code set. * **********************************************************************/

⌨️ 快捷键说明

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