00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GEOS_ALGORITHM_LINEINTERSECTOR_H
00022 #define GEOS_ALGORITHM_LINEINTERSECTOR_H
00023
00024 #include <geos/export.h>
00025 #include <string>
00026
00027 #include <geos/geom/Coordinate.h>
00028
00029
00030 namespace geos {
00031 namespace geom {
00032 class PrecisionModel;
00033 }
00034 }
00035
00036 namespace geos {
00037 namespace algorithm {
00038
00050 class GEOS_DLL LineIntersector {
00051 public:
00052
00056 static double interpolateZ(const geom::Coordinate &p, const geom::Coordinate &p0, const geom::Coordinate &p1);
00057
00058
00060
00077 static double computeEdgeDistance(const geom::Coordinate& p, const geom::Coordinate& p0, const geom::Coordinate& p1);
00078
00079 static double nonRobustComputeEdgeDistance(const geom::Coordinate& p,const geom::Coordinate& p1,const geom::Coordinate& p2);
00080
00081 LineIntersector(const geom::PrecisionModel* initialPrecisionModel=NULL)
00082 :
00083 precisionModel(initialPrecisionModel),
00084 result(0)
00085 {}
00086
00087 ~LineIntersector() {}
00088
00096 bool isInteriorIntersection();
00097
00105 bool isInteriorIntersection(int inputLineIndex);
00106
00108
00113 void setPrecisionModel(const geom::PrecisionModel *newPM) {
00114 precisionModel=newPM;
00115 }
00116
00118
00123 void computeIntersection(const geom::Coordinate& p, const geom::Coordinate& p1, const geom::Coordinate& p2);
00124
00126 static bool hasIntersection(const geom::Coordinate& p,const geom::Coordinate& p1,const geom::Coordinate& p2);
00127
00128
00129 enum {
00130 DONT_INTERSECT=0,
00131 DO_INTERSECT=1,
00132 COLLINEAR=2
00133 };
00134
00135 enum {
00137 NO_INTERSECTION=0,
00138
00140 POINT_INTERSECTION=1,
00141
00143 COLLINEAR_INTERSECTION=2
00144 };
00145
00147 void computeIntersection(const geom::Coordinate& p1, const geom::Coordinate& p2,
00148 const geom::Coordinate& p3, const geom::Coordinate& p4);
00149
00150 std::string toString() const;
00151
00157 bool hasIntersection() const { return result!=NO_INTERSECTION; }
00158
00160
00163 int getIntersectionNum() const { return result; }
00164
00165
00167
00172 const geom::Coordinate& getIntersection(int intIndex) const {
00173 return intPt[intIndex];
00174 }
00175
00177
00180 static bool isSameSignAndNonZero(double a,double b);
00181
00192 bool isIntersection(const geom::Coordinate& pt) const;
00193
00208 bool isProper() const {
00209 return hasIntersection()&&isProperVar;
00210 }
00211
00222 const geom::Coordinate& getIntersectionAlongSegment(int segmentIndex,int intIndex);
00223
00233 int getIndexAlongSegment(int segmentIndex,int intIndex);
00234
00244 double getEdgeDistance(int geomIndex,int intIndex) const;
00245
00246 private:
00247
00248 void intersectionWithNormalization(const geom::Coordinate& p1,
00249 const geom::Coordinate& p2,
00250 const geom::Coordinate& q1,
00251 const geom::Coordinate& q2,
00252 geom::Coordinate &ret) const;
00253
00258 const geom::PrecisionModel *precisionModel;
00259
00260 int result;
00261
00262 const geom::Coordinate *inputLines[2][2];
00263
00268 geom::Coordinate intPt[2];
00269
00274 int intLineIndex[2][2];
00275
00276 bool isProperVar;
00277
00278
00279
00280 bool isCollinear() const { return result==COLLINEAR_INTERSECTION; }
00281
00282 int computeIntersect(const geom::Coordinate& p1,const geom::Coordinate& p2,const geom::Coordinate& q1,const geom::Coordinate& q2);
00283
00284 bool isEndPoint() const {
00285 return hasIntersection()&&!isProperVar;
00286 }
00287
00288 void computeIntLineIndex();
00289
00290 void computeIntLineIndex(int segmentIndex);
00291
00292 int computeCollinearIntersection(const geom::Coordinate& p1,
00293 const geom::Coordinate& p2, const geom::Coordinate& q1,
00294 const geom::Coordinate& q2);
00295
00305 void intersection(const geom::Coordinate& p1,
00306 const geom::Coordinate& p2,
00307 const geom::Coordinate& q1,
00308 const geom::Coordinate& q2,
00309 geom::Coordinate &ret) const;
00310
00311 double smallestInAbsValue(double x1, double x2,
00312 double x3, double x4) const;
00313
00324 bool isInSegmentEnvelopes(const geom::Coordinate& intPt) const;
00325
00337 void normalizeToEnvCentre(geom::Coordinate &n00, geom::Coordinate &n01,
00338 geom::Coordinate &n10, geom::Coordinate &n11,
00339 geom::Coordinate &normPt) const;
00340
00353 void safeHCoordinateIntersection(const geom::Coordinate& p1,
00354 const geom::Coordinate& p2,
00355 const geom::Coordinate& q1,
00356 const geom::Coordinate& q2,
00357 geom::Coordinate& intPt) const;
00358
00359 };
00360
00361 }
00362 }
00363
00364
00365 #endif // GEOS_ALGORITHM_LINEINTERSECTOR_H
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379