- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List

# OffsetCurveBuilder.h

    00001 /**********************************************************************
    00002  * $Id: OffsetCurveBuilder.h 2779 2009-12-03 19:45:53Z mloskot $
    00003  *
    00004  * GEOS - Geometry Engine Open Source
    00005  * http://geos.refractions.net
    00006  *
    00007  * Copyright (C) 2009  Sandro Santilli <strk@keybit.net>
    00008  * Copyright (C) 2006-2007 Refractions Research Inc.
    00009  *
    00010  * This is free software; you can redistribute and/or modify it under
    00011  * the terms of the GNU Lesser General Public Licence as published
    00012  * by the Free Software Foundation.
    00013  * See the COPYING file for more information.
    00014  *
    00015  **********************************************************************
    00016  *
    00017  * Last port: operation/buffer/OffsetCurveBuilder.java rev. 1.30 (JTS-1.10)
    00018  *
    00019  **********************************************************************/
    00020
    00021 #ifndef GEOS_OP_BUFFER_OFFSETCURVEBUILDER_H
    00022 #define GEOS_OP_BUFFER_OFFSETCURVEBUILDER_H
    00023
    00024 #include <geos/export.h>
    00025
    00026 #include <vector>
    00027
    00028 #include <geos/algorithm/LineIntersector.h> // for composition
    00029 #include <geos/geom/Coordinate.h> // for composition
    00030 #include <geos/geom/LineSegment.h> // for composition
    00031 #include <geos/operation/buffer/BufferParameters.h> // for composition
    00032
    00033 // Forward declarations
    00034 namespace geos {
    00035         namespace geom {
    00036                 class CoordinateSequence;
    00037                 class PrecisionModel;
    00038         }
    00039         namespace operation {
    00040                 namespace buffer {
    00041                         class OffsetCurveVertexList;
    00042                 }
    00043         }
    00044 }
    00045
    00046 namespace geos {
    00047 namespace operation { // geos.operation
    00048 namespace buffer { // geos.operation.buffer
    00049
    00066 class GEOS_DLL OffsetCurveBuilder {
    00067 public:
    00068
    00069         /*
    00070          * @param nBufParams buffer parameters, this object will
    00071          *                   keep a reference to the passed parameters
    00072          *                   so caller must make sure the object is
    00073          *                   kept alive for the whole lifetime of
    00074          *                   the buffer builder.
    00075          */
    00076         OffsetCurveBuilder(const geom::PrecisionModel *newPrecisionModel,
    00077                         const BufferParameters& bufParams);
    00078
    00079         ~OffsetCurveBuilder();
    00080
    00090         void getLineCurve(const geom::CoordinateSequence* inputPts,
    00091                           double distance,
    00092                           std::vector<geom::CoordinateSequence*>& lineList);
    00093
    00110         void getSingleSidedLineCurve(const geom::CoordinateSequence* inputPts,
    00111              double distance, std::vector<geom::CoordinateSequence*>& lineList,
    00112              bool leftSide, bool rightSide ) ;
    00113
    00121         void getRingCurve(const geom::CoordinateSequence *inputPts, int side,
    00122                           double distance,
    00123                           std::vector<geom::CoordinateSequence*>& lineList);
    00124
    00125
    00126 private:
    00127
    00129         //
    00134         void addMitreJoin(const geom::Coordinate& p,
    00135                           const geom::LineSegment& offset0,
    00136                           const geom::LineSegment& offset1,
    00137                           double distance);
    00138
    00140         //
    00149         void addLimitedMitreJoin(
    00150                           const geom::LineSegment& offset0,
    00151                           const geom::LineSegment& offset1,
    00152                           double distance, double mitreLimit);
    00153
    00157         //
    00161         void addBevelJoin(const geom::LineSegment& offset0,
    00162                           const geom::LineSegment& offset1);
    00163
    00164
    00168         static const double CURVE_VERTEX_SNAP_DISTANCE_FACTOR; //  1.0E-6;
    00169
    00170         static const double PI; //  3.14159265358979
    00171
    00172         static const double MAX_CLOSING_SEG_LEN; // 3.0
    00173
    00178         static const double OFFSET_SEGMENT_SEPARATION_FACTOR; // 1.0E-3;
    00179
    00184         static const double INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR; // 1.0E-3;
    00185
    00190         static const int MAX_CLOSING_SEG_FRACTION = 80;
    00191
    00192         algorithm::LineIntersector li;
    00193
    00198         double filletAngleQuantum;
    00199
    00204         double maxCurveSegmentError;
    00205
    00207         //
    00214         OffsetCurveVertexList* vertexList;
    00215
    00216         double distance;
    00217
    00218         const geom::PrecisionModel* precisionModel;
    00219
    00220         const BufferParameters& bufParams;
    00221
    00239         int closingSegFactor; // 1;
    00240
    00241         geom::Coordinate s0, s1, s2;
    00242
    00243         geom::LineSegment seg0;
    00244
    00245         geom::LineSegment seg1;
    00246
    00247         geom::LineSegment offset0;
    00248
    00249         geom::LineSegment offset1;
    00250
    00251         int side;
    00252
    00253         // Not in JTS, used for single-sided buffers
    00254         int endCapIndex;
    00255
    00256         void init(double newDistance);
    00257
    00265         static const double SIMPLIFY_FACTOR; // 100.0;
    00266
    00274         double simplifyTolerance(double bufDistance);
    00275
    00276         void computeLineBufferCurve(const geom::CoordinateSequence& inputPts);
    00277
    00278         void computeRingBufferCurve(const geom::CoordinateSequence& inputPts,
    00279                                     int side);
    00280
    00281         void initSideSegments(const geom::Coordinate &nS1,
    00282                               const geom::Coordinate &nS2, int nSide);
    00283
    00284         void addNextSegment(const geom::Coordinate &p, bool addStartPoint);
    00285
    00286         void addCollinear(bool addStartPoint);
    00287
    00289         //
    00293         void addOutsideTurn(int orientation, bool addStartPoint);
    00294
    00296         //
    00300         void addInsideTurn(int orientation, bool addStartPoint);
    00301
    00303         void addLastSegment();
    00304
    00317         void computeOffsetSegment(const geom::LineSegment& seg,
    00318                                   int side, double distance,
    00319                                   geom::LineSegment& offset);
    00320
    00324         void addLineEndCap(const geom::Coordinate &p0,
    00325                            const geom::Coordinate &p1);
    00326
    00338         void addFillet(const geom::Coordinate &p, const geom::Coordinate &p0,
    00339                        const geom::Coordinate &p1,
    00340                        int direction, double radius);
    00341
    00351         void addFillet(const geom::Coordinate &p, double startAngle,
    00352                        double endAngle, int direction, double radius);
    00353
    00355         void addCircle(const geom::Coordinate &p, double distance);
    00356
    00358         void addSquare(const geom::Coordinate &p, double distance);
    00359
    00360     std::vector<OffsetCurveVertexList*> vertexLists;
    00361
    00362     // Declare type as noncopyable
    00363     OffsetCurveBuilder(const OffsetCurveBuilder& other);
    00364     OffsetCurveBuilder& operator=(const OffsetCurveBuilder& rhs);
    00365 };
    00366
    00367 } // namespace geos::operation::buffer
    00368 } // namespace geos::operation
    00369 } // namespace geos
    00370
    00371 #endif // ndef GEOS_OP_BUFFER_OFFSETCURVEBUILDER_H
    00372
    00373 /**********************************************************************
    00374  * $Log$
    00375  * Revision 1.2  2006/03/27 17:04:17  strk
    00376  * Cleanups and explicit initializations
    00377  *
    00378  * Revision 1.1  2006/03/14 00:19:40  strk
    00379  * opBuffer.h split, streamlined headers in some (not all) files in operation/buffer/
    00380  *
    00381  **********************************************************************/
    00382