GEOS  3.4.2
Edge.h
00001 /**********************************************************************
00002  *
00003  * GEOS - Geometry Engine Open Source
00004  * http://geos.osgeo.org
00005  *
00006  * Copyright (C) 2011 Sandro Santilli <strk@keybit.net>
00007  * Copyright (C) 2005-2006 Refractions Research Inc.
00008  * Copyright (C) 2001-2002 Vivid Solutions Inc.
00009  *
00010  * This is free software; you can redistribute and/or modify it under
00011  * the terms of the GNU Lesser General Public Licence as published
00012  * by the Free Software Foundation. 
00013  * See the COPYING file for more information.
00014  *
00015  **********************************************************************
00016  *
00017  * Last port: geomgraph/Edge.java r428 (JTS-1.12+)
00018  *
00019  **********************************************************************/
00020 
00021 
00022 #ifndef GEOS_GEOMGRAPH_EDGE_H
00023 #define GEOS_GEOMGRAPH_EDGE_H
00024 
00025 #include <geos/export.h>
00026 #include <string>
00027 #include <cassert>
00028 
00029 #include <geos/geomgraph/GraphComponent.h> // for inheritance
00030 #include <geos/geomgraph/Depth.h> // for member
00031 #include <geos/geomgraph/EdgeIntersectionList.h> // for composition
00032 #include <geos/geom/CoordinateSequence.h> // for inlines
00033 
00034 #include <geos/inline.h>
00035 
00036 #ifdef _MSC_VER
00037 #pragma warning(push)
00038 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00039 #endif
00040 
00041 // Forward declarations
00042 namespace geos {
00043         namespace geom {
00044                 class Envelope;
00045                 class IntersectionMatrix;
00046                 class Coordinate;
00047         }
00048         namespace algorithm {
00049                 class LineIntersector;
00050         }
00051         namespace geomgraph {
00052                 class Node;
00053                 class EdgeEndStar;
00054                 class Label;
00055                 class NodeFactory;
00056                 namespace index {
00057                         class MonotoneChainEdge;
00058                 }
00059         }
00060 }
00061 
00062 namespace geos {
00063 namespace geomgraph { // geos.geomgraph
00064 
00066 class GEOS_DLL Edge: public GraphComponent{
00067 using GraphComponent::updateIM;
00068 
00069 private:
00070 
00071         std::string name;
00072 
00074         index::MonotoneChainEdge *mce;
00075 
00077         geom::Envelope *env;
00078 
00079         bool isIsolatedVar;
00080 
00081         Depth depth;
00082 
00083         int depthDelta;   // the change in area depth from the R to L side of this edge
00084 
00085 public:
00086 
00087         void testInvariant() const {
00088                 assert(pts);
00089                 assert(pts->size() > 1);
00090         }
00091 
00092 
00093         friend std::ostream& operator<< (std::ostream& os, const Edge& el);
00094 
00095         static void updateIM(const Label& lbl, geom::IntersectionMatrix& im);
00096 
00098         geom::CoordinateSequence* pts;
00099 
00100         EdgeIntersectionList eiList;
00101 
00102         //Edge();
00103 
00105         Edge(geom::CoordinateSequence* newPts, const Label& newLabel);
00106 
00108         Edge(geom::CoordinateSequence* newPts);
00109 
00110         virtual ~Edge();
00111 
00112         virtual int getNumPoints() const {
00113                 return static_cast<int>(pts->getSize());
00114         }
00115 
00116         virtual void setName(const std::string &newName) {
00117                 name=newName;
00118         }
00119 
00120         virtual const geom::CoordinateSequence* getCoordinates() const {
00121                 testInvariant();
00122                 return pts;
00123         }
00124 
00125         virtual const geom::Coordinate& getCoordinate(int i) const {
00126                 testInvariant();
00127                 return pts->getAt(i);
00128         }
00129 
00130         virtual const geom::Coordinate& getCoordinate() const {
00131                 testInvariant();
00132                 return pts->getAt(0);
00133         }
00134 
00135 
00136         virtual Depth &getDepth() { 
00137                 testInvariant();
00138                 return depth;
00139         }
00140 
00146         virtual int getDepthDelta() const {
00147                 testInvariant();
00148                 return depthDelta;
00149         }
00150 
00151         virtual void setDepthDelta(int newDepthDelta) {
00152                 depthDelta=newDepthDelta;
00153                 testInvariant();
00154         }
00155 
00156         virtual int getMaximumSegmentIndex() const {
00157                 testInvariant();
00158                 return getNumPoints()-1;
00159         }
00160 
00161         virtual EdgeIntersectionList& getEdgeIntersectionList() {
00162                 testInvariant();
00163                 return eiList;
00164         }
00165 
00170         virtual index::MonotoneChainEdge* getMonotoneChainEdge();
00171 
00172         virtual bool isClosed() const {
00173                 testInvariant();
00174                 return pts->getAt(0)==pts->getAt(getNumPoints()-1);
00175         }
00176 
00181         virtual bool isCollapsed() const;
00182 
00183         virtual Edge* getCollapsedEdge();
00184 
00185         virtual void setIsolated(bool newIsIsolated) {
00186                 isIsolatedVar=newIsIsolated;
00187                 testInvariant();
00188         }
00189 
00190         virtual bool isIsolated() const {
00191                 testInvariant();
00192                 return isIsolatedVar;
00193         }
00194 
00199         virtual void addIntersections(algorithm::LineIntersector *li, int segmentIndex,
00200                 int geomIndex);
00201 
00203         //
00207         virtual void addIntersection(algorithm::LineIntersector *li, int segmentIndex,
00208                 int geomIndex, int intIndex);
00209 
00211         //
00215         virtual void computeIM(geom::IntersectionMatrix& im) {
00216                 updateIM(label, im);
00217                 testInvariant();
00218         }
00219 
00221         virtual bool isPointwiseEqual(const Edge *e) const;
00222 
00223         virtual std::string print() const;
00224 
00225         virtual std::string printReverse() const;
00226 
00234         virtual bool equals(const Edge& e) const;
00235 
00236         virtual bool equals(const Edge* e) const {
00237                 assert(e);
00238                 return equals(*e);
00239         }
00240 
00241         virtual geom::Envelope* getEnvelope();
00242 };
00243 
00244 
00245 //Operators
00246 inline bool operator==(const Edge &a, const Edge &b) {
00247         return a.equals(b);
00248 }
00249 
00250 std::ostream& operator<< (std::ostream& os, const Edge& el);
00251 
00252 
00253 } // namespace geos.geomgraph
00254 } // namespace geos
00255 
00256 #ifdef _MSC_VER
00257 #pragma warning(pop)
00258 #endif
00259 
00260 //#ifdef GEOS_INLINE
00261 //# include "geos/geomgraph/Edge.inl"
00262 //#endif
00263 
00264 #endif // ifndef GEOS_GEOMGRAPH_EDGE_H
00265