00001 /********************************************************************** 00002 * $Id: ScaledNoder.h 2556 2009-06-06 22:22:28Z 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 * Last port: noding/ScaledNoder.java rev. 1.3 (JTS-1.7.1) 00017 * 00018 **********************************************************************/ 00019 00020 #ifndef GEOS_NODING_SCALEDNODER_H 00021 #define GEOS_NODING_SCALEDNODER_H 00022 00023 #include <geos/export.h> 00024 00025 #include <cassert> 00026 #include <vector> 00027 00028 #include <geos/inline.h> 00029 #include <geos/noding/Noder.h> // for inheritance 00030 //#include <geos/geom/CoordinateFilter.h> // for inheritance 00031 #include <geos/util.h> 00032 00033 // Forward declarations 00034 namespace geos { 00035 namespace geom { 00036 class Coordinate; 00037 class CoordinateSequence; 00038 } 00039 namespace noding { 00040 class SegmentString; 00041 } 00042 } 00043 00044 namespace geos { 00045 namespace noding { // geos.noding 00046 00057 class GEOS_DLL ScaledNoder : public Noder { // , public geom::CoordinateFilter { // implements Noder 00058 00059 private: 00060 00061 Noder& noder; 00062 00063 double scaleFactor; 00064 00065 double offsetX; 00066 00067 double offsetY; 00068 00069 bool isScaled; 00070 00071 void rescale(std::vector<SegmentString*>& segStrings) const; 00072 00073 void scale(std::vector<SegmentString*>& segStrings) const; 00074 00075 class Scaler; 00076 00077 class ReScaler; 00078 00079 friend class ScaledNoder::Scaler; 00080 00081 friend class ScaledNoder::ReScaler; 00082 00083 mutable std::vector<geom::CoordinateSequence*> newCoordSeq; 00084 00085 public: 00086 00087 bool isIntegerPrecision() { return (scaleFactor == 1.0); } 00088 00089 ScaledNoder(Noder& n, double nScaleFactor, 00090 double nOffsetX=0.0, double nOffsetY=0.0) 00091 : 00092 noder(n), 00093 scaleFactor(nScaleFactor), 00094 offsetX(nOffsetX), 00095 offsetY(nOffsetY), 00096 isScaled(nScaleFactor!=1.0) 00097 {} 00098 00099 ~ScaledNoder(); 00100 00101 std::vector<SegmentString*>* getNodedSubstrings() const; 00102 00103 void computeNodes(std::vector<SegmentString*>* inputSegStr); 00104 00105 //void filter(Coordinate& c); 00106 00107 void filter_ro(const geom::Coordinate* c) 00108 { 00109 UNREFERENCED_PARAMETER(c); 00110 assert(0); 00111 } 00112 00113 void filter_rw(geom::Coordinate* c) const; 00114 00115 }; 00116 00117 } // namespace geos.noding 00118 } // namespace geos 00119 00120 00121 //#ifdef GEOS_INLINE 00122 //# include "geos/noding/ScaledNoder.inl" 00123 //#endif 00124 00125 #endif // GEOS_NODING_SCALEDNODER_H 00126 00127 /********************************************************************** 00128 * $Log$ 00129 * Revision 1.8 2006/06/19 23:33:03 strk 00130 * Don't *require* CoordinateFilters to define both read-only and read-write methods. 00131 * 00132 * Revision 1.7 2006/05/04 06:36:00 strk 00133 * Extended definition to take new CoordinateSequence tracking into account 00134 * 00135 * Revision 1.6 2006/05/03 15:04:33 strk 00136 * removed reduntant port info 00137 * 00138 * Revision 1.5 2006/05/03 15:00:42 strk 00139 * Fixed scale() function to remove repeated points *after* rounding. Added brief doxygen class description. 00140 * 00141 * Revision 1.4 2006/05/03 09:14:22 strk 00142 * * source/operation/buffer/OffsetCurveSetBuilder.cpp: used auto_ptr to protect leaks of CoordinateSequence 00143 * * source/noding/ScaledNoder.cpp, source/headers/geos/noding/ScaledNoder.h: ported JTS bugfix in scale method. 00144 * 00145 * Revision 1.3 2006/03/24 09:52:41 strk 00146 * USE_INLINE => GEOS_INLINE 00147 * 00148 * Revision 1.2 2006/03/13 21:19:51 strk 00149 * Fixed bug in ScaledNoder scaling mechanism (hugly code, due to CoordinateSequence visitor pattern design). Tests are still failing so this possibly needs some other fix. Streamlined includes by implementation file. 00150 * 00151 * Revision 1.1 2006/03/09 16:46:49 strk 00152 * geos::geom namespace definition, first pass at headers split 00153 * 00154 **********************************************************************/ 00155
1.4.4