LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
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

std::unique_ptr< Regionclone () const override
 clone returns a deep copy of this region. More...
 
Box getBoundingBox () const override
 getBoundingBox returns a bounding-box for this region. More...
 
Box3d getBoundingBox3d () const override
 getBoundingBox3d returns a 3-dimensional bounding-box for this region. More...
 
Circle getBoundingCircle () const override
 getBoundingCircle returns a bounding-circle for this region. More...
 
bool contains (UnitVector3d const &v) const override
 contains tests whether the given unit vector is inside this region. More...
 
Relationship relate (Region const &r) const override
 
std::vector< uint8_t > encode () const override
 encode serializes this region into an opaque byte string. More...
 
 CompoundRegion (Region const &first, Region const &second)
 Construct by copying or taking ownership of operands. More...
 
 CompoundRegion (std::array< std::unique_ptr< Region >, 2 > operands) noexcept
 
 CompoundRegion (CompoundRegion const &)
 
 CompoundRegion (CompoundRegion &&) noexcept=default
 
virtual bool contains (UnitVector3d const &) const=0
 contains tests whether the given unit vector is inside this region. More...
 
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. More...
 
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. More...
 
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::unique_ptr< UnionRegiondecode (std::vector< uint8_t > const &s)
 
static std::unique_ptr< UnionRegiondecode (uint8_t const *buffer, size_t n)
 

Static Public Attributes

static constexpr uint8_t TYPE_CODE = 'u'
 

Protected Member Functions

std::vector< std::uint8_t_encode (std::uint8_t tc) const
 

Static Protected Member Functions

static std::array< std::unique_ptr< Region >, 2 > _decode (std::uint8_t tc, std::uint8_t const *buffer, std::size_t nBytes)
 

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 101 of file CompoundRegion.h.

Member Function Documentation

◆ _decode()

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

Definition at line 97 of file CompoundRegion.cc.

98 {
99 std::uint8_t const *end = buffer + nBytes;
100 if (nBytes == 0) {
101 throw std::runtime_error("Encoded CompoundRegion is truncated.");
102 }
103 if (buffer[0] != tc) {
104 throw std::runtime_error("Byte string is not an encoded CompoundRegion.");
105 }
106 ++buffer;
108 std::uint64_t nBytes1 = consumeDecodeU64(buffer, end);
109 result[0] = Region::decode(buffer, nBytes1);
110 buffer += nBytes1;
111 std::uint64_t nBytes2 = consumeDecodeU64(buffer, end);
112 result[1] = Region::decode(buffer, nBytes2);
113 buffer += nBytes2;
114 if (buffer != end) {
115 throw std::runtime_error("Encoded CompoundRegion is has unexpected additional bytes.");
116 }
117 return result;
118}
py::object result
Definition: _schema.cc:429
int end
static std::unique_ptr< Region > decode(std::vector< uint8_t > const &s)
Definition: Region.h:137

◆ _encode()

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

Definition at line 85 of file CompoundRegion.cc.

85 {
87 buffer.push_back(tc);
88 auto buffer1 = getOperand(0).encode();
89 encodeU64(buffer1.size(), buffer);
90 buffer.insert(buffer.end(), buffer1.begin(), buffer1.end());
91 auto buffer2 = getOperand(1).encode();
92 encodeU64(buffer2.size(), buffer);
93 buffer.insert(buffer.end(), buffer2.begin(), buffer2.end());
94 return buffer;
95}
Region const & getOperand(std::size_t n) const
virtual std::vector< uint8_t > encode() const =0
encode serializes this region into an opaque byte string.
T end(T... args)
T insert(T... args)
void encodeU64(std::uint64_t item, std::vector< uint8_t > &buffer)
encodeU64 appends an uint64 in little-endian byte order to the end of buffer.
Definition: codec.h:85
T push_back(T... args)

◆ 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 108 of file CompoundRegion.h.

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

◆ CompoundRegion() [1/4]

lsst::sphgeom::CompoundRegion::CompoundRegion ( CompoundRegion &&  )
defaultnoexcept

◆ CompoundRegion() [2/4]

lsst::sphgeom::CompoundRegion::CompoundRegion ( CompoundRegion const &  other)

Definition at line 55 of file CompoundRegion.cc.

78 : _operands{other.getOperand(0).clone(), other.getOperand(1).clone()} {}

◆ CompoundRegion() [3/4]

lsst::sphgeom::CompoundRegion::CompoundRegion ( Region const &  first,
Region const &  second 
)

Construct by copying or taking ownership of operands.

Definition at line 51 of file CompoundRegion.cc.

71 : _operands{first.clone(), second.clone()} {}

◆ CompoundRegion() [4/4]

lsst::sphgeom::CompoundRegion::CompoundRegion ( std::array< std::unique_ptr< Region >, 2 >  operands)
explicitnoexcept

Definition at line 52 of file CompoundRegion.cc.

75 : _operands(std::move(operands)) {}
T move(T... args)

◆ 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 104 of file Region.cc.

44 {
45 return contains(UnitVector3d(LonLat::fromRadians(lon, lat)));
46}
static LonLat fromRadians(double lon, double lat)
Definition: LonLat.h:55
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 100 of file Region.cc.

40 {
41 return contains(UnitVector3d(x, y, z));
42}
double x
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 146 of file CompoundRegion.cc.

146 {
147 return getOperand(0).contains(v) || getOperand(1).contains(v);
148}
virtual bool contains(UnitVector3d const &) const =0
contains tests whether the given unit vector is inside this region.

◆ decode() [1/2]

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

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

Definition at line 120 of file CompoundRegion.h.

120 {
121 return decode(s.data(), s.size());
122 }
static std::unique_ptr< UnionRegion > decode(std::vector< uint8_t > const &s)
T data(T... args)
T size(T... args)

◆ decode() [2/2]

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

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

Definition at line 123 of file CompoundRegion.h.

123 {
124 return std::make_unique<UnionRegion>(_decode(TYPE_CODE, buffer, n));
125 }
static std::array< std::unique_ptr< Region >, 2 > _decode(std::uint8_t tc, std::uint8_t const *buffer, std::size_t nBytes)
static constexpr uint8_t TYPE_CODE

◆ encode()

std::vector< 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 115 of file CompoundRegion.h.

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

◆ getBoundingBox()

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

getBoundingBox returns a bounding-box for this region.

Implements lsst::sphgeom::Region.

Definition at line 134 of file CompoundRegion.cc.

134 {
135 return getUnionBounds(*this, [](Region const &r) { return r.getBoundingBox(); });
136}

◆ 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 138 of file CompoundRegion.cc.

138 {
139 return getUnionBounds(*this, [](Region const &r) { return r.getBoundingBox3d(); });
140}

◆ getBoundingCircle()

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

getBoundingCircle returns a bounding-circle for this region.

Implements lsst::sphgeom::Region.

Definition at line 142 of file CompoundRegion.cc.

142 {
143 return getUnionBounds(*this, [](Region const &r) { return r.getBoundingCircle(); });
144}

◆ getOperand()

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

Definition at line 64 of file CompoundRegion.h.

64 {
65 return *_operands[n];
66 }

◆ 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 80 of file CompoundRegion.cc.

80{ return relate(static_cast<Region const &>(b)); }
table::Key< int > 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 81 of file CompoundRegion.cc.

81{ 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 82 of file CompoundRegion.cc.

82{ 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 83 of file CompoundRegion.cc.

83{ 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 150 of file CompoundRegion.cc.

150 {
151 auto r1 = getOperand(0).relate(rhs);
152 auto r2 = getOperand(1).relate(rhs);
153 return
154 // Both operands must be disjoint with the given region for the union
155 // to be disjoint with it.
156 ((r1 & DISJOINT) & (r2 & DISJOINT))
157 // Both operands must be within the given region for the union to be
158 // within it.
159 | ((r1 & WITHIN) & (r2 & WITHIN))
160 // If either operand contains the given region, the union contains it.
161 | ((r1 & CONTAINS) | (r2 & CONTAINS));
162}
virtual Relationship relate(Region const &) const =0

Member Data Documentation

◆ TYPE_CODE

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

Definition at line 103 of file CompoundRegion.h.


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