ScaledNoder.h

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 

Generated on Fri Mar 27 04:52:59 2009 for GEOS by  doxygen 1.5.4