GEOS 3.4.2

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

- File List

OffsetSegmentGenerator.h
1 /**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2011 Sandro Santilli <strk@keybit.net>
7 *
8 * This is free software; you can redistribute and/or modify it under
9 * the terms of the GNU Lesser General Public Licence as published
10 * by the Free Software Foundation.
11 * See the COPYING file for more information.
12 *
13 **********************************************************************
14 *
15 * Last port: operation/buffer/OffsetSegmentGenerator.java r378 (JTS-1.12)
16 *
17 **********************************************************************/
18
19 #ifndef GEOS_OP_BUFFER_OFFSETSEGMENTGENERATOR_H
20 #define GEOS_OP_BUFFER_OFFSETSEGMENTGENERATOR_H
21
22 #include <geos/export.h>
23
24 #include <vector>
25
26 #include <geos/algorithm/LineIntersector.h> // for composition
27 #include <geos/geom/Coordinate.h> // for composition
28 #include <geos/geom/LineSegment.h> // for composition
29 #include <geos/operation/buffer/BufferParameters.h> // for composition
30 #include <geos/operation/buffer/OffsetSegmentString.h> // for composition
31
32 #ifdef _MSC_VER
33 #pragma warning(push)
34 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
35 #endif
36
37 // Forward declarations
38 namespace geos {
39 namespace geom {
40 class CoordinateSequence;
41 class PrecisionModel;
42 }
43 }
44
45 namespace geos {
46 namespace operation { // geos.operation
47 namespace buffer { // geos.operation.buffer
48
61 class GEOS_DLL OffsetSegmentGenerator {
62
63 public:
64
65 /*
66 * @param nBufParams buffer parameters, this object will
67 * keep a reference to the passed parameters
68 * so caller must make sure the object is
69 * kept alive for the whole lifetime of
70 * the buffer builder.
71 */
72 OffsetSegmentGenerator(const geom::PrecisionModel *newPrecisionModel,
73 const BufferParameters& bufParams, double distance);
74
87 bool hasNarrowConcaveAngle() const
88 {
89 return _hasNarrowConcaveAngle;
90 }
91
92 void initSideSegments(const geom::Coordinate &nS1,
93 const geom::Coordinate &nS2, int nSide);
94
96 //
103 void getCoordinates(std::vector<geom::CoordinateSequence*>& to) {
104 to.push_back(segList.getCoordinates());
105 }
106
107 void closeRing() {
108 segList.closeRing();
109 }
110
112 void createCircle(const geom::Coordinate &p, double distance);
113
115 void createSquare(const geom::Coordinate &p, double distance);
116
118 void addFirstSegment()
119 {
120 segList.addPt(offset1.p0);
121 }
122
124 void addLastSegment()
125 {
126 segList.addPt(offset1.p1);
127 }
128
129 void addNextSegment(const geom::Coordinate &p, bool addStartPoint);
130
134 void addLineEndCap(const geom::Coordinate &p0,
135 const geom::Coordinate &p1);
136
137 void addSegments(const geom::CoordinateSequence& pts, bool isForward)
138 {
139 segList.addPts(pts, isForward);
140 }
141
142 private:
143
148 static const double OFFSET_SEGMENT_SEPARATION_FACTOR; // 1.0E-3;
149
154 static const double INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR; // 1.0E-3;
155
159 static const double CURVE_VERTEX_SNAP_DISTANCE_FACTOR; // 1.0E-6;
160
164 static const int MAX_CLOSING_SEG_LEN_FACTOR = 80;
165
170 double maxCurveSegmentError; // 0.0
171
176 double filletAngleQuantum;
177
195 int closingSegLengthFactor; // 1;
196
198 //
205 OffsetSegmentString segList;
206
207 double distance;
208
209 const geom::PrecisionModel* precisionModel;
210
211 const BufferParameters& bufParams;
212
213 algorithm::LineIntersector li;
214
215 geom::Coordinate s0, s1, s2;
216
217 geom::LineSegment seg0;
218
219 geom::LineSegment seg1;
220
221 geom::LineSegment offset0;
222
223 geom::LineSegment offset1;
224
225 int side;
226
227 bool _hasNarrowConcaveAngle; // =false
228
229 void addCollinear(bool addStartPoint);
230
232 //
237 void addMitreJoin(const geom::Coordinate& p,
238 const geom::LineSegment& offset0,
239 const geom::LineSegment& offset1,
240 double distance);
241
243 //
252 void addLimitedMitreJoin(
253 const geom::LineSegment& offset0,
254 const geom::LineSegment& offset1,
255 double distance, double mitreLimit);
256
260 //
264 void addBevelJoin(const geom::LineSegment& offset0,
265 const geom::LineSegment& offset1);
266
267 static const double PI; // 3.14159265358979
268
269 // Not in JTS, used for single-sided buffers
270 int endCapIndex;
271
272 void init(double newDistance);
273
281 static const double SIMPLIFY_FACTOR; // 100.0;
282
284 //
288 void addOutsideTurn(int orientation, bool addStartPoint);
289
291 //
295 void addInsideTurn(int orientation, bool addStartPoint);
296
309 void computeOffsetSegment(const geom::LineSegment& seg,
310 int side, double distance,
311 geom::LineSegment& offset);
312
324 void addFillet(const geom::Coordinate &p, const geom::Coordinate &p0,
325 const geom::Coordinate &p1,
326 int direction, double radius);
327
337 void addFillet(const geom::Coordinate &p, double startAngle,
338 double endAngle, int direction, double radius);
339 private:
340 // An OffsetSegmentGenerator cannot be copied because of member "const BufferParameters& bufParams"
341 // Not declaring these functions triggers MSVC warning C4512: "assignment operator could not be generated"
342 OffsetSegmentGenerator(const OffsetSegmentGenerator&);
343 void operator=(const OffsetSegmentGenerator&);
344
345 };
346
347 } // namespace geos::operation::buffer
348 } // namespace geos::operation
349 } // namespace geos
350
351 #ifdef _MSC_VER
352 #pragma warning(pop)
353 #endif
354
355 #endif // ndef GEOS_OP_BUFFER_OFFSETSEGMENTGENERATOR_H
356