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

- File List

# NodedSegmentString.h

    00001 /**********************************************************************
    00002  * $Id: NodedSegmentString.h 2778 2009-12-03 19:44:00Z mloskot $
    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  *
    00017  * Last port: noding/NodedSegmentString.java rev. 1.2 (JTS-1.9)
    00018  *
    00019  **********************************************************************/
    00020
    00021 #ifndef GEOS_NODING_NODEDSEGMENTSTRING_H
    00022 #define GEOS_NODING_NODEDSEGMENTSTRING_H
    00023
    00024 #include <geos/noding/NodableSegmentString.h> // for inheritance
    00025 #include <geos/geom/CoordinateSequence.h> // for inlines
    00026 #include <geos/algorithm/LineIntersector.h>
    00027 #include <geos/noding/SegmentNode.h>
    00028 #include <geos/noding/SegmentNodeList.h>
    00029 #include <geos/noding/SegmentString.h>
    00030 //#include <geos/noding/Octant.h>
    00031 #include <geos/geom/Coordinate.h>
    00032
    00033 #ifdef _MSC_VER
    00034 #pragma warning(push)
    00035 #pragma warning(disable: 4355) // warning C4355: 'this' : used in base member initializer list
    00036 #endif
    00037
    00038 namespace geos {
    00039 namespace noding { // geos::noding
    00040
    00053 class NodedSegmentString : public NodableSegmentString
    00054 {
    00055 public:
    00056
    00057         static void getNodedSubstrings(SegmentString::ConstVect* segStrings,
    00058                         SegmentString::NonConstVect* resultEdgelist)
    00059         {
    00060                 for (size_t i=0, n=segStrings->size(); i<n; i++)
    00061                 {
    00062                         NodedSegmentString * nss = (NodedSegmentString *)((*segStrings)[i]);
    00063                         nss->getNodeList().addSplitEdges( resultEdgelist);
    00064                 }
    00065         }
    00066
    00067         static void getNodedSubstrings(
    00068                         const SegmentString::NonConstVect& segStrings,
    00069                         SegmentString::NonConstVect* resultEdgeList);
    00070
    00072         static SegmentString::NonConstVect* getNodedSubstrings(
    00073                         const SegmentString::NonConstVect& segStrings);
    00074
    00075
    00085         NodedSegmentString(geom::CoordinateSequence *newPts,
    00086                         const void* newContext)
    00087                 :
    00088                 NodableSegmentString(newContext),
    00089                 nodeList(this),
    00090                 pts(newPts)
    00091         { }
    00092
    00093         ~NodedSegmentString()
    00094         { }
    00095
    00105         SegmentNode * addIntersectionNode( geom::Coordinate * intPt, size_t segmentIndex)
    00106         {
    00107                 size_t normalizedSegmentIndex = segmentIndex;
    00108
    00109                 // normalize the intersection point location
    00110                 size_t nextSegIndex = normalizedSegmentIndex + 1;
    00111                 if (nextSegIndex < size())
    00112                 {
    00113                         const geom::Coordinate &nextPt = getCoordinate( nextSegIndex);
    00114
    00115                         // Normalize segment index if intPt falls on vertex
    00116                         // The check for point equality is 2D only - Z values are ignored
    00117                         if ( intPt->equals2D( nextPt ))
    00118                         {
    00119                                 normalizedSegmentIndex = nextSegIndex;
    00120                         }
    00121                 }
    00122
    00123                 // Add the intersection point to edge intersection list.
    00124                 SegmentNode * ei = getNodeList().add( *intPt, normalizedSegmentIndex);
    00125                 return ei;
    00126         }
    00127
    00128         SegmentNodeList& getNodeList();
    00129
    00130         const SegmentNodeList& getNodeList() const;
    00131
    00132         virtual unsigned int size() const
    00133         {
    00134                 return pts->size();
    00135         }
    00136
    00137         virtual const geom::Coordinate& getCoordinate(unsigned int i) const;
    00138
    00139         virtual geom::CoordinateSequence* getCoordinates() const;
    00140
    00141         virtual bool isClosed() const;
    00142
    00143         virtual std::ostream& print(std::ostream& os) const;
    00144
    00145
    00153         int getSegmentOctant(unsigned int index) const;
    00154
    00160         void addIntersections(algorithm::LineIntersector *li,
    00161                         unsigned int segmentIndex, int geomIndex);
    00162
    00170         void addIntersection(algorithm::LineIntersector *li,
    00171                         unsigned int segmentIndex,
    00172                         int geomIndex, int intIndex);
    00173
    00181         void addIntersection(const geom::Coordinate& intPt,
    00182                         unsigned int segmentIndex);
    00183
    00184
    00185 private:
    00186
    00187         SegmentNodeList nodeList;
    00188
    00189         geom::CoordinateSequence *pts;
    00190
    00191 };
    00192
    00193 } // namespace geos::noding
    00194 } // namespace geos
    00195
    00196 #ifdef _MSC_VER
    00197 #pragma warning(pop)
    00198 #endif
    00199
    00200 #endif // GEOS_NODING_NODEDSEGMENTSTRING_H
    00201 /**********************************************************************
    00202  * $Log$
    00203  **********************************************************************/
    00204