diff options
Diffstat (limited to 'boost/geometry/policies/robustness/rescale_policy.hpp')
-rw-r--r-- | boost/geometry/policies/robustness/rescale_policy.hpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/boost/geometry/policies/robustness/rescale_policy.hpp b/boost/geometry/policies/robustness/rescale_policy.hpp new file mode 100644 index 0000000000..5b3b566976 --- /dev/null +++ b/boost/geometry/policies/robustness/rescale_policy.hpp @@ -0,0 +1,83 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2014 Bruno Lalande, Paris, France. +// Copyright (c) 2014 Mateusz Loskot, London, UK. +// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. + +// 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_POLICIES_ROBUSTNESS_RESCALE_POLICY_HPP +#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_RESCALE_POLICY_HPP + +#include <cstddef> + +#include <boost/type_traits.hpp> + +#include <boost/geometry/policies/robustness/segment_ratio.hpp> +#include <boost/geometry/policies/robustness/segment_ratio_type.hpp> +#include <boost/geometry/policies/robustness/robust_point_type.hpp> + +namespace boost { namespace geometry +{ + +#ifndef DOXYGEN_NO_DETAIL +namespace detail +{ + +template <typename FpPoint, typename IntPoint, typename CalculationType> +struct robust_policy +{ + static bool const enabled = true; + + typedef typename geometry::coordinate_type<IntPoint>::type output_ct; + + robust_policy(FpPoint const& fp_min, IntPoint const& int_min, CalculationType const& the_factor) + : m_fp_min(fp_min) + , m_int_min(int_min) + , m_multiplier(the_factor) + { + } + + template <std::size_t Dimension, typename Value> + inline output_ct apply(Value const& value) const + { + // a + (v-b)*f + CalculationType const a = static_cast<CalculationType>(get<Dimension>(m_int_min)); + CalculationType const b = static_cast<CalculationType>(get<Dimension>(m_fp_min)); + CalculationType const result = a + (value - b) * m_multiplier; + return static_cast<output_ct>(result); + } + + FpPoint m_fp_min; + IntPoint m_int_min; + CalculationType m_multiplier; +}; + +} // namespace detail +#endif + + +// Implement meta-functions for this policy + +// Define the IntPoint as a robust-point type +template <typename Point, typename FpPoint, typename IntPoint, typename CalculationType> +struct robust_point_type<Point, detail::robust_policy<FpPoint, IntPoint, CalculationType> > +{ + typedef IntPoint type; +}; + +// Meta function for rescaling, if rescaling is done segment_ratio is based on long long +template <typename Point, typename FpPoint, typename IntPoint, typename CalculationType> +struct segment_ratio_type<Point, detail::robust_policy<FpPoint, IntPoint, CalculationType> > +{ + typedef segment_ratio<boost::long_long_type> type; +}; + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_RESCALE_POLICY_HPP |