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