00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GEOS_OP_BUFFER_OFFSETCURVEBUILDER_H
00021 #define GEOS_OP_BUFFER_OFFSETCURVEBUILDER_H
00022
00023 #include <geos/export.h>
00024
00025 #include <geos/operation/buffer/BufferParameters.h>
00026 #include <geos/operation/buffer/OffsetSegmentGenerator.h>
00027
00028 #include <vector>
00029 #include <memory>
00030
00031 #ifdef _MSC_VER
00032 #pragma warning(push)
00033 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00034 #endif
00035
00036
00037 namespace geos {
00038 namespace geom {
00039 class CoordinateSequence;
00040 class PrecisionModel;
00041 }
00042 }
00043
00044 namespace geos {
00045 namespace operation {
00046 namespace buffer {
00047
00062 class GEOS_DLL OffsetCurveBuilder {
00063 public:
00064
00065
00066
00067
00068
00069
00070
00071
00072 OffsetCurveBuilder(const geom::PrecisionModel *newPrecisionModel,
00073 const BufferParameters& nBufParams)
00074 :
00075 distance(0.0),
00076 precisionModel(newPrecisionModel),
00077 bufParams(nBufParams)
00078 {}
00079
00085 const BufferParameters& getBufferParameters() const
00086 {
00087 return bufParams;
00088 }
00089
00099 void getLineCurve(const geom::CoordinateSequence* inputPts,
00100 double distance,
00101 std::vector<geom::CoordinateSequence*>& lineList);
00102
00119 void getSingleSidedLineCurve(const geom::CoordinateSequence* inputPts,
00120 double distance, std::vector<geom::CoordinateSequence*>& lineList,
00121 bool leftSide, bool rightSide ) ;
00122
00130 void getRingCurve(const geom::CoordinateSequence *inputPts, int side,
00131 double distance,
00132 std::vector<geom::CoordinateSequence*>& lineList);
00133
00134
00135 private:
00136
00137 double distance;
00138
00139 const geom::PrecisionModel* precisionModel;
00140
00141 const BufferParameters& bufParams;
00142
00150 static const double SIMPLIFY_FACTOR;
00151
00159 double simplifyTolerance(double bufDistance);
00160
00161 void computeLineBufferCurve(const geom::CoordinateSequence& inputPts,
00162 OffsetSegmentGenerator& segGen);
00163
00164 void computeSingleSidedBufferCurve(const geom::CoordinateSequence& inputPts,
00165 bool isRightSide,
00166 OffsetSegmentGenerator& segGen);
00167
00168 void computeRingBufferCurve(const geom::CoordinateSequence& inputPts,
00169 int side, OffsetSegmentGenerator& segGen);
00170
00171 std::auto_ptr<OffsetSegmentGenerator> getSegGen(double dist);
00172
00173 void computePointCurve(const geom::Coordinate& pt,
00174 OffsetSegmentGenerator& segGen);
00175
00176
00177
00178 OffsetCurveBuilder(const OffsetCurveBuilder& other);
00179 OffsetCurveBuilder& operator=(const OffsetCurveBuilder& rhs);
00180 };
00181
00182 }
00183 }
00184 }
00185
00186 #ifdef _MSC_VER
00187 #pragma warning(pop)
00188 #endif
00189
00190 #endif // ndef GEOS_OP_BUFFER_OFFSETCURVEBUILDER_H
00191