48 double s =
sin(0.5 * a);
55 if (squaredChordLength < 0.0) {
58 if (squaredChordLength >= 4.0) {
72 return _openingAngle >
84 return cc > _openingAngle + x._openingAngle +
102 Angle b = x._openingAngle;
132 Angle o = 0.5 * (cx + _openingAngle);
133 Angle r = 0.5 * (cx - _openingAngle);
163 Angle o = 0.5 * (cc + _openingAngle + x._openingAngle);
174 Angle r = o - _openingAngle;
187 Angle o = _openingAngle + r;
197 _squaredChordLength = 4.0;
201 _squaredChordLength = -1.0;
202 _openingAngle =
Angle(-1.0);
205 _squaredChordLength = 4.0 - _squaredChordLength;
206 _openingAngle =
Angle(
PI) - _openingAngle;
220 static double const MAX_BOUNDARY_ERROR = 6.2e-16;
245 double s =
sin(_openingAngle);
246 double c =
cos(_openingAngle);
247 for (
int i = 0; i < 3; ++i) {
248 double ci = _center(i);
250 double bmin = 1.0, bmax = -1.0;
251 if (2.0 - 2.0 * ci <= _squaredChordLength) {
254 if (2.0 + 2.0 * ci <= _squaredChordLength) {
257 double b0 = ci * c + di *
s;
258 bmax =
std::max(bmax, b0 + MAX_BOUNDARY_ERROR);
259 bmin =
std::min(bmin, b0 - MAX_BOUNDARY_ERROR);
260 double b1 = ci * c - di *
s;
261 bmax =
std::max(bmax, b1 + MAX_BOUNDARY_ERROR);
262 bmin =
std::min(bmin, b1 - MAX_BOUNDARY_ERROR);
265 return Box3d(e[0], e[1], e[2]);
272 return DISJOINT | WITHIN;
285 return CONTAINS | DISJOINT | WITHIN;
287 return DISJOINT | WITHIN;
289 return CONTAINS | DISJOINT;
294 return CONTAINS | WITHIN;
338 if (buffer ==
nullptr || n != ENCODED_SIZE || *buffer !=
TYPE_CODE) {
346 double squaredChordLength =
decodeDouble(buffer); buffer += 8;
347 double openingAngle =
decodeDouble(buffer); buffer += 8;
349 circle->_squaredChordLength = squaredChordLength;
350 circle->_openingAngle =
Angle(openingAngle);
357 return os <<
"{\"Circle\": [" << c.
getCenter() << tail;
This file declares a class for representing circular regions on the unit sphere.
Circle & expandTo(UnitVector3d const &x)
Box3d getBoundingBox3d() const override
getBoundingBox3d returns a 3-dimensional bounding-box for this region.
static UnitVector3d orthogonalTo(Vector3d const &v)
orthogonalTo returns an arbitrary unit vector that is orthogonal to v.
NormalizedAngle is an angle that lies in the range [0, 2π), with one exception - a NormalizedAngle ca...
This file declares a class for representing elliptical regions on the unit sphere.
double getSquaredChordLength() const
getSquaredChordLength returns the squared length of chords between the circle center and points on th...
static Box3d aroundUnitSphere()
aroundUnitSphere returns a minimal Box3d containing the unit sphere.
bool contains(Circle const &x) const
contains returns true if the intersection of this circle and x is equal to x.
Interval1d represents closed intervals of ℝ.
Circle & clipTo(UnitVector3d const &x)
This file contains simple helper functions for encoding and decoding primitive types to/from byte str...
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
Relationship invert(Relationship r)
Given the relationship between two sets A and B (i.e.
double sin(Angle const &a)
Box represents a rectangle in spherical coordinate space that contains its boundary.
double cos(Angle const &a)
Relationship relate(LonLat const &p) const
Ellipse is an elliptical region on the sphere.
Vector3d cross(Vector3d const &v) const
cross returns the cross product of this unit vector and v.
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.
This file declares a class for representing longitude/latitude angle boxes on the unit sphere...
std::vector< uint8_t > encode() const override
encode serializes this region into an opaque byte string.
Circle & complement()
complement sets this circle to the closure of its complement.
Box getBoundingBox() const override
getBoundingBox returns a bounding-box for this region.
static std::unique_ptr< Circle > decode(std::vector< uint8_t > const &s)
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.
Circle & dilateBy(Angle r)
If r is positive, dilateBy increases the opening angle of this circle to include all points within an...
Relationship relate(Region const &r) const override
static Angle openingAngleFor(double squaredChordLength)
openingAngleFor computes and returns the angular separation between points in S² that are separated b...
Angle represents an angle in radians.
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...
Circle()
This constructor creates an empty circle.
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.
static constexpr uint8_t TYPE_CODE
This file declares a class for representing convex polygons with great circle edges on the unit spher...
static UnitVector3d fromNormalized(Vector3d const &v)
fromNormalized returns the unit vector equal to v, which is assumed to be normalized.
Relationship relate(UnitVector3d const &v) const
bool isDisjointFrom(UnitVector3d const &x) const