20 #ifndef GEOS_OP_BUFFER_OFFSETSEGMENTSTRING_H
21 #define GEOS_OP_BUFFER_OFFSETSEGMENTSTRING_H
23 #include <geos/geom/Coordinate.h>
24 #include <geos/geom/CoordinateSequence.h>
25 #include <geos/geom/CoordinateArraySequence.h>
26 #include <geos/geom/PrecisionModel.h>
43 class OffsetSegmentString {
47 geom::CoordinateArraySequence* ptList;
49 const geom::PrecisionModel* precisionModel;
57 double minimumVertexDistance;
67 isRedundant(
const geom::Coordinate& pt)
const
69 if(ptList->size() < 1) {
72 const geom::Coordinate& lastPt = ptList->back();
73 double ptDist = pt.distance(lastPt);
74 if(ptDist < minimumVertexDistance) {
83 friend std::ostream& operator<< (std::ostream& os,
const OffsetSegmentString& node);
87 ptList(new geom::CoordinateArraySequence()),
88 precisionModel(nullptr),
89 minimumVertexDistance(0.0)
108 precisionModel =
nullptr;
109 minimumVertexDistance = 0.0;
113 setPrecisionModel(
const geom::PrecisionModel* nPrecisionModel)
115 precisionModel = nPrecisionModel;
119 setMinimumVertexDistance(
double nMinVertexDistance)
121 minimumVertexDistance = nMinVertexDistance;
125 addPt(
const geom::Coordinate& pt)
127 assert(precisionModel);
129 geom::Coordinate bufPt = pt;
130 precisionModel->makePrecise(bufPt);
132 if(isRedundant(bufPt)) {
138 ptList->add(bufPt,
true);
142 addPts(
const geom::CoordinateSequence& pts,
bool isForward)
145 for(
size_t i = 0, n = pts.size(); i < n; ++i) {
150 for(
size_t i = pts.size(); i > 0; --i) {
162 if(ptList->size() < 1) {
165 const geom::Coordinate& startPt = ptList->front();
166 const geom::Coordinate& lastPt = ptList->back();
167 if(startPt.equals(lastPt)) {
171 ptList->add(startPt,
true);
182 geom::CoordinateSequence*
186 geom::CoordinateSequence* ret = ptList;
194 return ptList ? ptList->size() : 0 ;
200 operator<< (std::ostream& os,
201 const OffsetSegmentString& lst)
207 os <<
"empty (consumed?)";
217 #endif // ndef GEOS_OP_BUFFER_OFFSETSEGMENTSTRING_H