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
|
/**********************************************************************
* $Id: SweeplineNestedRingTester.cpp,v 1.10 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: SweeplineNestedRingTester.cpp,v $
* Revision 1.10 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.9 2004/07/08 19:34:50 strk
* Mirrored JTS interface of CoordinateSequence, factory and
* default implementations.
* Added DefaultCoordinateSequenceFactory::instance() function.
*
* Revision 1.8 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.7 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.6 2003/11/07 01:23:43 pramsey
* Add standard CVS headers licence notices and copyrights to all cpp and h
* files.
*
*
**********************************************************************/
#include <geos/opValid.h>
#include <stdio.h>
#include <geos/util.h>
namespace geos {
SweeplineNestedRingTester::SweeplineNestedRingTester(GeometryGraph *newGraph) {
graph=newGraph;
rings=new vector<LinearRing*>();
totalEnv=new Envelope();
sweepLine=new SweepLineIndex();
cga=new CGAlgorithms();
}
SweeplineNestedRingTester::~SweeplineNestedRingTester() {
delete rings;
delete totalEnv;
delete sweepLine;
delete cga;
}
SweeplineNestedRingTester::OverlapAction::OverlapAction(SweeplineNestedRingTester *p) {
isNonNested=true;
parent=p;
}
void SweeplineNestedRingTester::OverlapAction::overlap(SweepLineInterval *s0, SweepLineInterval *s1) {
LinearRing *innerRing=(LinearRing*) s0->getItem();
LinearRing *searchRing=(LinearRing*) s1->getItem();
if (innerRing==searchRing) return;
if (parent->isInside(innerRing,searchRing))
isNonNested=false;
};
Coordinate& SweeplineNestedRingTester::getNestedPoint() {
return nestedPt;
}
void SweeplineNestedRingTester::add(LinearRing *ring) {
rings->push_back(ring);
}
bool SweeplineNestedRingTester::isNonNested() {
buildIndex();
OverlapAction *action=new OverlapAction(this);
sweepLine->computeOverlaps(action);
return action->isNonNested;
}
void SweeplineNestedRingTester::buildIndex() {
sweepLine=new SweepLineIndex();
for(int i=0;i<(int)rings->size();i++) {
LinearRing *ring=(*rings)[i];
const Envelope *env=ring->getEnvelopeInternal();
SweepLineInterval *sweepInt=new SweepLineInterval(env->getMinX(),env->getMaxX(),ring);
sweepLine->add(sweepInt);
}
}
bool SweeplineNestedRingTester::isInside(LinearRing *innerRing,LinearRing *searchRing) {
CoordinateSequence *innerRingPts=innerRing->getCoordinates();
CoordinateSequence *searchRingPts=searchRing->getCoordinates();
if (!innerRing->getEnvelopeInternal()->intersects(searchRing->getEnvelopeInternal()))
return false;
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");
bool isInside=cga->isPointInRing(innerRingPt,searchRingPts);
if (isInside) {
nestedPt=innerRingPt;
return true;
}
return false;
}
}
|