TaggedLineStringSimplifier.h

00001 /**********************************************************************
00002  * $Id: TaggedLineStringSimplifier.h 1820 2006-09-06 16:54:23Z 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 Licence as published
00011  * by the Free Software Foundation. 
00012  * See the COPYING file for more information.
00013  *
00014  **********************************************************************
00015  *
00016  * Last port: simplify/TaggedLineStringSimplifier.java rev. 1.8 (JTS-1.7.1)
00017  *
00018  **********************************************************************
00019  *
00020  * NOTES: This class can be optimized to work with vector<Coordinate*>
00021  *        rather then with CoordinateSequence
00022  *
00023  **********************************************************************/
00024 
00025 #ifndef _GEOS_SIMPLIFY_TAGGEDLINESTRINGSIMPLIFIER_H_
00026 #define _GEOS_SIMPLIFY_TAGGEDLINESTRINGSIMPLIFIER_H_ 
00027 
00028 #include <vector>
00029 #include <memory>
00030 
00031 // Forward declarations
00032 namespace geos {
00033         namespace algorithm {
00034                 class LineIntersector;
00035         }
00036         namespace geom {
00037                 class CoordinateSequence;
00038                 class LineSegment;
00039         }
00040         namespace simplify {
00041                 class TaggedLineSegment;
00042                 class TaggedLineString;
00043                 class LineSegmentIndex;
00044         }
00045 }
00046 
00047 namespace geos {
00048 namespace simplify { // geos::simplify
00049 
00050 
00057 class TaggedLineStringSimplifier {
00058 
00059 public:
00060 
00061         TaggedLineStringSimplifier(LineSegmentIndex* inputIndex,
00062                 LineSegmentIndex* outputIndex);
00063 
00072         void setDistanceTolerance(double d);
00073 
00074         void simplify(TaggedLineString* line);
00075 
00076 
00077 private:
00078 
00079         // externally owned
00080         LineSegmentIndex* inputIndex;
00081 
00082         // externally owned
00083         LineSegmentIndex* outputIndex;
00084 
00085         std::auto_ptr<algorithm::LineIntersector> li;
00086 
00088         TaggedLineString* line;
00089 
00090         const geom::CoordinateSequence* linePts;
00091 
00092         double distanceTolerance;
00093 
00094         void simplifySection(size_t i, size_t j,
00095                         size_t depth);
00096 
00097         static size_t findFurthestPoint(
00098                         const geom::CoordinateSequence* pts,
00099                         size_t i, size_t j,
00100                         double& maxDistance);
00101 
00102         bool hasBadIntersection(const TaggedLineString* parentLine,
00103                        const std::vector<size_t>& sectionIndex,
00104                        const geom::LineSegment& candidateSeg);
00105 
00106         bool hasBadInputIntersection(const TaggedLineString* parentLine,
00107                        const std::vector<size_t>& sectionIndex,
00108                        const geom::LineSegment& candidateSeg);
00109 
00110         bool hasBadOutputIntersection(const geom::LineSegment& candidateSeg);
00111 
00112         bool hasInteriorIntersection(const geom::LineSegment& seg0,
00113                         const geom::LineSegment& seg1) const;
00114 
00115         std::auto_ptr<TaggedLineSegment> flatten(
00116                         size_t start, size_t end);
00117 
00126         static bool isInLineSection(
00127                 const TaggedLineString* parentLine,
00128                 const std::vector<size_t>& sectionIndex,
00129                 const TaggedLineSegment* seg);
00130 
00139         void remove(const TaggedLineString* line,
00140                         size_t start,
00141                         size_t end);
00142  
00143 };
00144 
00145 inline void
00146 TaggedLineStringSimplifier::setDistanceTolerance(double d)
00147 {
00148         distanceTolerance = d;
00149 }
00150 
00151 } // namespace geos::simplify
00152 } // namespace geos
00153 
00154 #endif // _GEOS_SIMPLIFY_TAGGEDLINESTRINGSIMPLIFIER_H_ 
00155 
00156 /**********************************************************************
00157  * $Log$
00158  * Revision 1.3  2006/04/13 21:52:34  strk
00159  * Many debugging lines and assertions added. Fixed bug in TaggedLineString class.
00160  *
00161  * Revision 1.2  2006/04/13 10:39:12  strk
00162  * Initial implementation of TaggedLinesSimplifier class
00163  *
00164  * Revision 1.1  2006/04/12 17:19:57  strk
00165  * Ported TaggedLineStringSimplifier class, made LineSegment class
00166  * polymorphic to fix derivation of TaggedLineSegment
00167  *
00168  **********************************************************************/

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