SegmentString.h

00001 /**********************************************************************
00002  * $Id: SegmentString.h 1872 2006-10-20 11:18:39Z strk $
00003  *
00004  * GEOS - Geometry Engine Open Source
00005  * http://geos.refractions.net
00006  *
00007  * Copyright (C) 2006      Refractions Research Inc.
00008  *
00009  * This is free software; you can redistribute and/or modify it under
00010  * the terms of the GNU Lesser General Public Licence as published
00011  * by the Free Software Foundation. 
00012  * See the COPYING file for more information.
00013  *
00014  **********************************************************************/
00015 
00016 #ifndef GEOS_NODING_SEGMENTSTRING_H
00017 #define GEOS_NODING_SEGMENTSTRING_H
00018 
00019 #include <geos/noding/SegmentNodeList.h>
00020 #include <geos/geom/CoordinateSequence.h> // for testInvariant
00021 
00022 #include <geos/inline.h>
00023 
00024 #include <vector>
00025 
00026 // Forward declarations
00027 namespace geos {
00028         namespace algorithm {
00029                 class LineIntersector;
00030         }
00031 }
00032 
00033 namespace geos {
00034 namespace noding { // geos.noding
00035 
00055 class SegmentString {
00056 public:
00057         typedef std::vector<const SegmentString*> ConstVect;
00058         typedef std::vector<SegmentString *> NonConstVect;
00059 
00060         friend std::ostream& operator<< (std::ostream& os,
00061                         const SegmentString& ss);
00062 
00063 private:
00064         SegmentNodeList nodeList;
00065         geom::CoordinateSequence *pts;
00066         mutable unsigned int npts; // this is a cache
00067         const void* context;
00068         bool isIsolatedVar;
00069 
00070 public:
00071 
00072         void testInvariant() const;
00073 
00075         //
00081         SegmentString(geom::CoordinateSequence *newPts, const void* newContext);
00082 
00083         ~SegmentString();
00084 
00085         //const void* getContext() const { return getData(); }
00086 
00087         const void* getData() const;
00088 
00089         const SegmentNodeList& getNodeList() const;
00090 
00091         SegmentNodeList& getNodeList();
00092 
00093         unsigned int size() const;
00094 
00095         const geom::Coordinate& getCoordinate(unsigned int i) const;
00096 
00100         //
00104         geom::CoordinateSequence* getCoordinates() const;
00105 
00109         //
00113         void notifyCoordinatesChange() const;
00114 
00115         // Return a read-only pointer to this SegmentString CoordinateSequence
00116         //const CoordinateSequence* getCoordinatesRO() const { return pts; }
00117 
00118         void setIsolated(bool isIsolated);
00119 
00120         bool isIsolated() const;
00121         
00122         bool isClosed() const;
00123 
00132         int getSegmentOctant(unsigned int index) const;
00133 
00139         void addIntersections(algorithm::LineIntersector *li,
00140                         unsigned int segmentIndex, int geomIndex);
00141 
00149         void addIntersection(algorithm::LineIntersector *li,
00150                         unsigned int segmentIndex,
00151                         int geomIndex, int intIndex);
00152 
00160         void addIntersection(const geom::Coordinate& intPt,
00161                         unsigned int segmentIndex);
00162 
00163         static void getNodedSubstrings(
00164                         const SegmentString::NonConstVect& segStrings,
00165                         SegmentString::NonConstVect* resultEdgeList);
00166 
00167         static SegmentString::NonConstVect* getNodedSubstrings(
00168                         const SegmentString::NonConstVect& segStrings);
00169 };
00170 
00171 inline void
00172 SegmentString::testInvariant() const
00173 {
00174         assert(pts);
00175         assert(pts->size() > 1);
00176         assert(pts->size() == npts);
00177 }
00178 
00179 std::ostream& operator<< (std::ostream& os, const SegmentString& ss);
00180 
00181 } // namespace geos.noding
00182 } // namespace geos
00183 
00184 #ifdef GEOS_INLINE
00185 # include "geos/noding/SegmentString.inl"
00186 #endif
00187 
00188 #endif
00189 
00190 /**********************************************************************
00191  * $Log$
00192  * Revision 1.10  2006/05/05 14:25:05  strk
00193  * moved getSegmentOctant out of .inl into .cpp, renamed private eiList to nodeList as in JTS, added more assertion checking and fixed doxygen comments
00194  *
00195  * Revision 1.9  2006/05/05 10:19:06  strk
00196  * droppped SegmentString::getContext(), new name is getData() to reflect change in JTS
00197  *
00198  * Revision 1.8  2006/05/04 08:29:07  strk
00199  * * source/noding/ScaledNoder.cpp: removed use of SegmentString::setCoordinates().
00200  * * source/headers/geos/noding/SegmentStrign.{h,inl}: removed new setCoordinates() interface.
00201  *
00202  * Revision 1.7  2006/05/04 07:43:44  strk
00203  * output operator for SegmentString class
00204  *
00205  * Revision 1.6  2006/05/03 18:04:49  strk
00206  * added SegmentString::setCoordinates() interface
00207  *
00208  * Revision 1.5  2006/05/03 16:19:39  strk
00209  * fit in 80 columns
00210  *
00211  * Revision 1.4  2006/05/03 15:26:02  strk
00212  * testInvariant made public and always inlined
00213  *
00214  * Revision 1.3  2006/03/24 09:52:41  strk
00215  * USE_INLINE => GEOS_INLINE
00216  *
00217  * Revision 1.2  2006/03/13 21:14:24  strk
00218  * Added missing forward declarations
00219  *
00220  * Revision 1.1  2006/03/09 16:46:49  strk
00221  * geos::geom namespace definition, first pass at headers split
00222  *
00223  **********************************************************************/
00224 

Generated on Fri Mar 27 04:53:00 2009 for GEOS by  doxygen 1.5.4