- Main Page
- Namespaces
- Classes
- Files
- Related Pages

# CentralEndpointIntersector.h

    00001 /**********************************************************************
    00002  * $Id: LineIntersector.h 1820 2006-09-06 16:54:23Z mloskot $
    00003  *
    00004  * GEOS - Geometry Engine Open Source
    00005  * http://geos.refractions.net
    00006  *
    00007  * Copyright (C) 2006 Refractions Research Inc.
    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/CentralEndpointIntersector.java rev. 1.1
    00017  *
    00018  **********************************************************************/
    00019
    00020 #ifndef GEOS_ALGORITHM_CENTRALENDPOINTINTERSECTOR_H
    00021 #define GEOS_ALGORITHM_CENTRALENDPOINTINTERSECTOR_H
    00022
    00023 #include <geos/geom/Coordinate.h>
    00024
    00025 #include <string>
    00026 #include <limits>
    00027
    00028 // Forward declarations
    00029 namespace geos {
    00030         namespace geom {
    00031                 //class PrecisionModel;
    00032         }
    00033 }
    00034
    00035 namespace geos {
    00036 namespace algorithm { // geos::algorithm
    00037
    00057 class CentralEndpointIntersector {
    00058
    00059 public:
    00060
    00061         static const geom::Coordinate& getIntersection(const geom::Coordinate& p00,
    00062                         const geom::Coordinate& p01, const geom::Coordinate& p10,
    00063                         const geom::Coordinate& p11)
    00064         {
    00065                 CentralEndpointIntersector intor(p00, p01, p10, p11);
    00066                 return intor.getIntersection();
    00067         }
    00068
    00069         CentralEndpointIntersector(const geom::Coordinate& p00,
    00070                         const geom::Coordinate& p01,
    00071                         const geom::Coordinate& p10,
    00072                         const geom::Coordinate& p11)
    00073                 :
    00074                 _pts(4)
    00075         {
    00076                 _pts[0]=p00;
    00077                 _pts[1]=p01;
    00078                 _pts[2]=p10;
    00079                 _pts[3]=p11;
    00080                 compute();
    00081         }
    00082
    00083         const geom::Coordinate& getIntersection() const
    00084         {
    00085                 return _intPt;
    00086         }
    00087
    00088
    00089 private:
    00090
    00091         // This is likely overkill.. we'll be allocating heap
    00092         // memory at every call !
    00093         std::vector<geom::Coordinate> _pts;
    00094
    00095         geom::Coordinate _intPt;
    00096
    00097         void compute()
    00098         {
    00099                 geom::Coordinate centroid = average(_pts);
    00100                 _intPt = findNearestPoint(centroid, _pts);
    00101         }
    00102
    00103         static geom::Coordinate average(
    00104                         const std::vector<geom::Coordinate>& pts)
    00105         {
    00106                 geom::Coordinate avg(0, 0);
    00107                 size_t n = pts.size();
    00108                 if ( ! n ) return avg;
    00109                 for (size_t i=0; i<n; ++i)
    00110                 {
    00111                         avg.x += pts[i].x;
    00112                         avg.y += pts[i].y;
    00113                 }
    00114                 avg.x /= n;
    00115                 avg.y /= n;
    00116                 return avg;
    00117         }
    00118
    00129         geom::Coordinate findNearestPoint(const geom::Coordinate& p,
    00130                         const std::vector<geom::Coordinate>& pts) const
    00131         {
    00132                 double minDist = std::numeric_limits<double>::max();
    00133                 geom::Coordinate result = geom::Coordinate::getNull();
    00134                 for (size_t i = 0, n=pts.size(); i < n; ++i) {
    00135                         double dist = p.distance(pts[i]);
    00136                         if (dist < minDist) {
    00137                                 minDist = dist;
    00138                                 result = pts[i];
    00139                         }
    00140                 }
    00141                 return result;
    00142         }
    00143
    00144
    00145
    00146 };
    00147
    00148 } // namespace geos::algorithm
    00149 } // namespace geos
    00150
    00151
    00152 #endif // GEOS_ALGORITHM_CENTRALENDPOINTINTERSECTOR_H
    00153
    00154 /**********************************************************************
    00155  * $Log$
    00156  **********************************************************************/
    00157