LSST Applications g0f08755f38+9c285cab97,g1635faa6d4+13f3999e92,g1653933729+a8ce1bb630,g1a0ca8cf93+bf6eb00ceb,g28da252d5a+0829b12dee,g29321ee8c0+5700dc9eac,g2bbee38e9b+9634bc57db,g2bc492864f+9634bc57db,g2cdde0e794+c2c89b37c4,g3156d2b45e+41e33cbcdc,g347aa1857d+9634bc57db,g35bb328faa+a8ce1bb630,g3a166c0a6a+9634bc57db,g3e281a1b8c+9f2c4e2fc3,g414038480c+077ccc18e7,g41af890bb2+fde0dd39b6,g5fbc88fb19+17cd334064,g781aacb6e4+a8ce1bb630,g80478fca09+55a9465950,g82479be7b0+d730eedb7d,g858d7b2824+9c285cab97,g9125e01d80+a8ce1bb630,g9726552aa6+10f999ec6a,ga5288a1d22+2a84bb7594,gacf8899fa4+c69c5206e8,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+9634bc57db,gcf0d15dbbd+4b7d09cae4,gda3e153d99+9c285cab97,gda6a2b7d83+4b7d09cae4,gdaeeff99f8+1711a396fd,ge2409df99d+5e831397f4,ge79ae78c31+9634bc57db,gf0baf85859+147a0692ba,gf3967379c6+41c94011de,gf3fb38a9a8+8f07a9901b,gfb92a5be7c+9c285cab97,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Static 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::CompoundRegion lsst::sphgeom::ConvexPolygon lsst::sphgeom::Ellipse lsst::sphgeom::IntersectionRegion lsst::sphgeom::UnionRegion

Public Member Functions

virtual ~Region ()=default
 
virtual std::unique_ptr< Regionclone () const =0
 clone returns a deep copy of this region.
 
virtual Box getBoundingBox () const =0
 getBoundingBox returns a bounding-box for this region.
 
virtual Box3d getBoundingBox3d () const =0
 getBoundingBox3d returns a 3-dimensional bounding-box for this region.
 
virtual Circle getBoundingCircle () const =0
 getBoundingCircle returns a bounding-circle for this region.
 
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.
 
virtual std::vector< std::uint8_tencode () const =0
 encode serializes this region into an opaque byte string.
 
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::vector< std::unique_ptr< Region > > getRegions (Region const &region)
 getRegions returns a vector of Region.
 
static std::unique_ptr< Regiondecode (std::vector< std::uint8_t > const &s)
 
static std::unique_ptr< Regiondecode (std::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 87 of file Region.h.

Constructor & Destructor Documentation

◆ ~Region()

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

Member Function Documentation

◆ clone()

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

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

51 {
52 return contains(UnitVector3d(LonLat::fromRadians(lon, lat)));
53}
static LonLat fromRadians(double lon, double lat)
Definition LonLat.h:62
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 47 of file Region.cc.

47 {
48 return contains(UnitVector3d(x, y, z));
49}
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

◆ decode() [1/2]

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

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

Definition at line 55 of file Region.cc.

55 {
56 if (buffer == nullptr || n == 0) {
57 throw std::runtime_error("Byte-string is not an encoded Region");
58 }
59 std::uint8_t type = *buffer;
60 if (type == Box::TYPE_CODE) {
61 return Box::decode(buffer, n);
62 } else if (type == Circle::TYPE_CODE) {
63 return Circle::decode(buffer, n);
64 } else if (type == ConvexPolygon::TYPE_CODE) {
65 return ConvexPolygon::decode(buffer, n);
66 } else if (type == Ellipse::TYPE_CODE) {
67 return Ellipse::decode(buffer, n);
68 } else if (type == UnionRegion::TYPE_CODE) {
69 return UnionRegion::decode(buffer, n);
70 } else if (type == IntersectionRegion::TYPE_CODE) {
71 return IntersectionRegion::decode(buffer, n);
72 }
73 throw std::runtime_error("Byte-string is not an encoded Region");
74}
static std::unique_ptr< Box > decode(std::vector< std::uint8_t > const &s)
Definition Box.h:348
static constexpr std::uint8_t TYPE_CODE
Definition Box.h:64
static constexpr std::uint8_t TYPE_CODE
Definition Circle.h:56
static std::unique_ptr< Circle > decode(std::vector< std::uint8_t > const &s)
Definition Circle.h:259
static constexpr std::uint8_t TYPE_CODE
static std::unique_ptr< ConvexPolygon > decode(std::vector< std::uint8_t > const &s)
static constexpr std::uint8_t TYPE_CODE
Definition Ellipse.h:179
static std::unique_ptr< Ellipse > decode(std::vector< std::uint8_t > const &s)
Definition Ellipse.h:310
static std::unique_ptr< IntersectionRegion > decode(std::vector< std::uint8_t > const &s)
static constexpr std::uint8_t TYPE_CODE
static constexpr std::uint8_t TYPE_CODE
static std::unique_ptr< UnionRegion > decode(std::vector< std::uint8_t > const &s)

◆ decode() [2/2]

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

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

Definition at line 145 of file Region.h.

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

◆ encode()

virtual std::vector< std::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::Box, lsst::sphgeom::Circle, lsst::sphgeom::UnionRegion, lsst::sphgeom::IntersectionRegion, lsst::sphgeom::ConvexPolygon, and lsst::sphgeom::Ellipse.

◆ getBoundingBox()

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

◆ getBoundingBox3d()

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

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

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

◆ getBoundingCircle()

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

◆ getRegions()

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

getRegions returns a vector of Region.

Definition at line 76 of file Region.cc.

76 {
78 if (auto union_region = dynamic_cast<UnionRegion const *>(&region)) {
79 for(int i = 0; i < 2; ++i) {
80 result.emplace_back(union_region->getOperand(i).clone());
81 }
82 } else if(auto intersection_region = dynamic_cast<IntersectionRegion const *>(&region)) {
83 for(int i = 0; i < 2; ++i) {
84 intersection_region->getOperand(i);
85 result.emplace_back(intersection_region->getOperand(i).clone());
86 }
87 } else {
88 result.emplace_back(region.clone());
89 }
90 return result;
91}
py::object result
Definition _schema.cc:429
T emplace_back(T... args)

◆ 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::Circle, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Ellipse, lsst::sphgeom::Box, and lsst::sphgeom::CompoundRegion.

◆ 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::Box, lsst::sphgeom::Circle, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Ellipse, and lsst::sphgeom::CompoundRegion.

◆ 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::Box, lsst::sphgeom::Circle, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Ellipse, and lsst::sphgeom::CompoundRegion.

◆ 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::Box, lsst::sphgeom::Circle, lsst::sphgeom::ConvexPolygon, lsst::sphgeom::Ellipse, and lsst::sphgeom::CompoundRegion.

◆ 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::CompoundRegion, lsst::sphgeom::Box, lsst::sphgeom::Circle, lsst::sphgeom::UnionRegion, lsst::sphgeom::IntersectionRegion, lsst::sphgeom::ConvexPolygon, and lsst::sphgeom::Ellipse.


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