42 if (
a.asRadians() < 0.0) {
45 if (
a.asRadians() >=
PI) {
48 double s = sin(0.5 *
a);
55 if (squaredChordLength < 0.0) {
58 if (squaredChordLength >= 4.0) {
75 return _openingAngle >
87 return cc > _openingAngle +
x._openingAngle +
135 Angle o = 0.5 * (cx + _openingAngle);
136 Angle r = 0.5 * (cx - _openingAngle);
166 Angle o = 0.5 * (cc + _openingAngle +
x._openingAngle);
177 Angle r = o - _openingAngle;
190 Angle o = _openingAngle + r;
200 _squaredChordLength = 4.0;
204 _squaredChordLength = -1.0;
205 _openingAngle =
Angle(-1.0);
208 _squaredChordLength = 4.0 - _squaredChordLength;
209 _openingAngle =
Angle(
PI) - _openingAngle;
223 static double const MAX_BOUNDARY_ERROR = 6.2e-16;
248 double s = sin(_openingAngle);
249 double c = cos(_openingAngle);
250 for (
int i = 0; i < 3; ++i) {
251 double ci = _center(i);
253 double bmin = 1.0, bmax = -1.0;
254 if (2.0 - 2.0 * ci <= _squaredChordLength) {
257 if (2.0 + 2.0 * ci <= _squaredChordLength) {
260 double b0 = ci * c + di * s;
261 bmax =
std::max(bmax, b0 + MAX_BOUNDARY_ERROR);
262 bmin =
std::min(bmin, b0 - MAX_BOUNDARY_ERROR);
263 double b1 = ci * c - di * s;
264 bmax =
std::max(bmax, b1 + MAX_BOUNDARY_ERROR);
265 bmin =
std::min(bmin, b1 - MAX_BOUNDARY_ERROR);
268 return Box3d(e[0], e[1], e[2]);
275 return DISJOINT | WITHIN;
282 return invert(
b.relate(*
this));
288 return CONTAINS | DISJOINT | WITHIN;
290 return DISJOINT | WITHIN;
292 return CONTAINS | DISJOINT;
297 return CONTAINS | WITHIN;
306 return CONTAINS | WITHIN;
346 if (buffer ==
nullptr || n != ENCODED_SIZE || *buffer !=
TYPE_CODE) {
354 double squaredChordLength =
decodeDouble(buffer); buffer += 8;
355 double openingAngle =
decodeDouble(buffer); buffer += 8;
357 circle->_squaredChordLength = squaredChordLength;
358 circle->_openingAngle =
Angle(openingAngle);
365 return os <<
"{\"Circle\": [" << c.
getCenter() << tail;
This file declares a class for representing axis-aligned bounding boxes in ℝ³.
This file declares a class for representing circular regions on the unit sphere.
This file declares a class for representing convex polygons with great circle edges on the unit spher...
Angle represents an angle in radians.
double asRadians() const
asRadians returns the value of this angle in units of radians.
Box3d represents a box in ℝ³.
static Box3d aroundUnitSphere()
aroundUnitSphere returns a minimal Box3d containing the unit sphere.
Box represents a rectangle in spherical coordinate space that contains its boundary.
static NormalizedAngle halfWidthForCircle(Angle r, Angle lat)
halfWidthForCircle computes the half-width of bounding boxes for circles with radius r and centers at...
Circle is a circular region on the unit sphere that contains its boundary.
bool contains(Circle const &x) const
contains returns true if the intersection of this circle and x is equal to x.
static Angle openingAngleFor(double squaredChordLength)
openingAngleFor computes and returns the angular separation between points in S² that are separated b...
Box getBoundingBox() const override
getBoundingBox returns a bounding-box for this region.
Circle & clipTo(UnitVector3d const &x)
Circle & dilateBy(Angle r)
If r is positive, dilateBy increases the opening angle of this circle to include all points within an...
static std::unique_ptr< Circle > decode(std::vector< uint8_t > const &s)
std::vector< uint8_t > encode() const override
encode serializes this region into an opaque byte string.
bool isDisjointFrom(UnitVector3d const &x) const
Relationship relate(UnitVector3d const &v) const
double getSquaredChordLength() const
getSquaredChordLength returns the squared length of chords between the circle center and points on th...
UnitVector3d const & getCenter() const
getCenter returns the center of this circle as a unit vector.
Box3d getBoundingBox3d() const override
getBoundingBox3d returns a 3-dimensional bounding-box for this region.
Circle & complement()
complement sets this circle to the closure of its complement.
Circle & expandTo(UnitVector3d const &x)
Circle()
This constructor creates an empty circle.
static double squaredChordLengthFor(Angle openingAngle)
squaredChordLengthFor computes and returns the squared chord length between points in S² that are sep...
static constexpr uint8_t TYPE_CODE
ConvexPolygon is a closed convex polygon on the unit sphere.
Relationship relate(Region const &r) const override
Ellipse is an elliptical region on the sphere.
Relationship relate(Region const &r) const override
Interval1d represents closed intervals of ℝ.
LonLat represents a spherical coordinate (longitude/latitude angle) pair.
NormalizedAngle is an angle that lies in the range [0, 2π), with one exception - a NormalizedAngle ca...
UnitVector3d is a unit vector in ℝ³ with components stored in double precision.
static UnitVector3d fromNormalized(Vector3d const &v)
fromNormalized returns the unit vector equal to v, which is assumed to be normalized.
static UnitVector3d orthogonalTo(Vector3d const &v)
orthogonalTo returns an arbitrary unit vector that is orthogonal to v.
Vector3d cross(Vector3d const &v) const
cross returns the cross product of this unit vector and v.
This file contains simple helper functions for encoding and decoding primitive types to/from byte str...
constexpr double MAX_ASIN_ERROR
void encodeDouble(double item, std::vector< uint8_t > &buffer)
encodeDouble appends an IEEE double in little-endian byte order to the end of buffer.
std::ostream & operator<<(std::ostream &, Angle const &)
double decodeDouble(uint8_t const *buffer)
decodeDouble extracts an IEEE double from the 8 byte little-endian byte sequence in buffer.
Relationship invert(Relationship r)
Given the relationship between two sets A and B (i.e.
This file declares a class for representing longitude/latitude angle boxes on the unit sphere.
This file declares a class for representing elliptical regions on the unit sphere.