GEOS 3.3.1
|
00001 /********************************************************************** 00002 * $Id: LineIntersector.h 3406 2011-07-05 09:44:10Z strk $ 00003 * 00004 * GEOS - Geometry Engine Open Source 00005 * http://geos.refractions.net 00006 * 00007 * Copyright (C) 2005-2006 Refractions Research Inc. 00008 * Copyright (C) 2001-2002 Vivid Solutions Inc. 00009 * 00010 * This is free software; you can redistribute and/or modify it under 00011 * the terms of the GNU Lesser General Public Licence as published 00012 * by the Free Software Foundation. 00013 * See the COPYING file for more information. 00014 * 00015 ********************************************************************** 00016 * 00017 * Last port: algorithm/RobustLineIntersector.java rev. 1.38 (JTS-1.10) 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 // Forward declarations 00030 namespace geos { 00031 namespace geom { 00032 class PrecisionModel; 00033 } 00034 } 00035 00036 namespace geos { 00037 namespace algorithm { // geos::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 isProperVar(false) 00086 {} 00087 00088 ~LineIntersector() {} 00089 00097 bool isInteriorIntersection(); 00098 00106 bool isInteriorIntersection(int inputLineIndex); 00107 00109 // 00114 void setPrecisionModel(const geom::PrecisionModel *newPM) { 00115 precisionModel=newPM; 00116 } 00117 00119 // 00124 void computeIntersection(const geom::Coordinate& p, const geom::Coordinate& p1, const geom::Coordinate& p2); 00125 00127 static bool hasIntersection(const geom::Coordinate& p,const geom::Coordinate& p1,const geom::Coordinate& p2); 00128 00129 // These are deprecated, due to ambiguous naming 00130 enum { 00131 DONT_INTERSECT=0, 00132 DO_INTERSECT=1, 00133 COLLINEAR=2 00134 }; 00135 00136 enum { 00138 NO_INTERSECTION=0, 00139 00141 POINT_INTERSECTION=1, 00142 00144 COLLINEAR_INTERSECTION=2 00145 }; 00146 00148 void computeIntersection(const geom::Coordinate& p1, const geom::Coordinate& p2, 00149 const geom::Coordinate& p3, const geom::Coordinate& p4); 00150 00151 std::string toString() const; 00152 00158 bool hasIntersection() const { return result!=NO_INTERSECTION; } 00159 00161 // 00164 int getIntersectionNum() const { return result; } 00165 00166 00168 // 00173 const geom::Coordinate& getIntersection(int intIndex) const { 00174 return intPt[intIndex]; 00175 } 00176 00178 // 00181 static bool isSameSignAndNonZero(double a,double b); 00182 00193 bool isIntersection(const geom::Coordinate& pt) const; 00194 00209 bool isProper() const { 00210 return hasIntersection()&&isProperVar; 00211 } 00212 00223 const geom::Coordinate& getIntersectionAlongSegment(int segmentIndex,int intIndex); 00224 00234 int getIndexAlongSegment(int segmentIndex,int intIndex); 00235 00245 double getEdgeDistance(int geomIndex,int intIndex) const; 00246 00247 private: 00248 00249 void intersectionWithNormalization(const geom::Coordinate& p1, 00250 const geom::Coordinate& p2, 00251 const geom::Coordinate& q1, 00252 const geom::Coordinate& q2, 00253 geom::Coordinate &ret) const; 00254 00259 const geom::PrecisionModel *precisionModel; 00260 00261 int result; 00262 00263 const geom::Coordinate *inputLines[2][2]; 00264 00269 geom::Coordinate intPt[2]; 00270 00275 int intLineIndex[2][2]; 00276 00277 bool isProperVar; 00278 //Coordinate &pa; 00279 //Coordinate &pb; 00280 00281 bool isCollinear() const { return result==COLLINEAR_INTERSECTION; } 00282 00283 int computeIntersect(const geom::Coordinate& p1,const geom::Coordinate& p2,const geom::Coordinate& q1,const geom::Coordinate& q2); 00284 00285 bool isEndPoint() const { 00286 return hasIntersection()&&!isProperVar; 00287 } 00288 00289 void computeIntLineIndex(); 00290 00291 void computeIntLineIndex(int segmentIndex); 00292 00293 int computeCollinearIntersection(const geom::Coordinate& p1, 00294 const geom::Coordinate& p2, const geom::Coordinate& q1, 00295 const geom::Coordinate& q2); 00296 00306 void intersection(const geom::Coordinate& p1, 00307 const geom::Coordinate& p2, 00308 const geom::Coordinate& q1, 00309 const geom::Coordinate& q2, 00310 geom::Coordinate &ret) const; 00311 00312 double smallestInAbsValue(double x1, double x2, 00313 double x3, double x4) const; 00314 00325 bool isInSegmentEnvelopes(const geom::Coordinate& intPt) const; 00326 00338 void normalizeToEnvCentre(geom::Coordinate &n00, geom::Coordinate &n01, 00339 geom::Coordinate &n10, geom::Coordinate &n11, 00340 geom::Coordinate &normPt) const; 00341 00354 void safeHCoordinateIntersection(const geom::Coordinate& p1, 00355 const geom::Coordinate& p2, 00356 const geom::Coordinate& q1, 00357 const geom::Coordinate& q2, 00358 geom::Coordinate& intPt) const; 00359 00360 }; 00361 00362 } // namespace geos::algorithm 00363 } // namespace geos 00364 00365 00366 #endif // GEOS_ALGORITHM_LINEINTERSECTOR_H 00367 00368 /********************************************************************** 00369 * $Log$ 00370 * Revision 1.3 2006/04/20 14:16:25 strk 00371 * Added some more doxygen comments 00372 * 00373 * Revision 1.2 2006/04/06 21:31:40 strk 00374 * Const correctness for debugging function 00375 * 00376 * Revision 1.1 2006/03/09 16:46:48 strk 00377 * geos::geom namespace definition, first pass at headers split 00378 * 00379 **********************************************************************/ 00380