/usr/include/boost/geometry/strategies/cartesian
NameSizeModeActions
area.hpp39580644editdlrm
area_surveyor.hpp12210644editdlrm
azimuth.hpp12120644editdlrm
box_in_box.hpp106140644editdlrm
buffer_end_flat.hpp37570644editdlrm
buffer_end_round.hpp60840644editdlrm
buffer_join_miter.hpp45400644editdlrm
buffer_join_round.hpp62060644editdlrm
buffer_join_round_by_divide.hpp46590644editdlrm
buffer_point_circle.hpp40160644editdlrm
buffer_point_square.hpp36540644editdlrm
buffer_side_straight.hpp45870644editdlrm
centroid_average.hpp28800644editdlrm
centroid_bashein_detmer.hpp85410644editdlrm
centroid_weighted_length.hpp48550644editdlrm
densify.hpp39020644editdlrm
disjoint_box_box.hpp29850644editdlrm
disjoint_segment_box.hpp89650644editdlrm
distance_projected_point.hpp96350644editdlrm
distance_projected_point_ax.hpp98350644editdlrm
distance_pythagoras.hpp76740644editdlrm
distance_pythagoras_box_box.hpp89930644editdlrm
distance_pythagoras_point_box.hpp92300644editdlrm
distance_segment_box.hpp68930644editdlrm
envelope.hpp42990644editdlrm
envelope_box.hpp34790644editdlrm
envelope_multipoint.hpp14420644editdlrm
envelope_point.hpp29630644editdlrm
envelope_segment.hpp24580644editdlrm
expand_box.hpp18680644editdlrm
expand_point.hpp33400644editdlrm
expand_segment.hpp19000644editdlrm
index.hpp69760644editdlrm
intersection.hpp308550644editdlrm
io.hpp18730644editdlrm
line_interpolate.hpp37720644editdlrm
point_in_box.hpp87610644editdlrm
point_in_point.hpp35430644editdlrm
point_in_poly_crossings_multiply.hpp35930644editdlrm
point_in_poly_franklin.hpp34640644editdlrm
point_in_poly_winding.hpp98890644editdlrm
point_order.hpp10240644editdlrm
side_by_triangle.hpp96690644editdlrm
turn_in_ring_winding.hpp74630644editdlrm
Edit: /usr/include/boost/geometry/strategies/cartesian/centroid_weighted_length.hpp (4855B)
// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2009-2015 Mateusz Loskot, London, UK. // Copyright (c) 2009-2015 Barend Gehrels, Amsterdam, the Netherlands. // This file was modified by Oracle on 2015. // Modifications copyright (c) 2015, Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_WEIGHTED_LENGTH_HPP #define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_WEIGHTED_LENGTH_HPP #include #include #include #include #include #include #include #include #include // Helper geometry #include namespace boost { namespace geometry { namespace strategy { namespace centroid { namespace detail { template struct weighted_length_sums { typedef typename geometry::model::point < Type, DimensionCount, cs::cartesian > work_point; Type length; work_point average_sum; inline weighted_length_sums() : length(Type()) { geometry::assign_zero(average_sum); } }; } template < typename Point, typename PointOfSegment = Point > class weighted_length { private : typedef typename select_most_precise < typename default_distance_result::type, typename default_distance_result::type >::type distance_type; public : typedef detail::weighted_length_sums < distance_type, geometry::dimension::type::value > state_type; static inline void apply(PointOfSegment const& p1, PointOfSegment const& p2, state_type& state) { distance_type const d = geometry::distance(p1, p2); state.length += d; typename state_type::work_point weighted_median; geometry::assign_zero(weighted_median); geometry::add_point(weighted_median, p1); geometry::add_point(weighted_median, p2); geometry::multiply_value(weighted_median, d/2); geometry::add_point(state.average_sum, weighted_median); } static inline bool result(state_type const& state, Point& centroid) { distance_type const zero = distance_type(); if (! geometry::math::equals(state.length, zero) && boost::math::isfinite(state.length)) // Prevent NaN centroid coordinates { // NOTE: above distance_type is checked, not the centroid coordinate_type // which means that the centroid can still be filled with INF // if e.g. distance_type is double and centroid contains floats geometry::for_each_coordinate(centroid, set_sum_div_length(state)); return true; } return false; } struct set_sum_div_length { state_type const& m_state; set_sum_div_length(state_type const& state) : m_state(state) {} template void apply(Pt & centroid) const { typedef typename geometry::coordinate_type::type coordinate_type; geometry::set( centroid, boost::numeric_cast( geometry::get(m_state.average_sum) / m_state.length ) ); } }; }; #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS namespace services { // Register this strategy for linear geometries, in all dimensions template struct default_strategy < cartesian_tag, linear_tag, N, Point, Geometry > { typedef weighted_length < Point, typename point_type::type > type; }; } // namespace services #endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS }} // namespace strategy::centroid }} // namespace boost::geometry #endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_WEIGHTED_LENGTH_HPP