From 6942d80c4d49239bca9cace9833aa74aee11ddcb Mon Sep 17 00:00:00 2001 From: Arnur Nigmetov Date: Tue, 3 Dec 2019 21:14:03 +0100 Subject: Add matching distance code. --- matching/include/box.h | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 matching/include/box.h (limited to 'matching/include/box.h') diff --git a/matching/include/box.h b/matching/include/box.h new file mode 100644 index 0000000..2990fba --- /dev/null +++ b/matching/include/box.h @@ -0,0 +1,100 @@ +#ifndef MATCHING_DISTANCE_BOX_H +#define MATCHING_DISTANCE_BOX_H + +#include +#include + +#include "common_util.h" + +namespace md { + + struct Box { + private: + Point ll; + Point ur; + + public: + Box(Point ll = Point(), Point ur = Point()) + :ll(ll), ur(ur) + { + } + + Box(Point center, Real width, Real height) : + ll(Point(center.x - 0.5 * width, center.y - 0.5 * height)), + ur(Point(center.x + 0.5 * width, center.y + 0.5 * height)) + { + } + + + inline double width() const { return ur.x - ll.x; } + + inline double height() const { return ur.y - ll.y; } + + inline Point lower_left() const { return ll; } + inline Point upper_right() const { return ur; } + inline Point center() const { return Point((ll.x + ur.x) / 2, (ll.y + ur.y) / 2); } + +// bool inside(Point& p) const { return ll.x <= p.x && ll.y <= p.y && ur.x >= p.x && ur.y >= p.y; } + + inline bool operator==(const Box& p) + { + return this->ll == p.ll && this->ur == p.ur; + } + + std::vector refine() const; + + std::vector corners() const; + + void translate(Real a); + + // return minimal and maximal value of func + // on the corners of the box + template + std::pair min_max_on_corners(const F& func) const; + + friend std::ostream& operator<<(std::ostream& os, const Box& box); + }; + + std::ostream& operator<<(std::ostream& os, const Box& box); +// template +// Box compute_bounding_box(InputIterator simplices_begin, InputIterator simplices_end) +// { +// if (simplices_begin == simplices_end) { +// return Box(); +// } +// Box bb; +// bb.ll = bb.ur = simplices_begin->pos; +// for (InputIterator it = simplices_begin; it != simplices_end; it++) { +// Point& pos = it->pos; +// if (pos.x < bb.ll.x) { +// bb.ll.x = pos.x; +// } +// if (pos.y < bb.ll.y) { +// bb.ll.y = pos.y; +// } +// if (pos.x > bb.ur.x) { +// bb.ur.x = pos.x; +// } +// if (pos.y > bb.ur.y) { +// bb.ur.y = pos.y; +// } +// } +// return bb; +// } + + Box get_enclosing_box(const Box& box_a, const Box& box_b); + + template + std::pair Box::min_max_on_corners(const F& func) const + { + std::pair min_max { std::numeric_limits::max(), -std::numeric_limits::max() }; + for(Point p : corners()) { + Real value = func(p); + min_max.first = std::min(min_max.first, value); + min_max.second = std::max(min_max.second, value); + } + return min_max; + }; +} // namespace md + +#endif //MATCHING_DISTANCE_BOX_H -- cgit v1.2.3