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
48 geom::CoordinateArraySequence* ptList;
50 const geom::PrecisionModel* precisionModel;
58 double minimumVertexDistance;
67 bool isRedundant(
const geom::Coordinate& pt)
const
69 if (ptList->size() < 1)
71 const geom::Coordinate& lastPt = ptList->back();
72 double ptDist = pt.distance(lastPt);
73 if (ptDist < minimumVertexDistance)
81 friend std::ostream& operator<< (std::ostream& os,
const OffsetSegmentString& node);
85 ptList(new geom::CoordinateArraySequence()),
87 minimumVertexDistance (0.0)
91 ~OffsetSegmentString()
98 if ( ptList ) ptList->clear();
101 precisionModel = NULL;
102 minimumVertexDistance = 0.0;
107 precisionModel = nPrecisionModel;
110 void setMinimumVertexDistance(
double nMinVertexDistance)
112 minimumVertexDistance = nMinVertexDistance;
115 void addPt(
const geom::Coordinate& pt)
117 assert(precisionModel);
119 geom::Coordinate bufPt = pt;
120 precisionModel->makePrecise(bufPt);
122 if (isRedundant(bufPt))
129 ptList->add(bufPt,
true);
132 void addPts(
const geom::CoordinateSequence& pts,
bool isForward)
135 for (
size_t i=0, n=pts.size(); i<n; ++i) {
139 for (
size_t i=pts.size(); i>0; --i) {
150 if (ptList->size() < 1)
return;
151 const geom::Coordinate& startPt = ptList->front();
152 const geom::Coordinate& lastPt = ptList->back();
153 if (startPt.equals(lastPt))
return;
155 ptList->add(startPt,
true);
169 geom::CoordinateSequence* ret = ptList;
174 inline size_t size()
const {
return ptList ? ptList->size() : 0 ; }
178 inline std::ostream& operator<< (std::ostream& os,
179 const OffsetSegmentString& lst)
187 os <<
"empty (consumed?)";
197 #endif // ndef GEOS_OP_BUFFER_OFFSETSEGMENTSTRING_H