Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

ScaledNoder.h

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 

Generated on Thu Jun 11 06:17:01 2009 for GEOS by  doxygen 1.4.4