18template<IBoundingBoxWrapper BBWrapper>
19using GeometryFilter = SweepLine<BBWrapper, std::vector<typename BBWrapper::element_type>,HorizontalAABBOrdering<BBWrapper>>;
29template<IBoundingBoxWrapper BBWrapper,util::BiPredicate<
typename BBWrapper::geometry_type> BinaryFilter, util::Predicate<
typename BBWrapper::geometry_type> Filter>
30class ShapeFilterInsertEvent:
public GeometryFilter<BBWrapper>::InsertEvent{
33 BinaryFilter & binaryFilter;
36 ShapeFilterInsertEvent(
const BBWrapper & box,BinaryFilter & binaryCondition, Filter & condition):GeometryFilter<BBWrapper>::
InsertEvent(box),
filter(condition),binaryFilter(binaryCondition){}
44 virtual void process(GeometryFilter<BBWrapper> & sweepLine, std::vector<typename BBWrapper::element_type> & output)
const{
45 const auto & polygonUnderTest = this->
obj->getPolygon();
46 if(not
filter(polygonUnderTest))
48 sweepLine.addSLS(this->
obj);
49 const auto & sls = sweepLine.getSLS();
50 for(
auto it = sls.lower_bound(this->obj); it != sls.begin() && it != sls.end() ; ){
52 if( not binaryFilter((*it)->getPolygon(),polygonUnderTest))
55 for(
auto it = sls.upper_bound(this->obj);it != sls.end() ; ++it){
56 if(not binaryFilter((*it)->getPolygon(),polygonUnderTest))
59 output.push_back(this->
obj->getElement());
68 return this->
obj->getBoundingBox().top();
72template<IBoundingBoxWrapper BBWrapper>
73struct ShapeFilterRemoveEvent:
public GeometryFilter<BBWrapper>::DefaultRemoveEvent {
74 ShapeFilterRemoveEvent(
const BBWrapper & box):GeometryFilter<BBWrapper>::
DefaultRemoveEvent(box){}
81 return this->
obj->getBoundingBox().bottom();
97template<PolygonRange R,util::BiPredicate<std::ranges::range_value_t<R>> BinaryFilter, util::Predicate<std::ranges::range_value_t<R>> Filter = util::TruePredicate>
98static std::vector<std::ranges::range_value_t<R>>
filter(
const R & polygons, BinaryFilter binaryCondition, Filter condition = Filter()) noexcept {
99 using P = std::ranges::range_value_t<R>;
101 SweepLine_t sweepLine;
103 std::vector<BoundingBoxWrapper<P>> boundingBoxPolygons;
104 boundingBoxPolygons.reserve(
util::size(polygons));
106 std::ranges::for_each(polygons,[&boundingBoxPolygons](
const auto & p){boundingBoxPolygons.emplace_back(p);});
107 std::ranges::for_each(boundingBoxPolygons,[&sweepLine,&binaryCondition,&condition](
const auto & bbPptr){
108 sweepLine.addEvent(std::make_unique<__impl::ShapeFilterInsertEvent<
BoundingBoxWrapper<P>,BinaryFilter,Filter>>(bbPptr,binaryCondition,condition));
111 return sweepLine.
sweep(out);
123template<PolygonRange R, util::Predicate<std::ranges::range_value_t<R>> Filter>
124static std::vector<std::ranges::range_value_t<R>>
filter(
const R & polygons, Filter condition)
noexcept {
126 return filter(polygons,alwaysTrue,condition);
130template<std::ranges::forward_range R,
class Proj, geometry::Shape G = std::invoke_result_t<Proj,std::ranges::range_value_t<std::remove_cvref_t<R>>>>
132 using T = std::ranges::range_value_t<R>;
134 using BinaryFilter =
decltype(binaryCondition);
135 using Filter =
decltype(condition);
136 SweepLine_t sweepLine;
138 std::vector<BoundingBoxWrapper<T,Proj>> boundingBoxWrappers;
139 boundingBoxWrappers.reserve(
util::size(elements));
140 std::ranges::for_each(elements,[&boundingBoxWrappers](
const auto & p){boundingBoxWrappers.emplace_back(p);});
141 std::ranges::for_each(boundingBoxWrappers,[&sweepLine,&binaryCondition,&condition](
const auto & bbPptr){
142 sweepLine.addEvent(std::make_unique<__impl::ShapeFilterInsertEvent<
BoundingBoxWrapper<T,Proj>,BinaryFilter,Filter>>(bbPptr,binaryCondition,condition));
145 return sweepLine.
sweep(out);
Wrapper for Polygon objects, which stores a (custom) bounding box.
Definition BoundingBoxWrapper.hpp:13
virtual fishnet::math::DEFAULT_NUMERIC eventPoint() const noexcept=0
const Input * obj
Definition SweepLine.hpp:38
virtual void process(SweepLine< Input, Output, SLSLess, InsertEventsFirst, EventQueueGreater > &sweepLine, Output &output) const =0
Generic Sweep Line template Stores a Sweep Line Status (SLS), keeping track of the current state of t...
Definition SweepLine.hpp:27
Output sweep(Output &output) noexcept
Definition SweepLine.hpp:187
Definition FunctionalConcepts.hpp:42
Definition FunctionalConcepts.hpp:36
Definition BoundingBoxWrapper.hpp:5
static std::vector< std::ranges::range_value_t< R > > filter(const R &polygons, BinaryFilter binaryCondition, Filter condition=Filter()) noexcept
Filters a range of polygons and returns a list of all polygons that pass the filter(s)
Definition PolygonFilter.hpp:98
double DEFAULT_NUMERIC
Definition NumericConcepts.hpp:13
constexpr size_t size(std::ranges::range auto &&range) noexcept
Definition CollectionConcepts.hpp:50
DefaultRemoveEvent(const Input &obj)
Definition SweepLine.hpp:78
InsertEvent(const Input &obj)
Definition SweepLine.hpp:57
Definition FunctionalConcepts.hpp:83