GEOS  3.3.9
LineIntersector.h
00001 /**********************************************************************
00002  * $Id: LineIntersector.h 3788 2013-03-08 18:01:29Z 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 r785 (JTS-1.13+)
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