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 | Static Protected Member Functions | List of all members
lsst::sphgeom::ConvexPolygon Class Reference

ConvexPolygon is a closed convex polygon on the unit sphere. More...

#include <ConvexPolygon.h>

Inheritance diagram for lsst::sphgeom::ConvexPolygon:
lsst::sphgeom::Region

Public Member Functions

 ConvexPolygon (std::vector< UnitVector3d > const &points)
 This constructor creates a convex polygon that is the convex hull of the given set of points.
 
 ConvexPolygon (UnitVector3d const &v0, UnitVector3d const &v1, UnitVector3d const &v2)
 This constructor creates a triangle with the given vertices.
 
 ConvexPolygon (UnitVector3d const &v0, UnitVector3d const &v1, UnitVector3d const &v2, UnitVector3d const &v3)
 This constructor creates a quadrilateral with the given vertices.
 
bool operator== (ConvexPolygon const &p) const
 Two convex polygons are equal iff they contain the same points.
 
bool operator!= (ConvexPolygon const &p) const
 
std::vector< UnitVector3d > const & getVertices () const
 
UnitVector3d getCentroid () const
 The centroid of a polygon is its center of mass projected onto S², assuming a uniform mass distribution over the polygon surface.
 
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.
 
Relationship relate (Region const &r) const override
 
Relationship relate (Box const &) const override
 
Relationship relate (Circle const &) const override
 
Relationship relate (ConvexPolygon const &) const override
 
Relationship relate (Ellipse const &) 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.
 
bool contains (UnitVector3d const &v) const override
 
bool contains (Region const &r) const
 
bool isDisjointFrom (Region const &r) const
 
bool intersects (Region const &r) const
 
bool isWithin (Region const &r) const
 

Static Public Member Functions

static ConvexPolygon convexHull (std::vector< UnitVector3d > const &points)
 convexHull returns the convex hull of the given set of points if it exists and throws an exception otherwise.
 
static std::vector< std::unique_ptr< Region > > getRegions (Region const &region)
 getRegions returns a vector of Region.
 
static std::unique_ptr< ConvexPolygondecode (std::vector< std::uint8_t > const &s)
 
static std::unique_ptr< ConvexPolygondecode (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 = 'p'
 

Static Protected Member Functions

static TriState _relationship_to_overlaps (Relationship r)
 

Detailed Description

ConvexPolygon is a closed convex polygon on the unit sphere.

Its edges are great circles (geodesics), and the shorter of the two great circle segments between any two points on the polygon boundary is contained in the polygon.

The vertices of a convex polygon are distinct and have counter-clockwise orientation when viewed from outside the unit sphere. No three consecutive vertices are coplanar and edges do not intersect except at vertices.

Furthermore, if a convex polygon contains a point p of S², then we require that it be disjoint from point -p. This guarantees the existence of a unique shortest great circle segment between any 2 points contained in the polygon, but means e.g. that hemispheres and lunes cannot be represented by convex polygons.

Currently, the only way to construct a convex polygon is to compute the convex hull of a point set.

Definition at line 65 of file ConvexPolygon.h.

Constructor & Destructor Documentation

◆ ConvexPolygon() [1/3]

lsst::sphgeom::ConvexPolygon::ConvexPolygon ( std::vector< UnitVector3d > const & points)
explicit

This constructor creates a convex polygon that is the convex hull of the given set of points.

Definition at line 262 of file ConvexPolygon.cc.

262 :
263 _vertices(points)
264{
265 computeHull(_vertices);
266}

◆ ConvexPolygon() [2/3]

lsst::sphgeom::ConvexPolygon::ConvexPolygon ( UnitVector3d const & v0,
UnitVector3d const & v1,
UnitVector3d const & v2 )
inline

This constructor creates a triangle with the given vertices.

It is assumed that orientation(v0, v1, v2) = 1. Use with caution - for performance reasons, this is not verified!

Definition at line 85 of file ConvexPolygon.h.

87 :
88 _vertices{v0, v1, v2}
89 {}

◆ ConvexPolygon() [3/3]

lsst::sphgeom::ConvexPolygon::ConvexPolygon ( UnitVector3d const & v0,
UnitVector3d const & v1,
UnitVector3d const & v2,
UnitVector3d const & v3 )
inline

This constructor creates a quadrilateral with the given vertices.

It is assumed that orientation(v0, v1, v2), orientation(v1, v2, v3), orientation(v2, v3, v0), and orientation (v3, v0, v1) are all 1. Use with caution - for performance reasons, this is not verified!

Definition at line 96 of file ConvexPolygon.h.

99 :
100 _vertices{v0, v1, v2, v3}
101 {}

Member Function Documentation

◆ _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::ConvexPolygon::clone ( ) const
inlineoverridevirtual

clone returns a deep copy of this region.

Implements lsst::sphgeom::Region.

Definition at line 116 of file ConvexPolygon.h.

116 {
117 return std::unique_ptr<ConvexPolygon>(new ConvexPolygon(*this));
118 }

◆ contains() [1/5]

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}
bool contains(UnitVector3d const &v) const override
static LonLat fromRadians(double lon, double lat)
Definition LonLat.h:62

◆ contains() [2/5]

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/5]

bool lsst::sphgeom::ConvexPolygon::contains ( Region const & r) const

contains returns true if the intersection of this convex polygon and x is equal to x.

Definition at line 328 of file ConvexPolygon.cc.

328 {
329 return (relate(r) & CONTAINS) != 0;
330}
Relationship relate(Region const &r) const override

◆ contains() [4/5]

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() [5/5]

bool lsst::sphgeom::ConvexPolygon::contains ( UnitVector3d const & v) const
overridevirtual

contains returns true if the intersection of this convex polygon and x is equal to x.

Implements lsst::sphgeom::Region.

Definition at line 324 of file ConvexPolygon.cc.

324 {
325 return detail::contains(_vertices.begin(), _vertices.end(), v);
326}
bool contains(VertexIterator const begin, VertexIterator const end, UnitVector3d const &v)

◆ convexHull()

static ConvexPolygon lsst::sphgeom::ConvexPolygon::convexHull ( std::vector< UnitVector3d > const & points)
inlinestatic

convexHull returns the convex hull of the given set of points if it exists and throws an exception otherwise.

Though points are supplied in a vector, they really are conceptually a set - the ConvexPolygon returned is invariant under permutation of the input array.

Definition at line 73 of file ConvexPolygon.h.

73 {
74 return ConvexPolygon(points);
75 }

◆ decode() [1/2]

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

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

Definition at line 393 of file ConvexPolygon.cc.

395{
396 if (buffer == nullptr || *buffer != TYPE_CODE ||
397 n < 1 + 24*3 || (n - 1) % 24 != 0) {
398 throw std::runtime_error("Byte-string is not an encoded ConvexPolygon");
399 }
400 std::unique_ptr<ConvexPolygon> poly(new ConvexPolygon);
401 ++buffer;
402 size_t nv = (n - 1) / 24;
403 poly->_vertices.reserve(nv);
404 for (size_t i = 0; i < nv; ++i, buffer += 24) {
405 poly->_vertices.push_back(UnitVector3d::fromNormalized(
406 decodeDouble(buffer),
407 decodeDouble(buffer + 8),
408 decodeDouble(buffer + 16)
409 ));
410 }
411 return poly;
412}
static constexpr std::uint8_t TYPE_CODE
static UnitVector3d fromNormalized(Vector3d const &v)
fromNormalized returns the unit vector equal to v, which is assumed to be normalized.
Low-level polynomials (including special polynomials) in C++.
double decodeDouble(std::uint8_t const *buffer)
decodeDouble extracts an IEEE double from the 8 byte little-endian byte sequence in buffer.
Definition codec.h:77

◆ decode() [2/2]

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

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

Definition at line 175 of file ConvexPolygon.h.

175 {
176 return decode(s.data(), s.size());
177 }
static std::unique_ptr< ConvexPolygon > 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
static std::unique_ptr< Region > decode(std::vector< std::uint8_t > const &s)
Definition Region.h:162
T find(T... args)
T move(T... args)
T push_back(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}
py::object result
Definition _schema.cc:429
int end
table::Key< int > b
T begin(T... args)

◆ encode()

std::vector< std::uint8_t > lsst::sphgeom::ConvexPolygon::encode ( ) const
overridevirtual

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 380 of file ConvexPolygon.cc.

380 {
383 buffer.reserve(1 + 24 * _vertices.size());
384 buffer.push_back(tc);
385 for (UnitVector3d const & v: _vertices) {
386 encodeDouble(v.x(), buffer);
387 encodeDouble(v.y(), buffer);
388 encodeDouble(v.z(), buffer);
389 }
390 return buffer;
391}
void encodeDouble(double item, std::vector< std::uint8_t > &buffer)
encodeDouble appends an IEEE double in little-endian byte order to the end of buffer.
Definition codec.h:57
T reserve(T... args)

◆ getBoundingBox()

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

getBoundingBox returns a bounding-box for this region.

Implements lsst::sphgeom::Region.

Definition at line 316 of file ConvexPolygon.cc.

316 {
317 return detail::boundingBox(_vertices.begin(), _vertices.end());
318}
Box boundingBox(VertexIterator const begin, VertexIterator const end)

◆ getBoundingBox3d()

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

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

Implements lsst::sphgeom::Region.

Definition at line 320 of file ConvexPolygon.cc.

320 {
321 return detail::boundingBox3d(_vertices.begin(), _vertices.end());
322}
Box3d boundingBox3d(VertexIterator const begin, VertexIterator const end)

◆ getBoundingCircle()

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

getBoundingCircle returns a bounding-circle for this region.

Implements lsst::sphgeom::Region.

Definition at line 312 of file ConvexPolygon.cc.

312 {
313 return detail::boundingCircle(_vertices.begin(), _vertices.end());
314}
Circle boundingCircle(VertexIterator const begin, VertexIterator const end)

◆ getCentroid()

UnitVector3d lsst::sphgeom::ConvexPolygon::getCentroid ( ) const

The centroid of a polygon is its center of mass projected onto S², assuming a uniform mass distribution over the polygon surface.

Definition at line 308 of file ConvexPolygon.cc.

308 {
309 return detail::centroid(_vertices.begin(), _vertices.end());
310}
UnitVector3d centroid(VertexIterator const begin, VertexIterator const end)

◆ 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)

◆ getVertices()

std::vector< UnitVector3d > const & lsst::sphgeom::ConvexPolygon::getVertices ( ) const
inline

Definition at line 107 of file ConvexPolygon.h.

107 {
108 return _vertices;
109 }

◆ intersects()

bool lsst::sphgeom::ConvexPolygon::intersects ( Region const & r) const

intersects returns true if the intersection of this convex polygon and x is non-empty.

Definition at line 336 of file ConvexPolygon.cc.

336 {
337 return !isDisjointFrom(r);
338}
bool isDisjointFrom(Region const &r) const

◆ isDisjointFrom()

bool lsst::sphgeom::ConvexPolygon::isDisjointFrom ( Region const & r) const

isDisjointFrom returns true if the intersection of this convex polygon and x is empty.

Definition at line 332 of file ConvexPolygon.cc.

332 {
333 return (relate(r) & DISJOINT) != 0;
334}

◆ isEmpty()

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

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

Implements lsst::sphgeom::Region.

Definition at line 303 of file ConvexPolygon.cc.

303 {
304 // Polygons should not be empty by construction.
305 return true;
306}

◆ isWithin()

bool lsst::sphgeom::ConvexPolygon::isWithin ( Region const & r) const

isWithin returns true if the intersection of this convex polygon and x is this convex polygon.

Definition at line 340 of file ConvexPolygon.cc.

340 {
341 return (relate(r) & WITHIN) != 0;
342}

◆ operator!=()

bool lsst::sphgeom::ConvexPolygon::operator!= ( ConvexPolygon const & p) const
inline

Definition at line 105 of file ConvexPolygon.h.

105{ return !(*this == p); }

◆ operator==()

bool lsst::sphgeom::ConvexPolygon::operator== ( ConvexPolygon const & p) const

Two convex polygons are equal iff they contain the same points.

Definition at line 268 of file ConvexPolygon.cc.

268 {
269 if (this == &p) {
270 return true;
271 }
272 if (_vertices.size() != p._vertices.size()) {
273 return false;
274 }
275 VertexIterator i = _vertices.begin();
276 VertexIterator f = p._vertices.begin();
277 VertexIterator const ep = p._vertices.end();
278 // Find vertex f of p equal to the first vertex of this polygon.
279 for (; f != ep; ++f) {
280 if (*i == *f) {
281 break;
282 }
283 }
284 if (f == ep) {
285 // No vertex of p is equal to the first vertex of this polygon.
286 return false;
287 }
288 // Now, compare all vertices.
289 ++i;
290 for (VertexIterator j = f + 1; j != ep; ++i, ++j) {
291 if (*i != *j) {
292 return false;
293 }
294 }
295 for (VertexIterator j = p._vertices.begin(); j != f; ++i, ++j) {
296 if (*i != *j) {
297 return false;
298 }
299 }
300 return true;
301}

◆ overlaps() [1/5]

TriState lsst::sphgeom::ConvexPolygon::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 360 of file ConvexPolygon.cc.

360 {
361 // Relation with box uses approximations, we cannot know exact answer.
363}
static TriState _relationship_to_overlaps(Relationship r)
Definition Region.h:206

◆ overlaps() [2/5]

TriState lsst::sphgeom::ConvexPolygon::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 365 of file ConvexPolygon.cc.

365 {
366 // Circle relation is exact, not-disjoint means they overlap.
367 return TriState((relate(c) & DISJOINT) == 0);
368}

◆ overlaps() [3/5]

TriState lsst::sphgeom::ConvexPolygon::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 370 of file ConvexPolygon.cc.

370 {
371 // Polygon relation is exact, not-disjoint means they overlap.
372 return TriState((relate(p) & DISJOINT) == 0);
373}

◆ overlaps() [4/5]

TriState lsst::sphgeom::ConvexPolygon::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 375 of file ConvexPolygon.cc.

375 {
376 // Relation with ellipse uses approximations, we cannot know exact answer.
378}

◆ overlaps() [5/5]

TriState lsst::sphgeom::ConvexPolygon::overlaps ( Region const & other) const
inlineoverridevirtual

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 163 of file ConvexPolygon.h.

163 {
164 return other.overlaps(*this);
165 }

◆ relate() [1/5]

Relationship lsst::sphgeom::ConvexPolygon::relate ( Box 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::Region.

Definition at line 344 of file ConvexPolygon.cc.

344 {
345 return detail::relate(_vertices.begin(), _vertices.end(), b);
346}
Relationship relate(VertexIterator const begin, VertexIterator const end, Box const &b)

◆ relate() [2/5]

Relationship lsst::sphgeom::ConvexPolygon::relate ( Circle 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::Region.

Definition at line 348 of file ConvexPolygon.cc.

348 {
349 return detail::relate(_vertices.begin(), _vertices.end(), c);
350}

◆ relate() [3/5]

Relationship lsst::sphgeom::ConvexPolygon::relate ( ConvexPolygon 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::Region.

Definition at line 352 of file ConvexPolygon.cc.

352 {
353 return detail::relate(_vertices.begin(), _vertices.end(), p);
354}

◆ relate() [4/5]

Relationship lsst::sphgeom::ConvexPolygon::relate ( Ellipse 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::Region.

Definition at line 356 of file ConvexPolygon.cc.

356 {
357 return detail::relate(_vertices.begin(), _vertices.end(), e);
358}

◆ relate() [5/5]

Relationship lsst::sphgeom::ConvexPolygon::relate ( Region const & ) const
inlineoverridevirtual

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 153 of file ConvexPolygon.h.

153 {
154 // Dispatch on the type of r.
155 return invert(r.relate(*this));
156 }
Relationship invert(Relationship r)
Given the relationship between two sets A and B (i.e.

Member Data Documentation

◆ TYPE_CODE

constexpr std::uint8_t lsst::sphgeom::ConvexPolygon::TYPE_CODE = 'p'
staticconstexpr

Definition at line 67 of file ConvexPolygon.h.


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