21 class nlinfo_incrementor;
22 class ROI2D_incrementor;
24 class ROI2D_contig_subregion_generator;
32 typedef std::pair<difference_type, difference_type>
coords;
64 friend std::ostream& operator<<(std::ostream&, const
ROI2D&);
67 friend void save(
const ROI2D&, std::ofstream&);
73 bool empty()
const {
return points == 0; }
100 std::string
size_string()
const {
return mask_ptr->size_string(); }
109 void chk_region_idx_in_bounds(
difference_type,
const std::string&)
const;
111 std::shared_ptr<Array2D<bool>> mask_ptr;
112 std::shared_ptr<std::vector<region>> regions_ptr;
199 void chk_nonempty_op(
const std::string&)
const;
228 std::vector<Array2D<double>>
sub;
256 friend void save(
const region&, std::ofstream&);
281 nlinfo_ptr(&nlinfo), nl_idx(nl_idx), np_idx(np_idx), p1(p1) { }
291 return inc.nlinfo_ptr == nlinfo_ptr && inc.nl_idx == nl_idx && inc.np_idx == np_idx && inc.p1 == p1;
328 return inc.region_idx == region_idx && inc.nlinfo_inc == nlinfo_inc;
374 chk_nonempty_op(
"first_pos_idx()");
382 chk_nonempty_op(
"first_pos_p1()");
385 return nodelist(0,first_pos_idx());
390 chk_nonempty_op(
"first_pos_p2()");
398 chk_nonempty_op(
"last_pos_idx()");
401 return nodelist.width() - (right_nl - right) - 1;
406 chk_nonempty_op(
"last_pos_p1()");
409 return nodelist(noderange(last_pos_idx()) - 1, last_pos_idx());
414 chk_nonempty_op(
"last_pos_p2()");
421template <
typename T,
typename T_container>
439template <
typename T,
typename T_container>
446 NLOG_WARN <<
"Warning: The boundary is empty or the height is equal 0 - just nothing to fill";
450 if (boundary.
width() != 2) {
451 throw std::invalid_argument(
"Input boundary has size: " + boundary.
size_2D_string() +
". Boundary must have a width of 2.");
471 for (
difference_type point1_idx = 0, point0_idx = boundary.
height() - 1; point1_idx < boundary.
height(); point0_idx = point1_idx++) {
472 double point0_p1 = boundary(point0_idx,0), point0_p2 = boundary(point0_idx,1);
473 double point1_p1 = boundary(point1_idx,0), point1_p2 = boundary(point1_idx,1);
474 if ((p2_sweep < point1_p2 && p2_sweep >= point0_p2) ||
475 (p2_sweep < point0_p2 && p2_sweep >= point1_p2)) {
476 node_buf(buf_length++) = point1_p1 + (p2_sweep-point1_p2)/(point0_p2-point1_p2) * (point0_p1-point1_p1);
487 if (np_top >= A.height()) {
490 if (np_bottom >= 0) {
491 if (np_top < 0) { np_top = 0; }
492 if (np_bottom >= A.height()) { np_bottom = A.height() - 1; }
499 A(p1,p2_sweep) = val;
508template <
typename T_container>
509std::pair<typename T_container::value_type, typename T_container::coords>
max(T_container &A,
const ROI2D::region_nlinfo &nlinfo) {
512 if (nlinfo.
empty()) {
513 throw std::invalid_argument(
"Attempted to find the max value in Array using an empty nlinfo.");
525 if (A(p1,p2) > val_max) {
534 return { val_max, { p1_max,p2_max } };
537template <
typename T_container>
538std::pair<typename T_container::value_type, typename T_container::coords>
min(T_container &A,
const ROI2D::region_nlinfo &nlinfo) {
541 if (nlinfo.
empty()) {
542 throw std::invalid_argument(
"Attempted to find the min value in Array using an empty nlinfo.");
554 if (A(p1,p2) < val_min) {
563 return { val_min, { p1_min,p2_min } };
difference_type width() const
std::string size_2D_string() const
pointer get_pointer() const
difference_type height() const
friend void save(const ROI2D &, std::ofstream &)
std::pair< difference_type, difference_type > coords
contig_subregion_generator get_contig_subregion_generator(SUBREGION, difference_type) const
friend void imshow(const ROI2D &roi, difference_type delay=-1)
std::ptrdiff_t difference_type
ROI2D reduce(difference_type) const
bool in_bounds(difference_type p1, difference_type p2) const
difference_type size_regions() const
difference_type width() const
details::ROI2D_incrementor incrementor
incrementor end_inc() const
bool operator()(difference_type p1, difference_type p2) const
const Array2D< bool > & get_mask() const
bool in_bounds(difference_type p) const
static ROI2D simple_square(difference_type)
incrementor begin_inc() const
const region_nlinfo & get_nlinfo(difference_type) const
ROI2D(ROI2D &&) noexcept=default
std::string size_string() const
friend bool isequal(const ROI2D &, const ROI2D &)
static ROI2D load(std::ifstream &)
static ROI2D simple_circle(difference_type)
ROI2D form_union(const Array2D< bool > &) const
details::ROI2D_contig_subregion_generator contig_subregion_generator
friend contig_subregion_generator
difference_type height() const
std::pair< difference_type, difference_type > get_region_idx(difference_type, difference_type) const
difference_type get_points() const
std::string size_2D_string() const
const region_boundary & get_boundary(difference_type) const
ROI2D(const ROI2D &)=default
bool operator()(difference_type p) const
ROI2D_contig_subregion_generator & operator=(ROI2D_contig_subregion_generator &&)=default
ROI2D_contig_subregion_generator & operator=(const ROI2D_contig_subregion_generator &)=default
const ROI2D::region_nlinfo & operator()(difference_type, difference_type) const
ROI2D_contig_subregion_generator(ROI2D_contig_subregion_generator &&)=default
ROI2D::difference_type difference_type
ROI2D_contig_subregion_generator() noexcept
const ROI2D::region_nlinfo & get_subregion_nlinfo() const
ROI2D_contig_subregion_generator(const ROI2D_contig_subregion_generator &)=default
~ROI2D_contig_subregion_generator() noexcept=default
difference_type get_r() const
ROI2D::difference_type difference_type
ROI2D_incrementor & operator=(const ROI2D_incrementor &)=default
bool operator!=(const ROI2D_incrementor &inc) const
ROI2D_incrementor & operator++()
ROI2D_incrementor() noexcept
ROI2D_incrementor(const ROI2D_incrementor &)=default
~ROI2D_incrementor() noexcept=default
ROI2D_incrementor & operator=(ROI2D_incrementor &&)=default
bool operator==(const ROI2D_incrementor &inc) const
ROI2D_incrementor(ROI2D_incrementor &&)=default
bool operator!=(const nlinfo_incrementor &inc) const
nlinfo_incrementor(nlinfo_incrementor &&)=default
nlinfo_incrementor & operator=(const nlinfo_incrementor &)=default
nlinfo_incrementor & operator++()
nlinfo_incrementor() noexcept
ROI2D::difference_type difference_type
nlinfo_incrementor & operator=(nlinfo_incrementor &&)=default
~nlinfo_incrementor() noexcept=default
nlinfo_incrementor(const nlinfo_incrementor &)=default
bool operator==(const nlinfo_incrementor &inc) const
Lightweight, dependency-free logging facility for CppNCorr.
T_container & fill(T_container &A, const ROI2D::region_nlinfo &nlinfo, const T &val)
std::pair< typename T_container::value_type, typename T_container::coords > min(T_container &A, const ROI2D::region_nlinfo &nlinfo)
std::pair< typename T_container::value_type, typename T_container::coords > max(T_container &A, const ROI2D::region_nlinfo &nlinfo)
static region_boundary load(std::ifstream &)
region_boundary()=default
std::vector< Array2D< double > > sub
region_boundary & operator=(region_boundary &&)=default
region_boundary & operator=(const region_boundary &)=default
region_boundary(const region_boundary &)=default
friend std::ostream & operator<<(std::ostream &, const ROI2D::region_boundary &)
region_boundary(const Array2D< double > &add, std::vector< Array2D< double > > &&sub)
~region_boundary() noexcept=default
region_boundary(region_boundary &&)=default
friend void save(const region_boundary &, std::ofstream &)
friend bool isequal(const region_boundary &, const region_boundary &)
region_boundary(Array2D< double > &&add, const std::vector< Array2D< double > > &sub)
region_boundary(Array2D< double > &&add, std::vector< Array2D< double > > &&sub)
~region_nlinfo() noexcept=default
friend std::ostream & operator<<(std::ostream &, const ROI2D::region_nlinfo &)
difference_type last_pos_p2() const
difference_type first_pos_p2() const
incrementor begin_inc() const
Array2D< difference_type > noderange
details::nlinfo_incrementor incrementor
region_nlinfo & operator=(region_nlinfo &&)=default
friend bool isequal(const region_nlinfo &, const region_nlinfo &)
region_nlinfo(const region_nlinfo &)=default
bool in_nlinfo(difference_type, difference_type) const
difference_type last_pos_p1() const
static region_nlinfo load(std::ifstream &)
Array2D< difference_type > nodelist
incrementor end_inc() const
region_nlinfo & shift(difference_type, difference_type)
region_nlinfo(region_nlinfo &&)=default
region_nlinfo & operator=(const region_nlinfo &)=default
static std::pair< std::vector< ROI2D::region_nlinfo >, bool > form_nlinfos(const Array2D< bool > &, ROI2D::difference_type=0)
difference_type last_pos_idx() const
friend void save(const region_nlinfo &, std::ofstream &)
difference_type first_pos_idx() const
difference_type first_pos_p1() const
~region() noexcept=default
region(region_nlinfo &&nlinfo, const region_boundary &boundary)
friend void save(const region &, std::ofstream &)
region(const region &)=default
static region load(std::ifstream &)
region(const region_nlinfo &nlinfo, region_boundary &&boundary)
friend bool isequal(const region ®1, const region ®2)
friend std::ostream & operator<<(std::ostream &, const ROI2D::region &)
region(region &&)=default
region & operator=(region &&)=default
region & operator=(const region &)=default
region(region_nlinfo &&nlinfo, region_boundary &&boundary)