28constexpr static bool ringIntersects(
const R & ring,
const L & linearFeature)
noexcept {
29 auto segments = ring.getSegments();
30 using difference_type = std::ranges::range_difference_t<
decltype(segments)>;
31 auto size = std::ranges::ssize(segments);
32 auto segmentAt = [&segments](difference_type index){
return *(std::ranges::begin(segments) + index);};
34 auto onSameSide = [&linearFeature](
const auto & lhs,
const auto & rhs) {
35 auto line = linearFeature.toLine();
36 if(line.contains(rhs) || line.contains(lhs)){
39 return line.isLeft(lhs) == line.isLeft(rhs);
41 for(difference_type i = 0; i < size; ++i){
42 auto current = segmentAt(i);
43 auto inter = current.intersection(linearFeature);
45 if(inter && (linearFeature.isEndpoint(inter.value()) && current.isEndpoint(inter.value())))
47 if(inter && (linearFeature.isEndpoint(inter.value())) && (ring.isOutside(linearFeature.p()) || ring.isOutside(linearFeature.q())))
51 if(inter && inter.value() == linearFeature.origin())
54 if(inter && current.isEndpoint(inter.value())) {
55 if(current.p() == inter.value()){
58 if(not onSameSide(current.q(),segmentAt((i+size-1)%size).p()))
61 if(not onSameSide(current.p(),segmentAt((i+1)%size).q()))
65 if(not onSameSide(current.p(),current.q()))
return true;
static constexpr bool ringIntersects(const R &ring, const L &linearFeature) noexcept
test whether a linear feature intersects a ring Check every intersection of the linear feature with t...
Definition RingIntersection.hpp:28