00001 /********************************************************************** 00002 * $Id: ScaledNoder.h 2127 2008-05-20 21:25:21Z 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 #include <geos/noding/Noder.h> // for inheritance 00028 //#include <geos/geom/CoordinateFilter.h> // for inheritance 00029 #include <geos/util.h> 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) 00106 { 00107 UNREFERENCED_PARAMETER(c); 00108 assert(0); 00109 } 00110 00111 void filter_rw(geom::Coordinate* c) const; 00112 00113 }; 00114 00115 } // namespace geos.noding 00116 } // namespace geos 00117 00118 00119 //#ifdef GEOS_INLINE 00120 //# include "geos/noding/ScaledNoder.inl" 00121 //#endif 00122 00123 #endif // GEOS_NODING_SCALEDNODER_H 00124 00125 /********************************************************************** 00126 * $Log$ 00127 * Revision 1.8 2006/06/19 23:33:03 strk 00128 * Don't *require* CoordinateFilters to define both read-only and read-write methods. 00129 * 00130 * Revision 1.7 2006/05/04 06:36:00 strk 00131 * Extended definition to take new CoordinateSequence tracking into account 00132 * 00133 * Revision 1.6 2006/05/03 15:04:33 strk 00134 * removed reduntant port info 00135 * 00136 * Revision 1.5 2006/05/03 15:00:42 strk 00137 * Fixed scale() function to remove repeated points *after* rounding. Added brief doxygen class description. 00138 * 00139 * Revision 1.4 2006/05/03 09:14:22 strk 00140 * * source/operation/buffer/OffsetCurveSetBuilder.cpp: used auto_ptr to protect leaks of CoordinateSequence 00141 * * source/noding/ScaledNoder.cpp, source/headers/geos/noding/ScaledNoder.h: ported JTS bugfix in scale method. 00142 * 00143 * Revision 1.3 2006/03/24 09:52:41 strk 00144 * USE_INLINE => GEOS_INLINE 00145 * 00146 * Revision 1.2 2006/03/13 21:19:51 strk 00147 * 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. 00148 * 00149 * Revision 1.1 2006/03/09 16:46:49 strk 00150 * geos::geom namespace definition, first pass at headers split 00151 * 00152 **********************************************************************/ 00153