• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List

OffsetSegmentGenerator.h

00001 /**********************************************************************
00002  * $Id$
00003  *
00004  * GEOS - Geometry Engine Open Source
00005  * http://geos.refractions.net
00006  *
00007  * Copyright (C) 2011  Sandro Santilli <strk@keybit.net>
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: operation/buffer/OffsetSegmentGenerator.java r378 (JTS-1.12)
00017  *
00018  **********************************************************************/
00019 
00020 #ifndef GEOS_OP_BUFFER_OFFSETSEGMENTGENERATOR_H
00021 #define GEOS_OP_BUFFER_OFFSETSEGMENTGENERATOR_H
00022 
00023 #include <geos/export.h>
00024 
00025 #include <vector>
00026 
00027 #include <geos/algorithm/LineIntersector.h> // for composition
00028 #include <geos/geom/Coordinate.h> // for composition
00029 #include <geos/geom/LineSegment.h> // for composition
00030 #include <geos/operation/buffer/BufferParameters.h> // for composition
00031 #include <geos/operation/buffer/OffsetSegmentString.h> // for composition
00032 
00033 #ifdef _MSC_VER
00034 #pragma warning(push)
00035 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00036 #endif
00037 
00038 // Forward declarations
00039 namespace geos {
00040   namespace geom {
00041     class CoordinateSequence;
00042     class PrecisionModel;
00043   }
00044 }
00045 
00046 namespace geos {
00047 namespace operation { // geos.operation
00048 namespace buffer { // geos.operation.buffer
00049 
00062 class GEOS_DLL OffsetSegmentGenerator {
00063 
00064 public:
00065 
00066   /*
00067    * @param nBufParams buffer parameters, this object will
00068    *                   keep a reference to the passed parameters
00069    *                   so caller must make sure the object is
00070    *                   kept alive for the whole lifetime of
00071    *                   the buffer builder.
00072    */
00073   OffsetSegmentGenerator(const geom::PrecisionModel *newPrecisionModel,
00074       const BufferParameters& bufParams, double distance);
00075 
00088   bool hasNarrowConcaveAngle() const
00089   {
00090     return _hasNarrowConcaveAngle;
00091   }
00092 
00093   void initSideSegments(const geom::Coordinate &nS1,
00094                         const geom::Coordinate &nS2, int nSide);
00095 
00097         //
00104         void getCoordinates(std::vector<geom::CoordinateSequence*>& to) {
00105     to.push_back(segList.getCoordinates());
00106   }
00107 
00108         void closeRing() {
00109     segList.closeRing();
00110   }
00111 
00113   void createCircle(const geom::Coordinate &p, double distance);
00114 
00116   void createSquare(const geom::Coordinate &p, double distance);
00117 
00119   void addFirstSegment()
00120   {
00121     segList.addPt(offset1.p0);
00122   }
00123 
00125   void addLastSegment()
00126   {
00127     segList.addPt(offset1.p1);
00128   }
00129 
00130   void addNextSegment(const geom::Coordinate &p, bool addStartPoint);
00131 
00135   void addLineEndCap(const geom::Coordinate &p0,
00136                      const geom::Coordinate &p1);
00137 
00138   void addSegments(const geom::CoordinateSequence& pts, bool isForward)
00139   {
00140     segList.addPts(pts, isForward);
00141   }
00142 
00143 private:
00144 
00149   static const double OFFSET_SEGMENT_SEPARATION_FACTOR; // 1.0E-3;
00150 
00155   static const double INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR; // 1.0E-3;
00156    
00160   static const double CURVE_VERTEX_SNAP_DISTANCE_FACTOR; //  1.0E-6;
00161 
00165   static const int MAX_CLOSING_SEG_LEN_FACTOR = 80;
00166 
00171   double maxCurveSegmentError; // 0.0
00172 
00177   double filletAngleQuantum;
00178 
00196   int closingSegLengthFactor; // 1;
00197 
00199   //
00206   OffsetSegmentString segList;
00207 
00208   double distance;
00209 
00210   const geom::PrecisionModel* precisionModel;
00211 
00212   const BufferParameters& bufParams; 
00213 
00214   algorithm::LineIntersector li;
00215 
00216   geom::Coordinate s0, s1, s2;
00217 
00218   geom::LineSegment seg0;
00219 
00220   geom::LineSegment seg1;
00221 
00222   geom::LineSegment offset0;
00223 
00224   geom::LineSegment offset1;
00225 
00226   int side;
00227 
00228   bool _hasNarrowConcaveAngle; // =false
00229 
00230   void addCollinear(bool addStartPoint);
00231 
00233   //
00238   void addMitreJoin(const geom::Coordinate& p,
00239                     const geom::LineSegment& offset0,
00240                     const geom::LineSegment& offset1,
00241                     double distance);
00242 
00244   //
00253   void addLimitedMitreJoin(
00254                     const geom::LineSegment& offset0,
00255                     const geom::LineSegment& offset1,
00256                     double distance, double mitreLimit);
00257 
00261   // 
00265   void addBevelJoin(const geom::LineSegment& offset0,
00266                     const geom::LineSegment& offset1);
00267 
00268   static const double PI; //  3.14159265358979
00269 
00270   // Not in JTS, used for single-sided buffers
00271   int endCapIndex;
00272 
00273   void init(double newDistance);
00274 
00282   static const double SIMPLIFY_FACTOR; // 100.0;
00283 
00285   //
00289   void addOutsideTurn(int orientation, bool addStartPoint);
00290 
00292   //
00296   void addInsideTurn(int orientation, bool addStartPoint);
00297 
00310   void computeOffsetSegment(const geom::LineSegment& seg,
00311                             int side, double distance,
00312                             geom::LineSegment& offset);
00313 
00325   void addFillet(const geom::Coordinate &p, const geom::Coordinate &p0,
00326                  const geom::Coordinate &p1,
00327                  int direction, double radius);
00328 
00338   void addFillet(const geom::Coordinate &p, double startAngle,
00339                  double endAngle, int direction, double radius);
00340 private:
00341         // An OffsetSegmentGenerator cannot be copied because of member "const BufferParameters& bufParams"
00342         // Not declaring these functions triggers MSVC warning C4512: "assignment operator could not be generated"
00343         OffsetSegmentGenerator(const OffsetSegmentGenerator&);
00344         void operator=(const OffsetSegmentGenerator&);
00345 
00346 };
00347 
00348 } // namespace geos::operation::buffer
00349 } // namespace geos::operation
00350 } // namespace geos
00351 
00352 #ifdef _MSC_VER
00353 #pragma warning(pop)
00354 #endif
00355 
00356 #endif // ndef GEOS_OP_BUFFER_OFFSETSEGMENTGENERATOR_H
00357 

Generated on Fri Aug 3 2012 11:53:24 for GEOS by  doxygen 1.7.2