GEOS
3.3.6
|
00001 /********************************************************************** 00002 * $Id: PointPairDistance.h 2809 2009-12-06 01:05:24Z mloskot $ 00003 * 00004 * GEOS - Geometry Engine Open Source 00005 * http://geos.refractions.net 00006 * 00007 * Copyright (C) 2009 Sandro Santilli <strk@keybit.net> 00008 * 00009 * This is free software; you can redistribute and/or modify it under 00010 * the terms of the GNU Lesser General Public Licence as published 00011 * by the Free Software Foundation. 00012 * See the COPYING file for more information. 00013 * 00014 ********************************************************************** 00015 * 00016 * Last port: algorithm/distance/PointPairDistance.java 1.1 (JTS-1.9) 00017 * 00018 **********************************************************************/ 00019 00020 #ifndef GEOS_ALGORITHM_DISTANCE_POINTPAIRDISTANCE_H 00021 #define GEOS_ALGORITHM_DISTANCE_POINTPAIRDISTANCE_H 00022 00023 //#include <geos/geom/LineSegment.h> // for composition 00024 #include <geos/platform.h> // for DoubleNotANumber 00025 #include <geos/geom/Coordinate.h> // for inlines 00026 00027 #include <vector> // for composition 00028 #include <cassert> 00029 00030 namespace geos { 00031 namespace algorithm { 00032 namespace distance { 00033 //class PointPairDistance; 00034 } 00035 } 00036 namespace geom { 00037 //class Geometry; 00038 class Coordinate; 00039 //class LineString; 00040 //class Polygon; 00041 } 00042 } 00043 00044 namespace geos { 00045 namespace algorithm { // geos::algorithm 00046 namespace distance { // geos::algorithm::distance 00047 00053 class PointPairDistance 00054 { 00055 public: 00056 00057 PointPairDistance() 00058 : 00059 pt(2), 00060 distance(DoubleNotANumber), 00061 isNull(true) 00062 { 00063 assert(pt.size() == 2); 00064 } 00065 00066 void initialize() 00067 { 00068 isNull = true; 00069 } 00070 00071 void initialize(const geom::Coordinate& p0, const geom::Coordinate& p1) 00072 { 00073 pt[0] = p0; 00074 pt[1] = p1; 00075 distance = p0.distance(p1); 00076 isNull = false; 00077 } 00078 00079 double getDistance() const 00080 { 00081 return distance; 00082 } 00083 00084 const std::vector<geom::Coordinate>& getCoordinates() const 00085 { 00086 return pt; 00087 } 00088 00089 const geom::Coordinate& getCoordinate(unsigned int i) const 00090 { 00091 assert(i<pt.size()); 00092 return pt[i]; 00093 } 00094 00095 void setMaximum(const PointPairDistance& ptDist) 00096 { 00097 setMaximum(ptDist.pt[0], ptDist.pt[1]); 00098 } 00099 00100 void setMaximum(const geom::Coordinate& p0, const geom::Coordinate& p1) 00101 { 00102 if (isNull) { 00103 initialize(p0, p1); 00104 return; 00105 } 00106 double dist = p0.distance(p1); 00107 if (dist > distance) 00108 initialize(p0, p1, dist); 00109 } 00110 00111 void setMinimum(const PointPairDistance& ptDist) 00112 { 00113 setMinimum(ptDist.pt[0], ptDist.pt[1]); 00114 } 00115 00116 void setMinimum(const geom::Coordinate& p0, const geom::Coordinate& p1) 00117 { 00118 if (isNull) { 00119 initialize(p0, p1); 00120 return; 00121 } 00122 double dist = p0.distance(p1); 00123 if (dist < distance) 00124 initialize(p0, p1, dist); 00125 } 00126 00127 private: 00128 00135 void initialize(const geom::Coordinate& p0, const geom::Coordinate& p1, 00136 double dist) 00137 { 00138 pt[0] = p0; 00139 pt[1] = p1; 00140 distance = dist; 00141 isNull = false; 00142 } 00143 00144 std::vector<geom::Coordinate> pt; 00145 00146 double distance; 00147 00148 bool isNull; 00149 }; 00150 00151 } // geos::algorithm::distance 00152 } // geos::algorithm 00153 } // geos 00154 00155 #endif // GEOS_ALGORITHM_DISTANCE_POINTPAIRDISTANCE_H 00156 00157 /********************************************************************** 00158 * $Log$ 00159 **********************************************************************/ 00160