1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
/**********************************************************************
* $Id: QuadtreeNestedRingTester.cpp,v 1.13 2004/07/27 16:35:47 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.
*
**********************************************************************
* $Log: QuadtreeNestedRingTester.cpp,v $
* Revision 1.13 2004/07/27 16:35:47 strk
* Geometry::getEnvelopeInternal() changed to return a const Envelope *.
* This should reduce object copies as once computed the envelope of a
* geometry remains the same.
*
* Revision 1.12 2004/07/08 19:34:50 strk
* Mirrored JTS interface of CoordinateSequence, factory and
* default implementations.
* Added DefaultCoordinateSequenceFactory::instance() function.
*
* Revision 1.11 2004/07/02 13:28:29 strk
* Fixed all #include lines to reflect headers layout change.
* Added client application build tips in README.
*
* Revision 1.10 2004/03/29 06:59:25 ybychkov
* "noding/snapround" package ported (JTS 1.4);
* "operation", "operation/valid", "operation/relate" and "operation/overlay" upgraded to JTS 1.4;
* "geom" partially upgraded.
*
* Revision 1.9 2003/11/07 01:23:42 pramsey
* Add standard CVS headers licence notices and copyrights to all cpp and h
* files.
*
* Revision 1.8 2003/10/16 08:50:00 strk
* Memory leak fixes. Improved performance by mean of more
* calls to new getCoordinatesRO() when applicable.
*
**********************************************************************/
#include <geos/opValid.h>
#include <stdio.h>
#include <geos/util.h>
namespace geos {
QuadtreeNestedRingTester::QuadtreeNestedRingTester(GeometryGraph *newGraph) {
graph=newGraph;
rings=new vector<LinearRing*>();
totalEnv=new Envelope();
qt=NULL;
}
QuadtreeNestedRingTester::~QuadtreeNestedRingTester() {
delete rings;
delete totalEnv;
delete qt;
}
Coordinate& QuadtreeNestedRingTester::getNestedPoint() {
return nestedPt;
}
void QuadtreeNestedRingTester::add(LinearRing *ring) {
rings->push_back(ring);
const Envelope *envi=ring->getEnvelopeInternal();
totalEnv->expandToInclude(envi);
//delete envi;
}
bool QuadtreeNestedRingTester::isNonNested() {
buildQuadtree();
for(int i=0;i<(int)rings->size();i++) {
LinearRing *innerRing=(*rings)[i];
const CoordinateSequence *innerRingPts=innerRing->getCoordinatesRO();
const Envelope *envi=innerRing->getEnvelopeInternal();
vector<void*> *results=qt->query(envi);
//delete envi;
for(int j=0;j<(int)results->size();j++) {
LinearRing *searchRing=(LinearRing*)(*results)[j];
const CoordinateSequence *searchRingPts=searchRing->getCoordinatesRO();
if (innerRing==searchRing)
continue;
const Envelope *e1=innerRing->getEnvelopeInternal();
const Envelope *e2=searchRing->getEnvelopeInternal();
if (!e1->intersects(e2)) {
//delete e1;
//delete e2;
continue;
}
//delete e1;
//delete e2;
const Coordinate& innerRingPt=IsValidOp::findPtNotNode(innerRingPts,searchRing,graph);
Assert::isTrue(!(innerRingPt==Coordinate::getNull()),"Unable to find a ring point not a node of the search ring");
//Coordinate innerRingPt = innerRingPts[0];
bool isInside=CGAlgorithms::isPointInRing(innerRingPt,searchRingPts);
if (isInside) {
nestedPt=innerRingPt;
delete results;
return false;
}
}
delete results;
}
return true;
}
void QuadtreeNestedRingTester::buildQuadtree() {
qt=new Quadtree();
for(int i=0;i<(int)rings->size();i++) {
LinearRing *ring=(*rings)[i];
const Envelope *env=ring->getEnvelopeInternal();
qt->insert(env,ring);
//delete env;
}
}
}
|