summaryrefslogtreecommitdiff log msg author committer range
blob: 23651637b9ed3a8200bc37810d67c487d1e23c4b (plain)
 ```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 ``` ``````// Boost.Geometry // Copyright (c) 2017-2018, Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Licensed under the Boost Software License version 1.0. // http://www.boost.org/users/license.html #ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DENSIFY_HPP #define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DENSIFY_HPP #include #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { namespace strategy { namespace densify { /*! \brief Densification of cartesian segment. \ingroup strategies \tparam CalculationType \tparam_calculation \qbk{ [heading See also] [link geometry.reference.algorithms.densify.densify_4_with_strategy densify (with strategy)] } */ template < typename CalculationType = void > class cartesian { public: template static inline void apply(Point const& p0, Point const& p1, AssignPolicy & policy, T const& length_threshold) { typedef typename AssignPolicy::point_type out_point_t; typedef typename select_most_precise < typename coordinate_type::type, typename coordinate_type::type, CalculationType >::type calc_t; typedef model::point::value, cs::cartesian> calc_point_t; calc_point_t cp0, cp1; geometry::detail::conversion::convert_point_to_point(p0, cp0); geometry::detail::conversion::convert_point_to_point(p1, cp1); // dir01 = xy1 - xy0 calc_point_t dir01 = cp1; geometry::subtract_point(dir01, cp0); calc_t const dot01 = geometry::dot_product(dir01, dir01); calc_t const len = math::sqrt(dot01); BOOST_GEOMETRY_ASSERT(length_threshold > T(0)); signed_size_type n = signed_size_type(len / length_threshold); if (n <= 0) { return; } // NOTE: Normalization will not work for integral coordinates // normalize //geometry::divide_value(dir01, len); calc_t step = len / (n + 1); calc_t d = step; for (signed_size_type i = 0 ; i < n ; ++i, d += step) { // pd = xy0 + d * dir01 calc_point_t pd = dir01; // without normalization geometry::multiply_value(pd, calc_t(i + 1)); geometry::divide_value(pd, calc_t(n + 1)); // with normalization //geometry::multiply_value(pd, d); geometry::add_point(pd, cp0); // NOTE: Only needed if types calc_point_t and out_point_t are different // otherwise pd could simply be passed into policy out_point_t p; assert_dimension_equal(); geometry::detail::conversion::convert_point_to_point(pd, p); policy.apply(p); } } }; #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS namespace services { template <> struct default_strategy { typedef strategy::densify::cartesian<> type; }; } // namespace services #endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS }} // namespace strategy::densify }} // namespace boost::geometry #endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DENSIFY_HPP ``````