#ifndef MATCHING_DISTANCE_DUAL_BOX_H #define MATCHING_DISTANCE_DUAL_BOX_H #include #include #include #include #include "spdlog/spdlog.h" #include "spdlog/fmt/ostr.h" #include "common_util.h" #include "dual_point.h" namespace md { template class DualBox { public: DualBox(DualPoint ll, DualPoint ur); DualBox() = default; DualBox(const DualBox&) = default; DualBox(DualBox&&) = default; DualBox& operator=(const DualBox& other) & = default; DualBox& operator=(DualBox&& other) = default; DualPoint center() const { return midpoint(lower_left_, upper_right_); } DualPoint lower_left() const { return lower_left_; } DualPoint upper_right() const { return upper_right_; } DualPoint lower_right() const; DualPoint upper_left() const; AxisType axis_type() const { return lower_left_.axis_type(); } AngleType angle_type() const { return lower_left_.angle_type(); } Real mu_min() const { return lower_left_.mu(); } Real mu_max() const { return upper_right_.mu(); } Real lambda_min() const { return lower_left_.lambda(); } Real lambda_max() const { return upper_right_.lambda(); } // return true, if all lines in dual_box are flat bool is_flat() const { return upper_right_.is_flat(); } bool is_steep() const { return lower_left_.is_steep(); } std::vector refine() const; std::vector> corners() const; std::vector> critical_points(const Point& p) const; // sample n points from the box uniformly; for tests std::vector> random_points(int n) const; // return 2 dual points at the boundary // where push changes from horizontal to vertical std::vector> push_change_points(const Point& p) const; // check that a has same sign, angles are all flat or all steep bool sanity_check() const; bool contains(const DualPoint& dp) const; bool operator==(const DualBox& other) const; private: DualPoint lower_left_; DualPoint upper_right_; }; template std::ostream& operator<<(std::ostream& os, const DualBox& db) { os << "DualBox(" << db.lower_left() << ", " << db.upper_right() << ")"; return os; } } #include "dual_box.hpp" #endif //MATCHING_DISTANCE_DUAL_BOX_H