00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GEOS_ALGORITHM_CENTRALENDPOINTINTERSECTOR_H
00021 #define GEOS_ALGORITHM_CENTRALENDPOINTINTERSECTOR_H
00022
00023 #include <geos/export.h>
00024 #include <geos/geom/Coordinate.h>
00025
00026 #include <string>
00027 #include <limits>
00028
00029 #ifdef _MSC_VER
00030 #pragma warning(push)
00031 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00032 #endif
00033
00034
00035 namespace geos {
00036 namespace geom {
00037
00038 }
00039 }
00040
00041 namespace geos {
00042 namespace algorithm {
00043
00063 class GEOS_DLL CentralEndpointIntersector {
00064
00065 public:
00066
00067 static const geom::Coordinate& getIntersection(const geom::Coordinate& p00,
00068 const geom::Coordinate& p01, const geom::Coordinate& p10,
00069 const geom::Coordinate& p11)
00070 {
00071 CentralEndpointIntersector intor(p00, p01, p10, p11);
00072 return intor.getIntersection();
00073 }
00074
00075 CentralEndpointIntersector(const geom::Coordinate& p00,
00076 const geom::Coordinate& p01,
00077 const geom::Coordinate& p10,
00078 const geom::Coordinate& p11)
00079 :
00080 _pts(4)
00081 {
00082 _pts[0]=p00;
00083 _pts[1]=p01;
00084 _pts[2]=p10;
00085 _pts[3]=p11;
00086 compute();
00087 }
00088
00089 const geom::Coordinate& getIntersection() const
00090 {
00091 return _intPt;
00092 }
00093
00094
00095 private:
00096
00097
00098
00099 std::vector<geom::Coordinate> _pts;
00100
00101 geom::Coordinate _intPt;
00102
00103 void compute()
00104 {
00105 geom::Coordinate centroid = average(_pts);
00106 _intPt = findNearestPoint(centroid, _pts);
00107 }
00108
00109 static geom::Coordinate average(
00110 const std::vector<geom::Coordinate>& pts)
00111 {
00112 geom::Coordinate avg(0, 0);
00113 size_t n = pts.size();
00114 if ( ! n ) return avg;
00115 for (std::size_t i=0; i<n; ++i)
00116 {
00117 avg.x += pts[i].x;
00118 avg.y += pts[i].y;
00119 }
00120 avg.x /= n;
00121 avg.y /= n;
00122 return avg;
00123 }
00124
00135 geom::Coordinate findNearestPoint(const geom::Coordinate& p,
00136 const std::vector<geom::Coordinate>& pts) const
00137 {
00138 double minDist = std::numeric_limits<double>::max();
00139 geom::Coordinate result = geom::Coordinate::getNull();
00140 for (std::size_t i = 0, n=pts.size(); i < n; ++i) {
00141 double dist = p.distance(pts[i]);
00142 if (dist < minDist) {
00143 minDist = dist;
00144 result = pts[i];
00145 }
00146 }
00147 return result;
00148 }
00149 };
00150
00151 }
00152 }
00153
00154 #ifdef _MSC_VER
00155 #pragma warning(pop)
00156 #endif
00157
00158 #endif // GEOS_ALGORITHM_CENTRALENDPOINTINTERSECTOR_H
00159
00160
00161
00162
00163