GEOS: Edge.h Source File

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List

# Edge.h

    00001 /**********************************************************************
    00002  * $Id: Edge.h 3255 2011-03-01 17:56:10Z mloskot $
    00003  *
    00004  * GEOS - Geometry Engine Open Source
    00005  * http://geos.refractions.net
    00006  *
    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 rev. 1.4 (JTS-1.10)
    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
    00065 class GEOS_DLL Edge: public GraphComponent{
    00066 using GraphComponent::updateIM;
    00067
    00068 private:
    00069
    00070         std::string name;
    00071
    00073         index::MonotoneChainEdge *mce;
    00074
    00076         geom::Envelope *env;
    00077
    00078         bool isIsolatedVar;
    00079
    00080         Depth depth;
    00081
    00082         int depthDelta;   // the change in area depth from the R to L side of this edge
    00083
    00084 public:
    00085
    00086         void testInvariant() const {
    00087                 assert(pts);
    00088                 assert(pts->size() > 1);
    00089         }
    00090
    00091
    00092         friend std::ostream& operator<< (std::ostream& os, const Edge& el);
    00093
    00094         static void updateIM(Label *lbl,geom::IntersectionMatrix *im);
    00095
    00097         geom::CoordinateSequence* pts;
    00098
    00099         EdgeIntersectionList eiList;
    00100
    00101         //Edge();
    00102
    00103         Edge(geom::CoordinateSequence* newPts, Label *newLabel);
    00104
    00105         Edge(geom::CoordinateSequence* newPts);
    00106
    00107         virtual ~Edge();
    00108
    00109         virtual int getNumPoints() const {
    00110                 return static_cast<int>(pts->getSize());
    00111         }
    00112
    00113         virtual void setName(const std::string &newName) {
    00114                 name=newName;
    00115         }
    00116
    00117         virtual const geom::CoordinateSequence* getCoordinates() const {
    00118                 testInvariant();
    00119                 return pts;
    00120         }
    00121
    00122         virtual const geom::Coordinate& getCoordinate(int i) const {
    00123                 testInvariant();
    00124                 return pts->getAt(i);
    00125         }
    00126
    00127         virtual const geom::Coordinate& getCoordinate() const {
    00128                 testInvariant();
    00129                 return pts->getAt(0);
    00130         }
    00131
    00132
    00133         virtual Depth &getDepth() {
    00134                 testInvariant();
    00135                 return depth;
    00136         }
    00137
    00143         virtual int getDepthDelta() const {
    00144                 testInvariant();
    00145                 return depthDelta;
    00146         }
    00147
    00148         virtual void setDepthDelta(int newDepthDelta) {
    00149                 depthDelta=newDepthDelta;
    00150                 testInvariant();
    00151         }
    00152
    00153         virtual int getMaximumSegmentIndex() const {
    00154                 testInvariant();
    00155                 return getNumPoints()-1;
    00156         }
    00157
    00158         virtual EdgeIntersectionList& getEdgeIntersectionList() {
    00159                 testInvariant();
    00160                 return eiList;
    00161         }
    00162
    00167         virtual index::MonotoneChainEdge* getMonotoneChainEdge();
    00168
    00169         virtual bool isClosed() const {
    00170                 testInvariant();
    00171                 return pts->getAt(0)==pts->getAt(getNumPoints()-1);
    00172         }
    00173
    00178         virtual bool isCollapsed() const;
    00179
    00180         virtual Edge* getCollapsedEdge();
    00181
    00182         virtual void setIsolated(bool newIsIsolated) {
    00183                 isIsolatedVar=newIsIsolated;
    00184                 testInvariant();
    00185         }
    00186
    00187         virtual bool isIsolated() const {
    00188                 testInvariant();
    00189                 return isIsolatedVar;
    00190         }
    00191
    00196         virtual void addIntersections(algorithm::LineIntersector *li, int segmentIndex,
    00197                 int geomIndex);
    00198
    00200         //
    00204         virtual void addIntersection(algorithm::LineIntersector *li, int segmentIndex,
    00205                 int geomIndex, int intIndex);
    00206
    00208         //
    00211         virtual void computeIM(geom::IntersectionMatrix *im) {
    00212                 updateIM(label, im);
    00213                 testInvariant();
    00214         }
    00215
    00217         virtual bool isPointwiseEqual(const Edge *e) const;
    00218
    00219         virtual std::string print() const;
    00220
    00221         virtual std::string printReverse() const;
    00222
    00230         virtual bool equals(const Edge& e) const;
    00231
    00232         virtual bool equals(const Edge* e) const {
    00233                 assert(e);
    00234                 return equals(*e);
    00235         }
    00236
    00237         virtual geom::Envelope* getEnvelope();
    00238 };
    00239
    00240
    00241 //Operators
    00242 inline bool operator==(const Edge &a, const Edge &b) {
    00243         return a.equals(b);
    00244 }
    00245
    00246 std::ostream& operator<< (std::ostream& os, const Edge& el);
    00247
    00248
    00249 } // namespace geos.geomgraph
    00250 } // namespace geos
    00251
    00252 #ifdef _MSC_VER
    00253 #pragma warning(pop)
    00254 #endif
    00255
    00256 //#ifdef GEOS_INLINE
    00257 //# include "geos/geomgraph/Edge.inl"
    00258 //#endif
    00259
    00260 #endif // ifndef GEOS_GEOMGRAPH_EDGE_H
    00261
    00262 /**********************************************************************
    00263  * $Log$
    00264  * Revision 1.4  2006/04/05 18:28:42  strk
    00265  * Moved testInvariant() methods from private to public, added
    00266  * some comments about them.
    00267  *
    00268  * Revision 1.3  2006/03/24 09:52:41  strk
    00269  * USE_INLINE => GEOS_INLINE
    00270  *
    00271  * Revision 1.2  2006/03/14 11:03:14  strk
    00272  * Added operator<< for Edge and EdgeList
    00273  *
    00274  * Revision 1.1  2006/03/09 16:46:49  strk
    00275  * geos::geom namespace definition, first pass at headers split
    00276  *
    00277  **********************************************************************/
    00278