static inline bool apply(Multi const& multi, Point& centroid, Strategy const& strategy) { #if ! defined(BOOST_GEOMETRY_CENTROID_NO_THROW) // If there is nothing in any of the ranges, it is not possible // to calculate the centroid if (geometry::is_empty(multi)) { throw centroid_exception(); } #endif // prepare translation transformer translating_transformer<Multi> transformer(multi); typename Strategy::state_type state; for (typename boost::range_iterator<Multi const>::type it = boost::begin(multi); it != boost::end(multi); ++it) { Policy::apply(*it, transformer, strategy, state); } if ( strategy.result(state, centroid) ) { // translate the result back transformer.apply_reverse(centroid); return true; } return false; }
static inline void apply(Multi const& multi, Point& centroid, Strategy const& strategy) { // If there is nothing in any of the ranges, it is not possible // to calculate the centroid if (geometry::num_points(multi) == 0) { throw centroid_exception(); } typename Strategy::state_type state; for (typename boost::range_iterator<Multi const>::type it = boost::begin(multi); it != boost::end(multi); ++it) { Policy::apply(*it, strategy, state); } Strategy::result(state, centroid); }
inline bool range_ok(Range const& range, Point& centroid) { std::size_t const n = boost::size(range); if (n > 1) { return true; } else if (n <= 0) { #if ! defined(BOOST_GEOMETRY_CENTROID_NO_THROW) throw centroid_exception(); #endif return false; } else // if (n == 1) { // Take over the first point in a "coordinate neutral way" geometry::convert(*boost::begin(range), centroid); return false; } return true; }
inline bool range_ok(Range const& range, Point& centroid) { std::size_t const n = boost::size(range); if (n > 1) { return true; } else if (n <= 0) { #if defined(CENTROID_WITH_CATCH) throw centroid_exception(); #endif return false; } else // if (n == 1) { // Take over the first point in a "coordinate neutral way" copy_coordinates(range.front(), centroid); return false; } return true; }