7#ifndef __PERCEMON_TOPO_HPP__
8#define __PERCEMON_TOPO_HPP__
12#include <initializer_list>
18#include "percemon/datastream.hpp"
70 bool bopen_ =
false) :
82 static_cast<double>(bbox.xmax),
83 static_cast<double>(bbox.ymin),
84 static_cast<double>(bbox.ymax)} {};
99 if (a.xmin < b.xmin) {
return true; }
100 if (a.xmin == b.xmin) {
101 if (a.xmax < b.xmax) {
return true; }
102 if (a.xmax == b.xmax) {
103 if (a.ymin < b.ymin) {
return true; }
104 if (a.ymin == b.ymin) {
105 if (a.ymax < b.ymax) {
return true; }
113 using Set = std::set<BoundingBox, BBoxCmp>;
117 using iterator = Set::iterator;
118 using const_iterator = Set::const_iterator;
119 using difference_type = Set::difference_type;
120 using size_type = Set::size_type;
128 template <
typename Iter>
129 TopoUnion(Iter first, Iter last) : regions{first, last} {};
131 void insert(
BoundingBox bbox) { regions.insert(bbox); }
132 void merge(
const TopoUnion& other) {
138 std::inserter(regions, regions.begin()),
142 iterator begin() {
return regions.begin(); }
143 [[nodiscard]] const_iterator begin()
const {
return regions.begin(); }
144 iterator end() {
return regions.end(); }
145 [[nodiscard]] const_iterator end()
const {
return regions.end(); }
147 auto size() {
return regions.size(); }
153using Region = std::variant<Empty, Universe, BoundingBox, TopoUnion>;
154using RegionPtr = std::shared_ptr<Region>;
156bool is_closed(
const Region& region);
157bool is_open(
const Region& region);
158double area(
const Region& region);
159Region interior(
const Region& region);
160Region closure(
const Region& region);
161Region spatial_complement(
const Region& region,
const BoundingBox& universe);
162Region spatial_intersect(
const Region& lhs,
const Region& rhs);
163Region spatial_intersect(
const std::vector<Region>&);
164Region spatial_union(
const Region& lhs,
const Region& rhs);
165Region spatial_union(
const std::vector<Region>&);
167Region simplify_region(
const Region& region);
Definition: datastream.hpp:37