blob: b2a962ada02ee5a7ef1ac0838e66b613dae83537 [file] [log] [blame]
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
#ifndef BOOST_GEOMETRY_TEST_GET_TURNS_LL_INVARIANCE_HPP
#define BOOST_GEOMETRY_TEST_GET_TURNS_LL_INVARIANCE_HPP
#include <vector>
#include <boost/geometry/algorithms/reverse.hpp>
#include <boost/geometry/algorithms/detail/signed_index_type.hpp>
#include <boost/geometry/algorithms/detail/relate/turns.hpp>
#include <boost/geometry/algorithms/detail/turns/compare_turns.hpp>
#include <boost/geometry/algorithms/detail/turns/print_turns.hpp>
#include <boost/geometry/algorithms/detail/turns/filter_continue_turns.hpp>
#include <boost/geometry/algorithms/detail/turns/remove_duplicate_turns.hpp>
#include <boost/geometry/io/wkt/write.hpp>
namespace bg = ::boost::geometry;
namespace bg_detail = ::boost::geometry::detail;
namespace bg_turns = bg_detail::turns;
template
<
bool EnableRemoveDuplicateTurns = true,
bool EnableDegenerateTurns = true
>
class test_get_turns_ll_invariance
{
private:
struct assign_policy
{
static bool const include_no_turn = false;
static bool const include_degenerate = EnableDegenerateTurns;
static bool const include_opposite = false;
template
<
typename Info,
typename Point1,
typename Point2,
typename IntersectionInfo
>
static inline void apply(Info& , Point1 const& , Point2 const& ,
IntersectionInfo const&)
{
}
};
template
<
typename Turns,
typename LinearGeometry1,
typename LinearGeometry2
>
static inline void compute_turns(Turns& turns,
LinearGeometry1 const& linear1,
LinearGeometry2 const& linear2)
{
turns.clear();
bg_detail::relate::turns::get_turns
<
LinearGeometry1,
LinearGeometry2,
bg_detail::get_turns::get_turn_info_type
<
LinearGeometry1,
LinearGeometry2,
assign_policy
>
>::apply(turns, linear1, linear2);
}
public:
template <typename Linear1, typename Linear2>
static inline void apply(Linear1 const& lineargeometry1,
Linear2 const& lineargeometry2)
{
typedef typename bg_detail::relate::turns::get_turns
<
Linear1, Linear2
>::turn_info turn_info;
typedef std::vector<turn_info> turns_container;
typedef bg_turns::filter_continue_turns
<
turns_container, true
> filter_continue_turns;
typedef bg_turns::remove_duplicate_turns
<
turns_container, EnableRemoveDuplicateTurns
> remove_duplicate_turns;
turns_container turns;
Linear1 linear1(lineargeometry1);
Linear2 linear2(lineargeometry2);
Linear2 linear2_reverse(linear2);
boost::geometry::reverse(linear2_reverse);
turns_container turns_all, rturns_all;
compute_turns(turns_all, linear1, linear2);
compute_turns(rturns_all, linear1, linear2_reverse);
turns_container turns_wo_cont(turns_all);
turns_container rturns_wo_cont(rturns_all);
filter_continue_turns::apply(turns_wo_cont);
filter_continue_turns::apply(rturns_wo_cont);
std::sort(boost::begin(turns_all), boost::end(turns_all),
bg_turns::less_seg_fraction_other_op<>());
std::sort(boost::begin(turns_wo_cont), boost::end(turns_wo_cont),
bg_turns::less_seg_fraction_other_op<>());
std::sort(boost::begin(rturns_all), boost::end(rturns_all),
bg_turns::less_seg_fraction_other_op<std::greater<boost::geometry::signed_index_type> >());
std::sort(boost::begin(rturns_wo_cont), boost::end(rturns_wo_cont),
bg_turns::less_seg_fraction_other_op<std::greater<boost::geometry::signed_index_type> >());
remove_duplicate_turns::apply(turns_all);
remove_duplicate_turns::apply(turns_wo_cont);
remove_duplicate_turns::apply(rturns_all);
remove_duplicate_turns::apply(rturns_wo_cont);
#ifdef BOOST_GEOMETRY_TEST_DEBUG
std::cout << std::endl << std::endl;
std::cout << "### ORIGINAL TURNS ###" << std::endl;
bg_turns::print_turns(linear1, linear2, turns_all);
std::cout << std::endl << std::endl;
std::cout << "### ORIGINAL REVERSE TURNS ###" << std::endl;
bg_turns::print_turns(linear1, linear2_reverse, rturns_all);
std::cout << std::endl << std::endl;
std::cout << "### TURNS W/O CONTINUE TURNS ###" << std::endl;
bg_turns::print_turns(linear1, linear2, turns_wo_cont);
std::cout << std::endl << std::endl;
std::cout << "### REVERSE TURNS W/O CONTINUE TURNS ###" << std::endl;
bg_turns::print_turns(linear1, linear2_reverse, rturns_wo_cont);
std::cout << std::endl << std::endl;
#endif
BOOST_CHECK_MESSAGE(boost::size(turns_wo_cont) == boost::size(rturns_wo_cont),
"Incompatible turns count: " << boost::size(turns_wo_cont) <<
" and " << boost::size(rturns_wo_cont) <<
" for L1: " << bg::wkt(lineargeometry1) <<
", L2: " << bg::wkt(lineargeometry2));
}
};
#endif // BOOST_GEOMETRY_TEST_GET_TURNS_LL_INVARIANCE_HPP