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...
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
This file declares a class for representing elliptical regions on the unit sphere.
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.
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.
This file declares a class for representing longitude/latitude angle boxes on the unit sphere...
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