6 #include <boost/range/algorithm/max_element.hpp> 7 #include <boost/range/algorithm/min_element.hpp> 8 #include <boost/range/algorithm_ext/is_sorted.hpp> 9 #include <boost/range/algorithm_ext/erase.hpp> 21 template<
typename Value>
35 x_( {min.
X(), max.
X()}),
36 y_( {min.Y(),
max.Y()})
40 x_( {min.
X(), min.
X() + width}),
41 y_( {min.Y(), min.Y() + height})
44 Rectangle(Value x_min, Value x_max, Value y_min, Value y_max) :
49 void SetX(Value
const& min, Value
const&
max) {
53 void SetY(Value
const& min, Value
const&
max) {
65 void SetX(std::pair<Value, Value>
const&
x) {
69 void SetY(std::pair<Value, Value>
const&
y) {
143 return {x_.
Min(), y_.
Min()};
147 return {x_.
Max(), y_.
Max()};
174 template <
typename Value2>
175 void WidenY(
Range<Value> const& bound_x, std::vector<Value2>
const& xs1, std::vector<Value2>
const& ys1) {
179 boost::remove_erase(xs, 0);
181 boost::remove_erase(ys, 0);
183 if (boost::range::is_sorted(xs, Smaller<Value2>())) {
185 bound.
SetMin(boost::range::lower_bound(xs, Value2(bound_x.
Min())) - xs.begin());
186 bound.SetMax(boost::range::upper_bound(xs, Value2(bound_x.
Max())) - xs.begin());
187 }
else if (boost::range::is_sorted(xs, Larger<Value2>())) {
189 bound.SetMin(boost::range::lower_bound(xs, Value2(bound_x.
Max()), Larger<Value2>()) - xs.begin());
190 bound.SetMax(boost::range::upper_bound(xs, Value2(bound_x.
Min()), Larger<Value2>()) - xs.begin());
194 bound.SetMax(xs.size());
198 auto min = std::min_element(ys.begin() + bound.Min(), ys.begin() + bound.Max());
201 bound_y.SetMax(*std::max_element(ys.begin() + bound.Min(), ys.begin() + bound.Max()));
206 template <
typename Value2>
208 auto min_y = boost::range::upper_bound(ys, Value2(y.
Min())) - ys.begin();
209 auto max_y = boost::range::lower_bound(ys, Value2(y.
Max())) - ys.begin();
210 auto min = std::min_element(xs.begin() + min_y, xs.begin() + max_y, SmallerButNonZero<Value2>());
211 auto max = std::max_element(xs.begin() + min_y, xs.begin() + max_y);
220 stream << rectangle.x_ << rectangle.y_;
226 template <
typename Value_2_>
227 std::function<bool(Value_2_ value_1, Value_2_ value_2)> Smaller() {
228 return [](Value_2_ value_1, Value_2_ value_2) {
229 return value_1 < value_2;
233 template <
typename Value_2_>
234 std::function<bool(Value_2_ value_1, Value_2_ value_2)> SmallerButNonZero() {
235 return [](Value_2_ value_1, Value_2_ value_2) {
236 return value_1 != 0 ? value_1 < value_2 : value_1 > value_2;
240 template <
typename Value_2_>
241 std::function<bool(Value_2_ value_1, Value_2_ value_2)> Larger() {
242 return [](Value_2_ value_1, Value_2_ value_2) {
243 return value_1 > value_2;
Rectangle(Range< Value > x, Range< Value > y)
Definition: Rectangle.hh:29
Value_ Min() const
Definition: Range.hh:91
Range< Value > & Vertical()
Definition: Rectangle.hh:154
void SetXMin(Value x_min)
Definition: Rectangle.hh:81
void SetYMax(Value y_max)
Definition: Rectangle.hh:93
void WidenY(Range< Value > const &y)
Definition: Rectangle.hh:114
Range< Value > const & Horizontal() const
Definition: Rectangle.hh:158
friend auto & operator<<(std::ostream &stream, Rectangle const &rectangle)
Output stream operator.
Definition: Rectangle.hh:218
Value Height() const
Definition: Rectangle.hh:170
Rectangle of two Ranges.
Definition: Rectangle.hh:22
void WidenY(Range< Value > const &bound_x, std::vector< Value2 > const &xs1, std::vector< Value2 > const &ys1)
Definition: Rectangle.hh:175
void WidenXMin(Value x_min)
Definition: Rectangle.hh:106
Value_ Max() const
Definition: Range.hh:95
Value YMax() const
Definition: Rectangle.hh:138
void WidenYMax(Value y_max)
Definition: Rectangle.hh:122
Rectangle(Value x_min, Value x_max, Value y_min, Value y_max)
Definition: Rectangle.hh:44
void SetY(std::pair< Value, Value > const &y)
Definition: Rectangle.hh:69
void Widen(Rectangle< Value > const &range)
Definition: Rectangle.hh:97
Rectangle()
Definition: Rectangle.hh:27
Range< Value > & Horizontal()
Definition: Rectangle.hh:150
void SetY(Range< Value > const &y)
Definition: Rectangle.hh:61
void SetYMin(Value y_min)
Definition: Rectangle.hh:89
Range< Value > const & Vertical() const
Definition: Rectangle.hh:162
void WidenYMin(Value y_min)
Definition: Rectangle.hh:118
Value_ Length() const
Definition: Range.hh:122
Value Width() const
Definition: Rectangle.hh:166
void ResetY()
Definition: Rectangle.hh:73
void Widen(Range< Value_ > const &bound)
Definition: Range.hh:70
Boosted Collider Analysis.
Definition: Analysis.hh:15
void WidenXMax(Value x_max)
Definition: Rectangle.hh:110
void SetY(Value const &min, Value const &max)
Definition: Rectangle.hh:53
void WidenX(Range< Value > const &y, std::vector< Value2 > const &xs, std::vector< Value2 > const &ys)
Definition: Rectangle.hh:207
void SetMin(Value_ min)
Definition: Range.hh:48
void SetX(Value const &min, Value const &max)
Definition: Rectangle.hh:49
void SetXMax(Value x_max)
Definition: Rectangle.hh:85
constexpr Value_ const & X() const
Getter for X.
Definition: Vector2.hh:150
Vector2< Value > Min() const
Definition: Rectangle.hh:142
Rectangle(Vector2< Value > min, Value width, Value height)
Definition: Rectangle.hh:39
Value max(Value const &value_1, Value const &value_2)
Maximal value.
Definition: Units.hh:260
void SetX(std::pair< Value, Value > const &x)
Definition: Rectangle.hh:65
Value XMin() const
Definition: Rectangle.hh:126
void WidenX(Range< Value > const &x)
Definition: Rectangle.hh:102
Vector2< Value > Max() const
Definition: Rectangle.hh:146
void ResetX()
Definition: Rectangle.hh:77
Two dimensional Vector.
Definition: PseudoJet.hh:23
Rectangle(Vector2< Value > min, Vector2< Value > max)
Definition: Rectangle.hh:34
void SetMax(Value_ max)
Definition: Range.hh:53
void WidenMin(Value_ min)
Definition: Range.hh:80
Value YMin() const
Definition: Rectangle.hh:134
void WidenMax(Value_ max)
Definition: Range.hh:86
void SetX(Range< Value > const &x)
Definition: Rectangle.hh:57
void Set(Value_ min, Value_ max)
Definition: Range.hh:58
Value XMax() const
Definition: Rectangle.hh:130