44 if (r <=
Angle(0.0)) {
111 _enforceInvariants();
261 double phi1, phi2, phi3;
262 double c =
cos(0.5 * w);
274 if (phi1 <= phi3 && phi3 <= phi2) {
279 if (p1.
dot(boxVerts[0]) > p2.dot(boxVerts[1])) {
288 double cl2 = (p - boxVerts[0]).getSquaredNorm();
289 for (
int i = 1; i < 4; ++i) {
290 cl2 =
std::max(cl2, (p - boxVerts[i]).getSquaredNorm());
311 if (!_lon.
isFull() && 0.5 * w < r) {
321 return CONTAINS | DISJOINT | WITHIN;
323 return DISJOINT | WITHIN;
325 return CONTAINS | DISJOINT;
329 return CONTAINS | WITHIN;
348 for (
int i = 0; i < 4; ++i) {
350 double d = (verts[i] - c.
getCenter()).getSquaredNorm();
359 }
else if (inside != b) {
371 for (
int i = 0; i < 2; ++i) {
373 c.
getCenter(), verts[2 * i + 1], verts[2 * i], norms[i]);
409 for (
int i = 0; i < 2; ++i) {
411 c.
getCenter(), verts[2 * i + 1], verts[2 * i], norms[i]);
460 if (buffer ==
nullptr || n != ENCODED_SIZE || *buffer !=
TYPE_CODE) {
471 box->_enforceInvariants();
476 return os <<
"{\"Box\": [" << b.
getLon() <<
", " << b.
getLat() <<
"]}";
This file declares a class for representing circular regions on the unit sphere.
static constexpr uint8_t TYPE_CODE
Angle abs(Angle const &a)
static UnitVector3d orthogonalTo(Vector3d const &v)
orthogonalTo returns an arbitrary unit vector that is orthogonal to v.
This file declares a class for representing longitude/latitude angle boxes on the unit sphere...
Scalar getA() const
getA returns the lower endpoint of this interval.
NormalizedAngle is an angle that lies in the range [0, 2π), with one exception - a NormalizedAngle ca...
This file declares miscellaneous utility functions.
bool isNan() const
isNan returns true if the angle value is NaN.
double asRadians() const
asRadians returns the value of this angle in units of radians.
NormalizedAngle getB() const
getB returns the second endpoint of this interval.
NormalizedAngle getWidth() const
getWidth returns the width in longitude angle of this box.
double getSquaredChordLength() const
getSquaredChordLength returns the squared length of chords between the circle center and points on th...
AngleInterval represents closed intervals of arbitrary angles.
constexpr double MAX_SQUARED_CHORD_LENGTH_ERROR
std::vector< uint8_t > encode() const override
encode serializes this region into an opaque byte string.
static Box3d aroundUnitSphere()
aroundUnitSphere returns a minimal Box3d containing the unit sphere.
static NormalizedAngleInterval fromRadians(double a, double b)
Interval1d represents closed intervals of ℝ.
This file contains simple helper functions for encoding and decoding primitive types to/from byte str...
static AngleInterval fromRadians(double x, double y)
std::ostream & operator<<(std::ostream &, Angle const &)
This file declares a class for representing axis-aligned bounding boxes in ℝ³.
static double squaredChordLengthFor(Angle openingAngle)
squaredChordLengthFor computes and returns the squared chord length between points in S² that are sep...
constexpr double MAX_ASIN_ERROR
bool contains(NormalizedAngle x) const
Relationship invert(Relationship r)
Given the relationship between two sets A and B (i.e.
Scalar getCenter() const
getCenter returns the center of this interval.
double sin(Angle const &a)
bool isFull() const
isFull returns true if this interval contains all normalized angles.
Angle getMinAngleToCircle(Angle x, Angle c)
getMinAngleToCircle returns the minimum angular separation between a point at latitude x and the poin...
Box represents a rectangle in spherical coordinate space that contains its boundary.
Box & dilateBy(Angle r)
dilateBy minimally expands this Box to include all points within angular separation r of its boundary...
double cos(Angle const &a)
Relationship relate(LonLat const &p) const
double getMinSquaredChordLength(Vector3d const &v, Vector3d const &a, Vector3d const &b, Vector3d const &n)
Let p be the unit vector closest to v that lies on the plane with normal n in the direction of the cr...
Ellipse is an elliptical region on the sphere.
Relationship relate(Region const &r) const override
A base class for image defects.
double asRadians() const
asRadians returns the value of this angle in units of radians.
bool isEmpty() const
isEmpty returns true if this box does not contain any points.
NormalizedAngleInterval const & getLon() const
getLon returns the longitude interval of this box.
double tan(Angle const &a)
double getMaxSquaredChordLength(Vector3d const &v, Vector3d const &a, Vector3d const &b, Vector3d const &n)
Let p be the unit vector furthest from v that lies on the plane with normal n in the direction of the...
Box3d getBoundingBox3d() const override
getBoundingBox3d returns a 3-dimensional bounding-box for this region.
bool contains(LonLat const &x) const
Circle is a circular region on the unit sphere that contains its boundary.
ConvexPolygon is a closed convex polygon on the unit sphere.
double decodeDouble(uint8_t const *buffer)
decode extracts an IEEE double from the 8 byte little-endian byte sequence in buffer.
Relationship relate(Region const &r) const override
Scalar getB() const
getB returns the upper endpoint of this interval.
Angle represents an angle in radians.
AngleInterval const & getLat() const
getLat returns the latitude interval of this box.
NormalizedAngle getA() const
getA returns the first endpoint of this interval.
UnitVector3d const & getCenter() const
getCenter returns the center of this circle as a unit vector.
LonLat represents a spherical coordinate (longitude/latitude angle) pair.
Box3d represents a box in ℝ³.
static NormalizedAngle halfWidthForCircle(Angle r, Angle lat)
halfWidthForCircle computes the half-width of bounding boxes for circles with radius r and centers at...
This file declares a class for representing elliptical regions on the unit sphere.
bool contains(Scalar x) const
UnitVector3d is a unit vector in ℝ³ with components stored in double precision.
void encodeDouble(double item, std::vector< uint8_t > &buffer)
encode appends an IEEE double in little-endian byte order to the end of buffer.
double getArea() const
getArea returns the area of this box in steradians.
NormalizedAngle getCenter() const
getCenter returns the center of this interval.
bool isFull() const
isFull returns true if this box contains all points on the unit sphere.
double dot(Vector3d const &v) const
dot returns the inner product of this unit vector and v.
Circle getBoundingCircle() const override
getBoundingCircle returns a bounding-circle for this region.
This file declares a class for representing convex polygons with great circle edges on the unit spher...
NormalizedAngle getSize() const
getSize returns the size (length, width) of this interval.
NormalizedAngleInterval & dilateBy(Angle x)
static std::unique_ptr< Box > decode(std::vector< uint8_t > const &s)