LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Interval.h
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2014-2015 AURA/LSST.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <https://www.lsstcorp.org/LegalNotices/>.
21  */
22 
23 #ifndef LSST_SPHGEOM_INTERVAL_H_
24 #define LSST_SPHGEOM_INTERVAL_H_
25 
28 
29 #include <algorithm>
30 
31 #include "Relationship.h"
32 
33 
34 namespace lsst {
35 namespace sphgeom {
36 
47 template <typename Derived, typename Scalar>
48 class Interval {
49 public:
51  Interval() : _a(1.0), _b(0.0) {}
52 
54  explicit Interval(Scalar x) : _a(x), _b(x) {}
55 
57  Interval(Scalar x, Scalar y) : _a(x), _b(y) {}
58 
61  bool operator==(Interval const & i) const {
62  return (_a == i._a && _b == i._b) || (i.isEmpty() && isEmpty());
63  }
64 
65  bool operator!=(Interval const & i) const { return !(*this == i); }
66 
68  bool operator==(Scalar x) const {
69  return (_a == x && _b == x) || (x != x && isEmpty());
70  }
71 
72  bool operator!=(Scalar x) const { return !(*this == x); }
73 
76  Scalar getA() const { return _a; }
77 
80  Scalar getB() const { return _b; }
81 
83  bool isEmpty() const {
84  return !(_a <= _b); // returns true when _a and/or _b is NaN
85  }
86 
89  Scalar getCenter() const { return 0.5 * (_a + _b); }
90 
93  Scalar getSize() const { return _b - _a; }
94 
98  bool contains(Scalar x) const {
99  return (_a <= x && x <= _b) || x != x;
100  }
101 
102  bool contains(Interval const & x) const {
103  if (x.isEmpty()) {
104  return true;
105  } else if (isEmpty()) {
106  return false;
107  }
108  return _a <= x._a && _b >= x._b;
109  }
111 
115  bool isDisjointFrom(Scalar x) const {
116  return !intersects(x);
117  }
118 
119  bool isDisjointFrom(Interval const & x) const {
120  if (isEmpty() || x.isEmpty()) {
121  return true;
122  }
123  return _a > x._b || _b < x._a;
124  }
126 
130  bool intersects(Scalar x) const { return _a <= x && x <= _b; }
131 
132  bool intersects(Interval const & x) const {
133  return !isDisjointFrom(x);
134  }
136 
140  bool isWithin(Scalar x) const {
141  return (_a == x && _b == x) || isEmpty();
142  }
143 
144  bool isWithin(Interval const & x) const {
145  return x.contains(*this);
146  }
148 
154  Relationship relate(Interval const & x) const;
156 
160  if (x != x) {
161  _a = x;
162  _b = x;
163  } else {
164  _a = std::max(_a, x);
165  _b = std::min(_b, x);
166  }
167  return *this;
168  }
169 
170  Interval & clipTo(Interval const & x) {
171  if (x.isEmpty()) {
172  *this = x;
173  } else if (!isEmpty()) {
174  _a = std::max(_a, x._a);
175  _b = std::min(_b, x._b);
176  }
177  return *this;
178  }
180 
183  Derived clippedTo(Scalar x) const { return Interval(*this).clipTo(x); }
184 
185  Derived clippedTo(Interval const & x) const {
186  return Interval(*this).clipTo(x);
187  }
189 
193  if (isEmpty()) {
194  _a = x;
195  _b = x;
196  } else if (x < _a) {
197  _a = x;
198  } else if (x > _b) {
199  _b = x;
200  }
201  return *this;
202  }
203 
205  if (isEmpty()) {
206  *this = x;
207  } else if (!x.isEmpty()) {
208  _a = std::min(_a, x._a);
209  _b = std::max(_b, x._b);
210  }
211  return *this;
212  }
214 
218  Derived expandedTo(Scalar x) const { return Interval(*this).expandTo(x); }
219 
220  Derived expandedTo(Interval const & x) const {
221  return Interval(*this).expandTo(x);
222  }
224 
231  if (x == x && !isEmpty()) {
232  _a = _a - x;
233  _b = _b + x;
234  }
235  return *this;
236  }
237 
238  Interval & erodeBy(Scalar x) { return dilateBy(-x); }
239  Derived dilatedBy(Scalar x) const { return Interval(*this).dilateBy(x); }
240  Derived erodedBy(Scalar x) const { return Interval(*this).erodeBy(x); }
241 
242 private:
243  Scalar _a;
244  Scalar _b;
245 };
246 
247 
248 template <typename Derived, typename Scalar>
250  if (isEmpty()) {
251  if (x != x) {
252  return CONTAINS | DISJOINT | WITHIN;
253  }
254  return DISJOINT | WITHIN;
255  }
256  if (x != x) {
257  return CONTAINS | DISJOINT;
258  }
259  if (_a == x && _b == x) {
260  return CONTAINS | WITHIN;
261  }
262  if (intersects(x)) {
263  return CONTAINS;
264  }
265  return DISJOINT;
266 }
267 
268 template <typename Derived, typename Scalar>
270  Interval<Derived, Scalar> const & x) const
271 {
272  if (isEmpty()) {
273  if (x.isEmpty()) {
274  return CONTAINS | DISJOINT | WITHIN;
275  }
276  return DISJOINT | WITHIN;
277  }
278  if (x.isEmpty()) {
279  return CONTAINS | DISJOINT;
280  }
281  if (_a == x._a && _b == x._b) {
282  return CONTAINS | WITHIN;
283  }
284  if (_a > x._b || _b < x._a) {
285  return DISJOINT;
286  }
287  if (_a <= x._a && _b >= x._b) {
288  return CONTAINS;
289  }
290  if (x._a <= _a && x._b >= _b) {
291  return WITHIN;
292  }
293  return INTERSECTS;
294 }
295 
296 }} // namespace lsst::sphgeom
297 
298 #endif // LSST_SPHGEOM_INTERVAL_H_
double x
int y
Definition: SpanSet.cc:48
Interval represents a closed interval of the real numbers by its upper and lower bounds.
Definition: Interval.h:48
Interval()
This constructor creates an empty interval.
Definition: Interval.h:51
bool isDisjointFrom(Scalar x) const
Definition: Interval.h:115
Interval(Scalar x, Scalar y)
This constructor creates an interval from the given endpoints.
Definition: Interval.h:57
bool isWithin(Scalar x) const
Definition: Interval.h:140
Derived dilatedBy(Scalar x) const
Definition: Interval.h:239
bool operator==(Scalar x) const
A closed interval is equal to a point x if both endpoints equal x.
Definition: Interval.h:68
Derived clippedTo(Interval const &x) const
Definition: Interval.h:185
Interval & expandTo(Scalar x)
Definition: Interval.h:192
bool operator!=(Scalar x) const
Definition: Interval.h:72
bool isWithin(Interval const &x) const
Definition: Interval.h:144
bool intersects(Interval const &x) const
Definition: Interval.h:132
Interval & clipTo(Interval const &x)
Definition: Interval.h:170
Scalar getSize() const
getSize returns the size (length, width) of this interval.
Definition: Interval.h:93
Derived expandedTo(Interval const &x) const
Definition: Interval.h:220
Interval & clipTo(Scalar x)
Definition: Interval.h:159
Interval & erodeBy(Scalar x)
Definition: Interval.h:238
bool isEmpty() const
isEmpty returns true if this interval does not contain any points.
Definition: Interval.h:83
Derived expandedTo(Scalar x) const
Definition: Interval.h:218
Derived clippedTo(Scalar x) const
Definition: Interval.h:183
bool operator!=(Interval const &i) const
Definition: Interval.h:65
Relationship relate(Interval const &x) const
Definition: Interval.h:269
Interval & expandTo(Interval const &x)
Definition: Interval.h:204
bool contains(Interval const &x) const
Definition: Interval.h:102
Interval & dilateBy(Scalar x)
For positive x, dilateBy morphologically dilates this interval by [-x,x], which is equivalent to the ...
Definition: Interval.h:230
Derived erodedBy(Scalar x) const
Definition: Interval.h:240
bool isDisjointFrom(Interval const &x) const
Definition: Interval.h:119
Relationship relate(Scalar x) const
Definition: Interval.h:249
bool operator==(Interval const &i) const
Two closed intervals are equal if their endpoints are the same, or both are empty.
Definition: Interval.h:61
bool intersects(Scalar x) const
Definition: Interval.h:130
Scalar getCenter() const
getCenter returns the center of this interval.
Definition: Interval.h:89
Scalar getA() const
getA returns the lower endpoint of this interval.
Definition: Interval.h:76
bool contains(Scalar x) const
Definition: Interval.h:98
Scalar getB() const
getB returns the upper endpoint of this interval.
Definition: Interval.h:80
Interval(Scalar x)
This constructor creates a closed interval containing only x.
Definition: Interval.h:54
T max(T... args)
T min(T... args)
double Scalar
Typedefs to be used for probability and parameter values.
Definition: common.h:44
A base class for image defects.
This file provides a type alias for describing set relationships.