Chris@102
|
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
|
Chris@102
|
2
|
Chris@102
|
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
|
Chris@102
|
4 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
|
Chris@102
|
5 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
|
Chris@102
|
6
|
Chris@102
|
7 // This file was modified by Oracle on 2015.
|
Chris@102
|
8 // Modifications copyright (c) 2015 Oracle and/or its affiliates.
|
Chris@102
|
9
|
Chris@102
|
10 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
|
Chris@102
|
11
|
Chris@102
|
12 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
|
Chris@102
|
13 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
|
Chris@102
|
14
|
Chris@102
|
15 // Use, modification and distribution is subject to the Boost Software License,
|
Chris@102
|
16 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
17 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
18
|
Chris@102
|
19 #ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_AVERAGE_HPP
|
Chris@102
|
20 #define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_AVERAGE_HPP
|
Chris@102
|
21
|
Chris@102
|
22
|
Chris@102
|
23 #include <cstddef>
|
Chris@102
|
24
|
Chris@102
|
25 #include <boost/geometry/algorithms/assign.hpp>
|
Chris@102
|
26 #include <boost/geometry/arithmetic/arithmetic.hpp>
|
Chris@102
|
27 #include <boost/geometry/core/coordinate_type.hpp>
|
Chris@102
|
28 #include <boost/geometry/core/point_type.hpp>
|
Chris@102
|
29 #include <boost/geometry/strategies/centroid.hpp>
|
Chris@102
|
30
|
Chris@102
|
31
|
Chris@102
|
32 namespace boost { namespace geometry
|
Chris@102
|
33 {
|
Chris@102
|
34
|
Chris@102
|
35 namespace strategy { namespace centroid
|
Chris@102
|
36 {
|
Chris@102
|
37
|
Chris@102
|
38
|
Chris@102
|
39 /*!
|
Chris@102
|
40 \brief Centroid calculation taking average of points
|
Chris@102
|
41 \ingroup strategies
|
Chris@102
|
42 */
|
Chris@102
|
43 template
|
Chris@102
|
44 <
|
Chris@102
|
45 typename PointCentroid,
|
Chris@102
|
46 typename Point = PointCentroid
|
Chris@102
|
47 >
|
Chris@102
|
48 class average
|
Chris@102
|
49 {
|
Chris@102
|
50 private :
|
Chris@102
|
51
|
Chris@102
|
52 /*! subclass to keep state */
|
Chris@102
|
53 class sum
|
Chris@102
|
54 {
|
Chris@102
|
55 friend class average;
|
Chris@102
|
56 std::size_t count;
|
Chris@102
|
57 PointCentroid centroid;
|
Chris@102
|
58
|
Chris@102
|
59 public :
|
Chris@102
|
60 inline sum()
|
Chris@102
|
61 : count(0)
|
Chris@102
|
62 {
|
Chris@102
|
63 assign_zero(centroid);
|
Chris@102
|
64 }
|
Chris@102
|
65 };
|
Chris@102
|
66
|
Chris@102
|
67 public :
|
Chris@102
|
68 typedef sum state_type;
|
Chris@102
|
69 typedef PointCentroid centroid_point_type;
|
Chris@102
|
70 typedef Point point_type;
|
Chris@102
|
71
|
Chris@102
|
72 static inline void apply(Point const& p, sum& state)
|
Chris@102
|
73 {
|
Chris@102
|
74 add_point(state.centroid, p);
|
Chris@102
|
75 state.count++;
|
Chris@102
|
76 }
|
Chris@102
|
77
|
Chris@102
|
78 static inline bool result(sum const& state, PointCentroid& centroid)
|
Chris@102
|
79 {
|
Chris@102
|
80 centroid = state.centroid;
|
Chris@102
|
81 if ( state.count > 0 )
|
Chris@102
|
82 {
|
Chris@102
|
83 divide_value(centroid, state.count);
|
Chris@102
|
84 return true;
|
Chris@102
|
85 }
|
Chris@102
|
86 return false;
|
Chris@102
|
87 }
|
Chris@102
|
88
|
Chris@102
|
89 };
|
Chris@102
|
90
|
Chris@102
|
91
|
Chris@102
|
92 #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
|
Chris@102
|
93
|
Chris@102
|
94
|
Chris@102
|
95 namespace services
|
Chris@102
|
96 {
|
Chris@102
|
97
|
Chris@102
|
98 template <typename Point, std::size_t DimensionCount, typename Geometry>
|
Chris@102
|
99 struct default_strategy
|
Chris@102
|
100 <
|
Chris@102
|
101 cartesian_tag,
|
Chris@102
|
102 pointlike_tag,
|
Chris@102
|
103 DimensionCount,
|
Chris@102
|
104 Point,
|
Chris@102
|
105 Geometry
|
Chris@102
|
106 >
|
Chris@102
|
107 {
|
Chris@102
|
108 typedef average
|
Chris@102
|
109 <
|
Chris@102
|
110 Point,
|
Chris@102
|
111 typename point_type<Geometry>::type
|
Chris@102
|
112 > type;
|
Chris@102
|
113 };
|
Chris@102
|
114
|
Chris@102
|
115 } // namespace services
|
Chris@102
|
116
|
Chris@102
|
117 #endif
|
Chris@102
|
118
|
Chris@102
|
119
|
Chris@102
|
120 }} // namespace strategy::centroid
|
Chris@102
|
121
|
Chris@102
|
122
|
Chris@102
|
123 }} // namespace boost::geometry
|
Chris@102
|
124
|
Chris@102
|
125
|
Chris@102
|
126 #endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_AVERAGE_HPP
|