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) {
72 return _openingAngle >
84 return cc > _openingAngle +
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;
279 return invert(
b.relate(*
this));
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 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.
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.
virtual bool contains(UnitVector3d const &) const=0
contains tests whether the given unit vector is inside 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)
encode appends an IEEE double in little-endian byte order to the end of buffer.
std::ostream & operator<<(std::ostream &, Angle const &)
double sin(Angle const &a)
double decodeDouble(uint8_t const *buffer)
decode extracts an IEEE double from the 8 byte little-endian byte sequence in buffer.
double cos(Angle const &a)
Relationship invert(Relationship r)
Given the relationship between two sets A and B (i.e.
A base class for image defects.
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.