00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GEOS_OP_BUFFER_BUFFERBUILDER_H
00023 #define GEOS_OP_BUFFER_BUFFERBUILDER_H
00024
00025 #include <geos/export.h>
00026
00027 #include <vector>
00028
00029 #include <geos/operation/buffer/BufferOp.h>
00030 #include <geos/operation/buffer/OffsetCurveBuilder.h>
00031 #include <geos/geomgraph/EdgeList.h>
00032
00033 #ifdef _MSC_VER
00034 #pragma warning(push)
00035 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00036 #endif
00037
00038
00039 namespace geos {
00040 namespace geom {
00041 class PrecisionModel;
00042 class Geometry;
00043 class GeometryFactory;
00044 }
00045 namespace algorithm {
00046 class CGAlgorithms;
00047 class LineIntersector;
00048 }
00049 namespace noding {
00050 class Noder;
00051 class SegmentString;
00052 class IntersectionAdder;
00053 }
00054 namespace geomgraph {
00055 class Edge;
00056 class Label;
00057 class PlanarGraph;
00058 }
00059 namespace operation {
00060 namespace buffer {
00061 class BufferSubgraph;
00062 }
00063 namespace overlay {
00064 class PolygonBuilder;
00065 }
00066 }
00067 }
00068
00069 namespace geos {
00070 namespace operation {
00071 namespace buffer {
00072
00090 class GEOS_DLL BufferBuilder {
00091
00092 public:
00102 BufferBuilder(const BufferParameters& nBufParams)
00103 :
00104 bufParams(nBufParams),
00105 workingPrecisionModel(NULL),
00106 li(NULL),
00107 intersectionAdder(NULL),
00108 workingNoder(NULL),
00109 geomFact(NULL),
00110 edgeList()
00111 {}
00112
00113 ~BufferBuilder();
00114
00115
00126 void setWorkingPrecisionModel(const geom::PrecisionModel *pm) {
00127 workingPrecisionModel=pm;
00128 }
00129
00137 void setNoder(noding::Noder* newNoder) { workingNoder = newNoder; }
00138
00139 geom::Geometry* buffer(const geom::Geometry *g, double distance);
00140
00141
00143 geom::Geometry* bufferLineSingleSided( const geom::Geometry* g,
00144 double distance, bool leftSide ) ;
00145
00146
00147 private:
00151 static int depthDelta(geomgraph::Label *label);
00152
00153 const BufferParameters& bufParams;
00154
00155 const geom::PrecisionModel* workingPrecisionModel;
00156
00157 algorithm::LineIntersector* li;
00158
00159 noding::IntersectionAdder* intersectionAdder;
00160
00161 noding::Noder* workingNoder;
00162
00163 const geom::GeometryFactory* geomFact;
00164
00165 geomgraph::EdgeList edgeList;
00166
00167 std::vector<geomgraph::Label *> newLabels;
00168
00169 void computeNodedEdges(std::vector<noding::SegmentString*>& bufSegStr,
00170 const geom::PrecisionModel *precisionModel);
00171
00172
00182 void insertUniqueEdge(geomgraph::Edge *e);
00183
00184 void createSubgraphs(geomgraph::PlanarGraph *graph,
00185 std::vector<BufferSubgraph*>& list);
00186
00197 void buildSubgraphs(const std::vector<BufferSubgraph*>& subgraphList,
00198 overlay::PolygonBuilder& polyBuilder);
00199
00203
00208 noding::Noder* getNoder(const geom::PrecisionModel* precisionModel);
00209
00210
00218 geom::Geometry* createEmptyResultGeometry() const;
00219
00220
00221 BufferBuilder(const BufferBuilder& other);
00222 BufferBuilder& operator=(const BufferBuilder& rhs);
00223 };
00224
00225 }
00226 }
00227 }
00228
00229 #ifdef _MSC_VER
00230 #pragma warning(pop)
00231 #endif
00232
00233 #endif // ndef GEOS_OP_BUFFER_BUFFERBUILDER_H
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244