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
Public Member Functions | List of all members
lsst::sphgeom::Region Class Referenceabstract

Region is a minimal interface for 2-dimensional regions on the unit sphere. More...

#include <Region.h>

Inheritance diagram for lsst::sphgeom::Region:
lsst::sphgeom::Box lsst::sphgeom::Circle lsst::sphgeom::ConvexPolygon lsst::sphgeom::Ellipse

Public Member Functions

virtual ~Region ()
 
virtual std::unique_ptr< Regionclone () const =0
 clone returns a deep copy of this region. More...
 
virtual Box getBoundingBox () const =0
 getBoundingBox returns a bounding-box for this region. More...
 
virtual Box3d getBoundingBox3d () const =0
 getBoundingBox3d returns a 3-dimensional bounding-box for this region. More...
 
virtual Circle getBoundingCircle () const =0
 getBoundingCircle returns a bounding-circle for this region. More...
 
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...
 
virtual std::vector< uint8_t > encode () const =0
 encode serializes this region into an opaque byte string. More...
 
virtual Relationship relate (Region const &) const =0
 
virtual Relationship relate (Box const &) const =0
 
virtual Relationship relate (Circle const &) const =0
 
virtual Relationship relate (ConvexPolygon const &) const =0
 
virtual Relationship relate (Ellipse const &) const =0
 

Static Public Member Functions

static std::unique_ptr< Regiondecode (std::vector< uint8_t > const &s)
 
static std::unique_ptr< Regiondecode (uint8_t const *buffer, size_t n)
 

Detailed Description

Region is a minimal interface for 2-dimensional regions on the unit sphere.

It provides three core pieces of functionality:

Given a pixelization of the unit sphere with pixels that can be bounded by Regions, this provides all the necessary functionality for determining which pixels may intersect a Region.

When implementing a new concrete region subclass R, the Region interface should be extended with:

virtual Relationship relate(R const &) const = 0;

All other Region subclasses must then implement this method. In addition, R is expected to contain the following implementation of the generic relate method:

virtual Relationship relate(Region const & r) const {
    return invert(r.relate(*this));
}

where invert is defined in Relationship.h.

Given two Region references r1 and r2 of type R1 and R2, the net effect is that r1.relate(r2) will end up calling R2::relate(R1 const &). In other words, the call is polymorphic in the types of both r1 and r2.

One negative consequence of this design is that one cannot implement new Region types outside of this library.

Definition at line 79 of file Region.h.

Constructor & Destructor Documentation

◆ ~Region()

virtual lsst::sphgeom::Region::~Region ( )
inlinevirtual

Definition at line 81 of file Region.h.

81 {}

Member Function Documentation

◆ clone()

virtual std::unique_ptr<Region> lsst::sphgeom::Region::clone ( ) const
pure virtual

clone returns a deep copy of this region.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ contains() [1/3]

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

43  {
44  return contains(UnitVector3d(LonLat::fromRadians(lon, lat)));
45 }
static LonLat fromRadians(double lon, double lat)
Definition: LonLat.h:55
virtual bool contains(UnitVector3d const &) const =0
contains tests whether the given unit vector is inside this region.

◆ contains() [2/3]

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

39  {
40  return contains(UnitVector3d(x, y, z));
41 }
double x
double z
Definition: Match.cc:44
int y
Definition: SpanSet.cc:48

◆ contains() [3/3]

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

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

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ decode() [1/2]

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

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

Definition at line 137 of file Region.h.

137  {
138  return decode(s.data(), s.size());
139  }
static std::unique_ptr< Region > decode(std::vector< uint8_t > const &s)
Definition: Region.h:137
T data(T... args)
T size(T... args)

◆ decode() [2/2]

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

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

Definition at line 47 of file Region.cc.

47  {
48  if (buffer == nullptr || n == 0) {
49  throw std::runtime_error("Byte-string is not an encoded Region");
50  }
51  uint8_t type = *buffer;
52  if (type == Box::TYPE_CODE) {
53  return Box::decode(buffer, n);
54  } else if (type == Circle::TYPE_CODE) {
55  return Circle::decode(buffer, n);
56  } else if (type == ConvexPolygon::TYPE_CODE) {
57  return ConvexPolygon::decode(buffer, n);
58  } else if (type == Ellipse::TYPE_CODE) {
59  return Ellipse::decode(buffer, n);
60  }
61  throw std::runtime_error("Byte-string is not an encoded Region");
62 }
table::Key< int > type
Definition: Detector.cc:163
static std::unique_ptr< Box > decode(std::vector< uint8_t > const &s)
Definition: Box.h:340
static constexpr uint8_t TYPE_CODE
Definition: Box.h:56
static std::unique_ptr< Circle > decode(std::vector< uint8_t > const &s)
Definition: Circle.h:251
static constexpr uint8_t TYPE_CODE
Definition: Circle.h:48
static std::unique_ptr< ConvexPolygon > decode(std::vector< uint8_t > const &s)
static constexpr uint8_t TYPE_CODE
Definition: ConvexPolygon.h:59
static constexpr uint8_t TYPE_CODE
Definition: Ellipse.h:172
static std::unique_ptr< Ellipse > decode(std::vector< uint8_t > const &s)
Definition: Ellipse.h:303

◆ encode()

virtual std::vector<uint8_t> lsst::sphgeom::Region::encode ( ) const
pure virtual

encode serializes this region into an opaque byte string.

Byte strings emitted by encode can be deserialized with decode.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ getBoundingBox()

virtual Box lsst::sphgeom::Region::getBoundingBox ( ) const
pure virtual

getBoundingBox returns a bounding-box for this region.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ getBoundingBox3d()

virtual Box3d lsst::sphgeom::Region::getBoundingBox3d ( ) const
pure virtual

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

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ getBoundingCircle()

virtual Circle lsst::sphgeom::Region::getBoundingCircle ( ) const
pure virtual

getBoundingCircle returns a bounding-circle for this region.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ relate() [1/5]

virtual Relationship lsst::sphgeom::Region::relate ( Box const &  ) const
pure virtual

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.

Implemented in lsst::sphgeom::Box, lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, and lsst::sphgeom::Circle.

◆ relate() [2/5]

virtual Relationship lsst::sphgeom::Region::relate ( Circle const &  ) const
pure virtual

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.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ relate() [3/5]

virtual Relationship lsst::sphgeom::Region::relate ( ConvexPolygon const &  ) const
pure virtual

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.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ relate() [4/5]

virtual Relationship lsst::sphgeom::Region::relate ( Ellipse const &  ) const
pure virtual

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.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.

◆ relate() [5/5]

virtual Relationship lsst::sphgeom::Region::relate ( Region const &  ) const
pure virtual

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.

Implemented in lsst::sphgeom::Ellipse, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Circle, and lsst::sphgeom::Box.


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