00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GEOS_GEOMGRAPH_NODE_H
00023 #define GEOS_GEOMGRAPH_NODE_H
00024
00025 #include <geos/export.h>
00026 #include <geos/geomgraph/GraphComponent.h>
00027 #include <geos/geom/Coordinate.h>
00028
00029 #ifndef NDEBUG
00030 #include <geos/geomgraph/EdgeEndStar.h>
00031 #include <geos/geomgraph/EdgeEnd.h>
00032 #endif // ndef NDEBUG
00033
00034 #include <geos/inline.h>
00035
00036 #include <cassert>
00037 #include <string>
00038
00039 #ifdef _MSC_VER
00040 #pragma warning(push)
00041 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00042 #endif
00043
00044
00045 namespace geos {
00046 namespace geom {
00047 class IntersectionMatrix;
00048 }
00049 namespace geomgraph {
00050 class Node;
00051 class EdgeEndStar;
00052 class EdgeEnd;
00053 class Label;
00054 class NodeFactory;
00055 }
00056 }
00057
00058 namespace geos {
00059 namespace geomgraph {
00060
00062 class GEOS_DLL Node: public GraphComponent {
00063 using GraphComponent::setLabel;
00064
00065 public:
00066
00067 friend std::ostream& operator<< (std::ostream& os, const Node& node);
00068
00069 Node(const geom::Coordinate& newCoord, EdgeEndStar* newEdges);
00070
00071 virtual ~Node();
00072
00073 virtual const geom::Coordinate& getCoordinate() const;
00074
00075 virtual EdgeEndStar* getEdges();
00076
00077 virtual bool isIsolated() const;
00078
00082 virtual void add(EdgeEnd *e);
00083
00084 virtual void mergeLabel(const Node& n);
00085
00093 virtual void mergeLabel(const Label& label2);
00094
00095 virtual void setLabel(int argIndex, int onLocation);
00096
00101 virtual void setLabelBoundary(int argIndex);
00102
00111 virtual int computeMergedLocation(const Label& label2, int eltIndex);
00112
00113 virtual std::string print();
00114
00115 virtual const std::vector<double> &getZ() const;
00116
00117 virtual void addZ(double);
00118
00130 virtual bool isIncidentEdgeInResult() const;
00131
00132 protected:
00133
00134 void testInvariant() const;
00135
00136 geom::Coordinate coord;
00137
00138 EdgeEndStar* edges;
00139
00143 virtual void computeIM(geom::IntersectionMatrix& ) {}
00144
00145 private:
00146
00147 std::vector<double> zvals;
00148
00149 double ztot;
00150
00151 };
00152
00153 std::ostream& operator<< (std::ostream& os, const Node& node);
00154
00155 inline void
00156 Node::testInvariant() const
00157 {
00158 #ifndef NDEBUG
00159 if (edges)
00160 {
00161
00162
00163 for (EdgeEndStar::iterator
00164 it=edges->begin(), itEnd=edges->end();
00165 it != itEnd; it++)
00166 {
00167 EdgeEnd* e=*it;
00168 assert(e);
00169 assert(e->getCoordinate().equals2D(coord));
00170 }
00171 }
00172
00173 #if 0 // We can't rely on numerical stability with FP computations
00174
00175 double ztot_check=0.0;
00176 for (std::vector<double>::const_iterator
00177 i = zvals.begin(), e = zvals.end();
00178 i != e;
00179 i++)
00180 {
00181 ztot_check += *i;
00182 }
00183 assert(ztot_check == ztot);
00184 #endif // 0
00185
00186 #endif
00187 }
00188
00189
00190 }
00191 }
00192
00193
00194
00195
00196
00197 #ifdef _MSC_VER
00198 #pragma warning(pop)
00199 #endif
00200
00201 #endif // ifndef GEOS_GEOMGRAPH_NODE_H