LSST Applications g063fba187b+cac8b7c890,g0f08755f38+6aee506743,g1653933729+a8ce1bb630,g168dd56ebc+a8ce1bb630,g1a2382251a+b4475c5878,g1dcb35cd9c+8f9bc1652e,g20f6ffc8e0+6aee506743,g217e2c1bcf+73dee94bd0,g28da252d5a+1f19c529b9,g2bbee38e9b+3f2625acfc,g2bc492864f+3f2625acfc,g3156d2b45e+6e55a43351,g32e5bea42b+1bb94961c2,g347aa1857d+3f2625acfc,g35bb328faa+a8ce1bb630,g3a166c0a6a+3f2625acfc,g3e281a1b8c+c5dd892a6c,g3e8969e208+a8ce1bb630,g414038480c+5927e1bc1e,g41af890bb2+8a9e676b2a,g7af13505b9+809c143d88,g80478fca09+6ef8b1810f,g82479be7b0+f568feb641,g858d7b2824+6aee506743,g89c8672015+f4add4ffd5,g9125e01d80+a8ce1bb630,ga5288a1d22+2903d499ea,gb58c049af0+d64f4d3760,gc28159a63d+3f2625acfc,gcab2d0539d+b12535109e,gcf0d15dbbd+46a3f46ba9,gda6a2b7d83+46a3f46ba9,gdaeeff99f8+1711a396fd,ge79ae78c31+3f2625acfc,gef2f8181fd+0a71e47438,gf0baf85859+c1f95f4921,gfa517265be+6aee506743,gfa999e8aa5+17cd334064,w.2024.51
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | List of all members
lsst::sphgeom::UnionRegion Class Reference

UnionRegion is a lazy point-set union of its operands. More...

#include <CompoundRegion.h>

Inheritance diagram for lsst::sphgeom::UnionRegion:
lsst::sphgeom::CompoundRegion lsst::sphgeom::Region

Public Member Functions

 UnionRegion (std::vector< std::unique_ptr< Region > > operands)
 Construct by taking ownership of operands.
 
std::unique_ptr< Regionclone () const override
 clone returns a deep copy of this region.
 
bool isEmpty () const override
 isEmpty returns true when a region does not contain any points.
 
Box getBoundingBox () const override
 getBoundingBox returns a bounding-box for this region.
 
Box3d getBoundingBox3d () const override
 getBoundingBox3d returns a 3-dimensional bounding-box for this region.
 
Circle getBoundingCircle () const override
 getBoundingCircle returns a bounding-circle for this region.
 
bool contains (UnitVector3d const &v) const override
 contains tests whether the given unit vector is inside this region.
 
Relationship relate (Region const &r) const override
 
TriState overlaps (Region const &other) const override
 
TriState overlaps (Box const &) const override
 
TriState overlaps (Circle const &) const override
 
TriState overlaps (ConvexPolygon const &) const override
 
TriState overlaps (Ellipse const &) const override
 
std::vector< std::uint8_tencode () const override
 encode serializes this region into an opaque byte string.
 
virtual bool contains (UnitVector3d const &) const=0
 contains tests whether the given unit vector is inside this region.
 
bool contains (double x, double y, double z) const
 contains tests whether the unit vector defined by the given (not necessarily normalized) coordinates is inside this region.
 
bool contains (double lon, double lat) const
 contains tests whether the unit vector defined by the given longitude and latitude coordinates (in radians) is inside this region.
 
size_t nOperands () const
 
Region const & getOperand (std::size_t n) const
 
Relationship relate (Box const &b) const override
 
Relationship relate (Circle const &c) const override
 
Relationship relate (ConvexPolygon const &p) const override
 
Relationship relate (Ellipse const &e) const override
 

Static Public Member Functions

static std::vector< std::unique_ptr< Region > > getRegions (Region const &region)
 getRegions returns a vector of Region.
 
static std::unique_ptr< UnionRegiondecode (std::vector< std::uint8_t > const &s)
 
static std::unique_ptr< UnionRegiondecode (std::uint8_t const *buffer, size_t n)
 
static std::unique_ptr< RegiondecodeBase64 (std::string const &s)
 
static std::unique_ptr< RegiondecodeBase64 (std::string_view const &s)
 
static TriState decodeOverlapsBase64 (std::string const &s)
 
static TriState decodeOverlapsBase64 (std::string_view const &s)
 

Static Public Attributes

static constexpr std::uint8_t TYPE_CODE = 'u'
 

Protected Member Functions

std::vector< std::uint8_t_encode (std::uint8_t tc) const
 
std::vector< std::unique_ptr< Region > > const & operands () const
 
template<typename Compound >
void flatten_operands ()
 

Static Protected Member Functions

static std::vector< std::unique_ptr< Region > > _decode (std::uint8_t tc, std::uint8_t const *buffer, std::size_t nBytes)
 
static TriState _relationship_to_overlaps (Relationship r)
 

Detailed Description

UnionRegion is a lazy point-set union of its operands.

All operations on a UnionRegion are implementing by delegating to its nested operand regions and combining the results.

Definition at line 118 of file CompoundRegion.h.

Constructor & Destructor Documentation

◆ UnionRegion()

lsst::sphgeom::UnionRegion::UnionRegion ( std::vector< std::unique_ptr< Region > > operands)
explicit

Construct by taking ownership of operands.

Definition at line 171 of file CompoundRegion.cc.

173{
174 flatten_operands<UnionRegion>();
175}
std::vector< std::unique_ptr< Region > > const & operands() const
CompoundRegion(std::vector< std::unique_ptr< Region > > operands) noexcept
Construct by taking ownership of operands.
T move(T... args)

Member Function Documentation

◆ _decode()

std::vector< std::unique_ptr< Region > > lsst::sphgeom::CompoundRegion::_decode ( std::uint8_t tc,
std::uint8_t const * buffer,
std::size_t nBytes )
staticprotectedinherited

Definition at line 135 of file CompoundRegion.cc.

136 {
137 std::uint8_t const *end = buffer + nBytes;
138 if (nBytes == 0) {
139 throw std::runtime_error("Encoded CompoundRegion is truncated.");
140 }
141 if (buffer[0] != tc) {
142 throw std::runtime_error("Byte string is not an encoded CompoundRegion.");
143 }
144 ++buffer;
146 while (buffer != end) {
147 std::uint64_t nBytes = consumeDecodeU64(buffer, end);
148 if (buffer + nBytes > end) {
149 throw std::runtime_error("Encoded CompoundRegion is truncated.");
150 }
151 result.push_back(Region::decode(buffer, nBytes));
152 buffer += nBytes;
153 }
154 return result;
155}
py::object result
Definition _schema.cc:429
int end
static std::unique_ptr< Region > decode(std::vector< std::uint8_t > const &s)
Definition Region.h:162

◆ _encode()

std::vector< std::uint8_t > lsst::sphgeom::CompoundRegion::_encode ( std::uint8_t tc) const
protectedinherited

Definition at line 124 of file CompoundRegion.cc.

124 {
126 buffer.push_back(tc);
127 for (auto&& operand: _operands) {
128 auto operand_buffer = operand->encode();
129 encodeU64(operand_buffer.size(), buffer);
130 buffer.insert(buffer.end(), operand_buffer.begin(), operand_buffer.end());
131 }
132 return buffer;
133}
T end(T... args)
T insert(T... args)
void encodeU64(std::uint64_t item, std::vector< std::uint8_t > &buffer)
encodeU64 appends an uint64 in little-endian byte order to the end of buffer.
Definition codec.h:96
T push_back(T... args)

◆ _relationship_to_overlaps()

static TriState lsst::sphgeom::Region::_relationship_to_overlaps ( Relationship r)
inlinestaticprotectedinherited

Definition at line 206 of file Region.h.

206 {
207 // `relate` returns exact relation when specific bit is set, if it is
208 // not then relation may be true or not.
209 if ((r & DISJOINT) == DISJOINT) {
210 return TriState(false);
211 }
212 if ((r & (WITHIN | CONTAINS)).any()) {
213 return TriState(true);
214 }
215 return TriState();
216 }
bool any(CoordinateExpr< N > const &expr) noexcept
Return true if any elements are true.

◆ clone()

std::unique_ptr< Region > lsst::sphgeom::UnionRegion::clone ( ) const
inlineoverridevirtual

clone returns a deep copy of this region.

Implements lsst::sphgeom::Region.

Definition at line 126 of file CompoundRegion.h.

126{ return std::make_unique<UnionRegion>(*this); }

◆ contains() [1/4]

bool lsst::sphgeom::Region::contains ( double lon,
double lat ) const

contains tests whether the unit vector defined by the given longitude and latitude coordinates (in radians) is inside this region.

Definition at line 117 of file Region.cc.

54 {
55 return contains(UnitVector3d(LonLat::fromRadians(lon, lat)));
56}
static LonLat fromRadians(double lon, double lat)
Definition LonLat.h:62
bool contains(UnitVector3d const &v) const override
contains tests whether the given unit vector is inside this region.

◆ contains() [2/4]

bool lsst::sphgeom::Region::contains ( double x,
double y,
double z ) const

contains tests whether the unit vector defined by the given (not necessarily normalized) coordinates is inside this region.

Definition at line 113 of file Region.cc.

50 {
51 return contains(UnitVector3d(x, y, z));
52}
double z
Definition Match.cc:44
int y
Definition SpanSet.cc:48

◆ contains() [3/4]

virtual bool lsst::sphgeom::Region::contains ( UnitVector3d const & ) const
virtual

contains tests whether the given unit vector is inside this region.

Implements lsst::sphgeom::Region.

◆ contains() [4/4]

bool lsst::sphgeom::UnionRegion::contains ( UnitVector3d const & ) const
overridevirtual

contains tests whether the given unit vector is inside this region.

Implements lsst::sphgeom::Region.

Definition at line 199 of file CompoundRegion.cc.

199 {
200 for (auto&& operand: operands()) {
201 if (operand->contains(v)) {
202 return true;
203 }
204 }
205 return false;
206}

◆ decode() [1/2]

static std::unique_ptr< UnionRegion > lsst::sphgeom::UnionRegion::decode ( std::uint8_t const * buffer,
size_t n )
inlinestatic

decode deserializes a UnionRegion from a byte string produced by encode.

Definition at line 147 of file CompoundRegion.h.

147 {
148 return std::make_unique<UnionRegion>(_decode(TYPE_CODE, buffer, n));
149 }
static std::vector< std::unique_ptr< Region > > _decode(std::uint8_t tc, std::uint8_t const *buffer, std::size_t nBytes)
static constexpr std::uint8_t TYPE_CODE

◆ decode() [2/2]

static std::unique_ptr< UnionRegion > lsst::sphgeom::UnionRegion::decode ( std::vector< std::uint8_t > const & s)
inlinestatic

decode deserializes a UnionRegion from a byte string produced by encode.

Definition at line 144 of file CompoundRegion.h.

144 {
145 return decode(s.data(), s.size());
146 }
static std::unique_ptr< UnionRegion > decode(std::vector< std::uint8_t > const &s)

◆ decodeBase64() [1/2]

static std::unique_ptr< Region > lsst::sphgeom::Region::decodeBase64 ( std::string const & s)
inlinestaticinherited

decodeBase64 deserializes a Region from an ASCII string produced by encode and then base64-encoding that result.

This method also interprets ':' as a delimiter for the elements of a UnionRegion, to support cases where a union of region is constructed server-side in a database as a concatenation with that delimiter.

Definition at line 176 of file Region.h.

176 {
177 return decodeBase64(s);
178 }
static std::unique_ptr< Region > decodeBase64(std::string const &s)
Definition Region.h:176

◆ decodeBase64() [2/2]

std::unique_ptr< Region > lsst::sphgeom::Region::decodeBase64 ( std::string_view const & s)
staticinherited

decodeBase64 deserializes a Region from an ASCII string produced by encode and then base64-encoding that result.

This method also interprets ':' as a delimiter for the elements of a UnionRegion, to support cases where a union of region is constructed server-side in a database as a concatenation with that delimiter.

Definition at line 93 of file Region.cc.

93 {
94 if (s.empty()) {
95 return std::unique_ptr<UnionRegion>(new UnionRegion({}));
96 }
97 auto region_begin = s.begin();
98 auto region_end = std::find(s.begin(), s.end(), ':');
99 if (region_end != s.end()) {
101 while (region_end != s.end()) {
102 auto bytes = base64::decode_into<std::vector<std::uint8_t>>(region_begin, region_end);
103 union_args.push_back(decode(bytes));
104 region_begin = region_end;
105 ++region_begin;
106 region_end = std::find(region_begin, s.end(), ':');
107 }
108 auto bytes = base64::decode_into<std::vector<std::uint8_t>>(region_begin, region_end);
109 union_args.push_back(decode(bytes));
110 return std::unique_ptr<UnionRegion>(new UnionRegion(std::move(union_args)));
111 } else {
112 auto bytes = base64::decode_into<std::vector<std::uint8_t>>(region_begin, region_end);
113 return decode(bytes);
114 }
115}
table::Key< table::Array< std::uint8_t > > bytes
Definition python.h:135
T find(T... args)

◆ decodeOverlapsBase64() [1/2]

static TriState lsst::sphgeom::Region::decodeOverlapsBase64 ( std::string const & s)
inlinestaticinherited

decodeOverlapsBase64 evaluates an encoded overlap expression.

A single overlap expression is formed by concatenating a pair of base64-encoded regions (Region::encode then base64 encoding) with '&' as the delimiter. Multiple such pairwise overlap expressions can then be concatenated with '|' as the delimiter to form the logical OR.

Definition at line 190 of file Region.h.

190 {
191 return decodeOverlapsBase64(s);
192 }
static TriState decodeOverlapsBase64(std::string const &s)
Definition Region.h:190

◆ decodeOverlapsBase64() [2/2]

TriState lsst::sphgeom::Region::decodeOverlapsBase64 ( std::string_view const & s)
staticinherited

decodeOverlapsBase64 evaluates an encoded overlap expression.

A single overlap expression is formed by concatenating a pair of base64-encoded regions (Region::encode then base64 encoding) with '&' as the delimiter. Multiple such pairwise overlap expressions can then be concatenated with '|' as the delimiter to form the logical OR.

Definition at line 117 of file Region.cc.

117 {
118 TriState result(false);
119 if (s.empty()) {
120 // False makes the most sense as the limit of a logical OR of zero
121 // terms (e.g. `any([])` in Python).
122 return result;
123 }
124 auto begin = s.begin();
125 while (result != true) { // if result is known to be true, we're done.
126 auto mid = std::find(begin, s.end(), '&');
127 if (mid == s.end()) {
128 throw std::runtime_error("No '&' found in encoded overlap expression term.");
129 }
130 auto a = Region::decode(base64::decode_into<std::vector<std::uint8_t>>(begin, mid));
131 ++mid;
132 auto end = std::find(mid, s.end(), '|');
133 auto b = Region::decode(base64::decode_into<std::vector<std::uint8_t>>(mid, end));
134 result = result | a->overlaps(*b);
135 if (end == s.end()) {
136 break;
137 } else {
138 begin = end;
139 ++begin;
140 }
141 }
142 return result;
143}
table::Key< int > b
T begin(T... args)

◆ encode()

std::vector< std::uint8_t > lsst::sphgeom::UnionRegion::encode ( ) const
inlineoverridevirtual

encode serializes this region into an opaque byte string.

Byte strings emitted by encode can be deserialized with decode.

Implements lsst::sphgeom::Region.

Definition at line 139 of file CompoundRegion.h.

139{ return _encode(TYPE_CODE); }
std::vector< std::uint8_t > _encode(std::uint8_t tc) const

◆ flatten_operands()

template<typename Compound >
void lsst::sphgeom::CompoundRegion::flatten_operands ( )
protectedinherited

Definition at line 103 of file CompoundRegion.cc.

103 {
104 for (size_t i = 0; i != _operands.size(); ) {
105 if (auto compound = dynamic_cast<Compound*>(_operands[i].get())) {
106 // Move all regions from this operand, then remove it.
107 std::move(
108 compound->_operands.begin(),
109 compound->_operands.end(),
110 std::inserter(_operands, _operands.begin() + i + 1)
111 );
112 _operands.erase(_operands.begin() + i);
113 } else {
114 ++ i;
115 }
116 }
117}
T inserter(T... args)

◆ getBoundingBox()

Box lsst::sphgeom::UnionRegion::getBoundingBox ( ) const
overridevirtual

getBoundingBox returns a bounding-box for this region.

Implements lsst::sphgeom::Region.

Definition at line 187 of file CompoundRegion.cc.

187 {
188 return getUnionBounds(*this, [](Region const &r) { return r.getBoundingBox(); });
189}

◆ getBoundingBox3d()

Box3d lsst::sphgeom::UnionRegion::getBoundingBox3d ( ) const
overridevirtual

getBoundingBox3d returns a 3-dimensional bounding-box for this region.

Implements lsst::sphgeom::Region.

Definition at line 191 of file CompoundRegion.cc.

191 {
192 return getUnionBounds(*this, [](Region const &r) { return r.getBoundingBox3d(); });
193}

◆ getBoundingCircle()

Circle lsst::sphgeom::UnionRegion::getBoundingCircle ( ) const
overridevirtual

getBoundingCircle returns a bounding-circle for this region.

Implements lsst::sphgeom::Region.

Definition at line 195 of file CompoundRegion.cc.

195 {
196 return getUnionBounds(*this, [](Region const &r) { return r.getBoundingCircle(); });
197}

◆ getOperand()

Region const & lsst::sphgeom::CompoundRegion::getOperand ( std::size_t n) const
inlineinherited

Definition at line 74 of file CompoundRegion.h.

74 {
75 return *_operands[n];
76 }

◆ getRegions()

std::vector< std::unique_ptr< Region > > lsst::sphgeom::Region::getRegions ( Region const & region)
staticinherited

getRegions returns a vector of Region.

Definition at line 145 of file Region.cc.

145 {
147 if (auto union_region = dynamic_cast<UnionRegion const *>(&region)) {
148 for(unsigned i = 0; i < union_region->nOperands(); ++i) {
149 result.emplace_back(union_region->getOperand(i).clone());
150 }
151 } else if(auto intersection_region = dynamic_cast<IntersectionRegion const *>(&region)) {
152 for(unsigned i = 0; i < intersection_region->nOperands(); ++i) {
153 result.emplace_back(intersection_region->getOperand(i).clone());
154 }
155 } else {
156 result.emplace_back(region.clone());
157 }
158 return result;
159}
T emplace_back(T... args)

◆ isEmpty()

bool lsst::sphgeom::UnionRegion::isEmpty ( ) const
overridevirtual

isEmpty returns true when a region does not contain any points.

Implements lsst::sphgeom::Region.

Definition at line 177 of file CompoundRegion.cc.

177 {
178 // It can be empty when there are no operands or all operands are empty.
179 for (auto&& operand: operands()) {
180 if (not operand->isEmpty()) {
181 return false;
182 }
183 }
184 return true;
185}

◆ nOperands()

size_t lsst::sphgeom::CompoundRegion::nOperands ( ) const
inlineinherited

Definition at line 71 of file CompoundRegion.h.

71{ return _operands.size(); }

◆ operands()

std::vector< std::unique_ptr< Region > > const & lsst::sphgeom::CompoundRegion::operands ( ) const
inlineprotectedinherited

Definition at line 104 of file CompoundRegion.h.

104{ return _operands; }

◆ overlaps() [1/5]

TriState lsst::sphgeom::UnionRegion::overlaps ( Box const & ) const
overridevirtual

overlaps tests whether two regions overlap. This method returns a TriState object, when the value is true it means that regions definitely overlap, false means they are definitely disjont, and unknown state means that they may or may not overlap.

Implements lsst::sphgeom::Region.

Definition at line 263 of file CompoundRegion.cc.

263 {
264 return overlaps(static_cast<Region const&>(b));
265}
TriState overlaps(Region const &other) const override

◆ overlaps() [2/5]

TriState lsst::sphgeom::UnionRegion::overlaps ( Circle const & ) const
overridevirtual

overlaps tests whether two regions overlap. This method returns a TriState object, when the value is true it means that regions definitely overlap, false means they are definitely disjont, and unknown state means that they may or may not overlap.

Implements lsst::sphgeom::Region.

Definition at line 267 of file CompoundRegion.cc.

267 {
268 return overlaps(static_cast<Region const&>(c));
269}

◆ overlaps() [3/5]

TriState lsst::sphgeom::UnionRegion::overlaps ( ConvexPolygon const & ) const
overridevirtual

overlaps tests whether two regions overlap. This method returns a TriState object, when the value is true it means that regions definitely overlap, false means they are definitely disjont, and unknown state means that they may or may not overlap.

Implements lsst::sphgeom::Region.

Definition at line 271 of file CompoundRegion.cc.

271 {
272 return overlaps(static_cast<Region const&>(p));
273}

◆ overlaps() [4/5]

TriState lsst::sphgeom::UnionRegion::overlaps ( Ellipse const & ) const
overridevirtual

overlaps tests whether two regions overlap. This method returns a TriState object, when the value is true it means that regions definitely overlap, false means they are definitely disjont, and unknown state means that they may or may not overlap.

Implements lsst::sphgeom::Region.

Definition at line 275 of file CompoundRegion.cc.

275 {
276 return overlaps(static_cast<Region const&>(e));
277}

◆ overlaps() [5/5]

TriState lsst::sphgeom::UnionRegion::overlaps ( Region const & other) const
overridevirtual

overlaps tests whether two regions overlap. This method returns a TriState object, when the value is true it means that regions definitely overlap, false means they are definitely disjont, and unknown state means that they may or may not overlap.

Implements lsst::sphgeom::Region.

Definition at line 239 of file CompoundRegion.cc.

239 {
240 // Union overlaps if any operand overlaps, and disjoint when all are
241 // disjoint. Empty union is disjoint with anyhting.
242 if (nOperands() == 0) {
243 return TriState(false);
244 }
245 bool may_overlap = false;
246 for (auto&& operand: operands()) {
247 auto state = operand->overlaps(other);
248 if (state == true) {
249 // Definitely overlap.
250 return TriState(true);
251 } if (not state.known()) {
252 // May or may not overlap.
253 may_overlap = true;
254 }
255 }
256 if (may_overlap) {
257 return TriState();
258 }
259 // None overlaps.
260 return TriState(false);
261}

◆ relate() [1/5]

Relationship lsst::sphgeom::CompoundRegion::relate ( Box const & ) const
overridevirtualinherited

relate computes the spatial relationships between this region A and another region B. The return value S is a bitset with the following properties:

  • Bit S & DISJOINT is set only if A and B do not have any points in common.
  • Bit S & CONTAINS is set only if A contains all points in B.
  • Bit S & WITHIN is set only if B contains all points in A.

Said another way: if the CONTAINS, WITHIN or DISJOINT bit is set, then the corresponding spatial relationship between the two regions holds conclusively. If it is not set, the relationship may or may not hold.

These semantics allow for conservative relationship computations. In particular, a Region may choose to implement relate by replacing itself and/or the argument with a simplified bounding region.

Implements lsst::sphgeom::Region.

Definition at line 119 of file CompoundRegion.cc.

119{ return relate(static_cast<Region const &>(b)); }
virtual Relationship relate(Region const &r) const =0

◆ relate() [2/5]

Relationship lsst::sphgeom::CompoundRegion::relate ( Circle const & ) const
overridevirtualinherited

relate computes the spatial relationships between this region A and another region B. The return value S is a bitset with the following properties:

  • Bit S & DISJOINT is set only if A and B do not have any points in common.
  • Bit S & CONTAINS is set only if A contains all points in B.
  • Bit S & WITHIN is set only if B contains all points in A.

Said another way: if the CONTAINS, WITHIN or DISJOINT bit is set, then the corresponding spatial relationship between the two regions holds conclusively. If it is not set, the relationship may or may not hold.

These semantics allow for conservative relationship computations. In particular, a Region may choose to implement relate by replacing itself and/or the argument with a simplified bounding region.

Implements lsst::sphgeom::Region.

Definition at line 120 of file CompoundRegion.cc.

120{ return relate(static_cast<Region const &>(c)); }

◆ relate() [3/5]

Relationship lsst::sphgeom::CompoundRegion::relate ( ConvexPolygon const & ) const
overridevirtualinherited

relate computes the spatial relationships between this region A and another region B. The return value S is a bitset with the following properties:

  • Bit S & DISJOINT is set only if A and B do not have any points in common.
  • Bit S & CONTAINS is set only if A contains all points in B.
  • Bit S & WITHIN is set only if B contains all points in A.

Said another way: if the CONTAINS, WITHIN or DISJOINT bit is set, then the corresponding spatial relationship between the two regions holds conclusively. If it is not set, the relationship may or may not hold.

These semantics allow for conservative relationship computations. In particular, a Region may choose to implement relate by replacing itself and/or the argument with a simplified bounding region.

Implements lsst::sphgeom::Region.

Definition at line 121 of file CompoundRegion.cc.

121{ return relate(static_cast<Region const &>(p)); }

◆ relate() [4/5]

Relationship lsst::sphgeom::CompoundRegion::relate ( Ellipse const & ) const
overridevirtualinherited

relate computes the spatial relationships between this region A and another region B. The return value S is a bitset with the following properties:

  • Bit S & DISJOINT is set only if A and B do not have any points in common.
  • Bit S & CONTAINS is set only if A contains all points in B.
  • Bit S & WITHIN is set only if B contains all points in A.

Said another way: if the CONTAINS, WITHIN or DISJOINT bit is set, then the corresponding spatial relationship between the two regions holds conclusively. If it is not set, the relationship may or may not hold.

These semantics allow for conservative relationship computations. In particular, a Region may choose to implement relate by replacing itself and/or the argument with a simplified bounding region.

Implements lsst::sphgeom::Region.

Definition at line 122 of file CompoundRegion.cc.

122{ return relate(static_cast<Region const &>(e)); }

◆ relate() [5/5]

Relationship lsst::sphgeom::UnionRegion::relate ( Region const & ) const
overridevirtual

relate computes the spatial relationships between this region A and another region B. The return value S is a bitset with the following properties:

  • Bit S & DISJOINT is set only if A and B do not have any points in common.
  • Bit S & CONTAINS is set only if A contains all points in B.
  • Bit S & WITHIN is set only if B contains all points in A.

Said another way: if the CONTAINS, WITHIN or DISJOINT bit is set, then the corresponding spatial relationship between the two regions holds conclusively. If it is not set, the relationship may or may not hold.

These semantics allow for conservative relationship computations. In particular, a Region may choose to implement relate by replacing itself and/or the argument with a simplified bounding region.

Implements lsst::sphgeom::CompoundRegion.

Definition at line 208 of file CompoundRegion.cc.

208 {
209 if (nOperands() == 0) {
210 return DISJOINT;
211 }
212 auto result = DISJOINT | WITHIN;
213 // When result becomes CONTAINS we can stop checking.
214 auto const stop = CONTAINS;
215 for (auto&& operand: operands()) {
216 auto rel = operand->relate(rhs);
217 // All operands must be disjoint with the given region for the union
218 // to be disjoint with it.
219 if ((rel & DISJOINT) != DISJOINT) {
220 result &= ~DISJOINT;
221 }
222 // All operands must be within the given region for the union to be
223 // within it.
224 if ((rel & WITHIN) != WITHIN) {
225 result &= ~WITHIN;
226 }
227 // If any operand contains the given region, the union contains it.
228 if ((rel & CONTAINS) == CONTAINS) {
229 result |= CONTAINS;
230 }
231 if (result == stop) {
232 break;
233 }
234 }
235
236 return result;
237}

Member Data Documentation

◆ TYPE_CODE

constexpr std::uint8_t lsst::sphgeom::UnionRegion::TYPE_CODE = 'u'
staticconstexpr

Definition at line 120 of file CompoundRegion.h.


The documentation for this class was generated from the following files: