Boost-Geometry-Utils
view release on metacpan or search on metacpan
src/boost/geometry/strategies/cartesian/cart_intersect.hpp view on Meta::CPAN
int corrected = 0;
if (sides.one_touching<0>())
{
if (point_equals(
select(sides.zero_index<0>(), a),
select(0, b)
))
{
sides.correct_to_zero<1, 0>();
corrected = 1;
}
if (point_equals
(
select(sides.zero_index<0>(), a),
select(1, b)
))
{
sides.correct_to_zero<1, 1>();
corrected = 2;
}
}
else if (sides.one_touching<1>())
{
if (point_equals(
select(sides.zero_index<1>(), b),
select(0, a)
))
{
sides.correct_to_zero<0, 0>();
corrected = 3;
}
if (point_equals
(
select(sides.zero_index<1>(), b),
select(1, a)
))
{
sides.correct_to_zero<0, 1>();
corrected = 4;
}
}
return corrected == 0;
}
static inline bool robustness_verify_disjoint_at_one_collinear(
segment_type1 const& a, segment_type2 const& b,
side_info const& sides)
{
if (sides.one_of_all_zero())
{
if (verify_disjoint<0>(a, b) || verify_disjoint<1>(a, b))
{
return true;
}
}
return false;
}
// If r is one, or zero, segments should meet and their endpoints.
// Robustness issue: check if this is really the case.
// It turns out to be no problem, see buffer test #rt_s1 (and there are many cases generated)
// It generates an "ends in the middle" situation which is correct.
template <typename T, typename R>
static inline void robustness_handle_meeting(segment_type1 const& a, segment_type2 const& b,
side_info& sides,
T const& dx_a, T const& dy_a, T const& wx, T const& wy,
T const& d, R const& r)
{
return;
T const db = geometry::detail::determinant<T>(dx_a, dy_a, wx, wy);
R const zero = 0;
R const one = 1;
if (math::equals(r, zero) || math::equals(r, one))
{
R rb = db / d;
if (rb <= 0 || rb >= 1 || math::equals(rb, 0) || math::equals(rb, 1))
{
if (sides.one_zero<0>() && ! sides.one_zero<1>()) // or vice versa
{
#if defined(BOOST_GEOMETRY_COUNT_INTERSECTION_EQUAL)
extern int g_count_intersection_equal;
g_count_intersection_equal++;
#endif
sides.debug();
std::cout << "E r=" << r << " r.b=" << rb << " ";
}
}
}
}
template <std::size_t Dimension>
static inline bool verify_disjoint(segment_type1 const& a,
segment_type2 const& b)
{
coordinate_type a_1, a_2, b_1, b_2;
bool a_swapped = false, b_swapped = false;
detail::segment_arrange<Dimension>(a, a_1, a_2, a_swapped);
detail::segment_arrange<Dimension>(b, b_1, b_2, b_swapped);
return math::smaller(a_2, b_1) || math::larger(a_1, b_2);
}
template <typename Segment>
static inline typename point_type<Segment>::type select(int index, Segment const& segment)
{
return index == 0
? detail::get_from_index<0>(segment)
: detail::get_from_index<1>(segment)
;
}
// We cannot use geometry::equals here. Besides that this will be changed
// to compare segment-coordinate-values directly (not necessary to retrieve point first)
template <typename Point1, typename Point2>
static inline bool point_equals(Point1 const& point1, Point2 const& point2)
{
return math::equals(get<0>(point1), get<0>(point2))
&& math::equals(get<1>(point1), get<1>(point2))
( run in 3.266 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )