42 char const *
const FOUND_ANTIPODAL_POINT =
43 "The convex hull of the given point set is the " 46 char const *
const NOT_ENOUGH_POINTS =
47 "The convex hull of a point set containing less than " 48 "3 distinct, non-coplanar points is not a convex polygon";
62 UnitVector3d & v0 = points[0];
63 UnitVector3d & v1 = points[1];
66 for (; v !=
end; ++v) {
91 UnitVector3d & v0 = points[0];
92 UnitVector3d & v1 = points[1];
96 UnitVector3d n(v0.robustCross(v1));
97 for (; v !=
end; ++v) {
102 }
else if (ccw < 0) {
109 if (*v == v0 || *v == v1) {
112 if (*v == -v0 || *v == -v1) {
147 VertexIterator hullEnd = points.
begin() + 3;
148 VertexIterator
const end = points.
end();
150 for (VertexIterator v = findTriangle(points); v !=
end; ++v) {
165 VertexIterator i = hullEnd - 1;
166 VertexIterator j = points.
begin();
169 VertexIterator toCCW = hullEnd;
173 VertexIterator fromCCW = hullEnd;
177 bool prevCCW = firstCCW;
181 for (i = j, ++j; j != hullEnd; i = j, ++j) {
187 }
else if (prevCCW) {
198 }
else if (prevCCW) {
199 fromCCW = points.
begin();
203 if (toCCW == hullEnd) {
215 if (toCCW < fromCCW) {
216 if (toCCW != points.
begin()) {
221 }
else if (toCCW > fromCCW) {
223 if (toCCW != fromCCW) {
224 hullEnd =
std::copy(toCCW, hullEnd, fromCCW);
227 if (fromCCW == points.
begin()) {
237 points.
erase(hullEnd, end);
258 computeHull(_vertices);
265 if (_vertices.size() != p._vertices.size()) {
268 VertexIterator i = _vertices.begin();
269 VertexIterator f = p._vertices.begin();
270 VertexIterator
const ep = p._vertices.end();
272 for (; f != ep; ++f) {
283 for (VertexIterator j = f + 1; j != ep; ++i, ++j) {
288 for (VertexIterator j = p._vertices.begin(); j != f; ++i, ++j) {
317 return (
relate(r) & CONTAINS) != 0;
321 return (
relate(r) & DISJOINT) != 0;
329 return (
relate(r) & WITHIN) != 0;
351 buffer.
reserve(1 + 24 * _vertices.size());
364 if (buffer ==
nullptr || *buffer !=
TYPE_CODE ||
365 n < 1 + 24*3 || (n - 1) % 24 != 0) {
370 size_t nv = (n - 1) / 24;
371 poly->_vertices.reserve(nv);
372 for (
size_t i = 0; i < nv; ++i, buffer += 24) {
386 os <<
"{\"ConvexPolygon\": [" << *v;
387 for (++v; v !=
end; ++v) { os <<
", " << *v; }
bool isDisjointFrom(Region const &r) const
bool contains(VertexIterator const begin, VertexIterator const end, UnitVector3d const &v)
int orientation(UnitVector3d const &a, UnitVector3d const &b, UnitVector3d const &c)
orientation computes and returns the orientations of 3 unit vectors a, b and c.
This file declares functions for orienting points on the sphere.
Low-level polynomials (including special polynomials) in C++.
Box boundingBox(VertexIterator const begin, VertexIterator const end)
bool operator==(ConvexPolygon const &p) const
Two convex polygons are equal iff they contain the same points.
This file contains simple helper functions for encoding and decoding primitive types to/from byte str...
std::ostream & operator<<(std::ostream &, Angle const &)
bool isWithin(Region const &r) const
Box represents a rectangle in spherical coordinate space that contains its boundary.
UnitVector3d getCentroid() const
The centroid of a polygon is its center of mass projected onto S², assuming a uniform mass distributi...
Circle getBoundingCircle() const override
getBoundingCircle returns a bounding-circle for this region.
Ellipse is an elliptical region on the sphere.
bool intersects(Region const &r) const
Relationship relate(Region const &r) const override
A base class for image defects.
std::vector< UnitVector3d > const & getVertices() const
UnitVector3d centroid(VertexIterator const begin, VertexIterator const end)
Region is a minimal interface for 2-dimensional regions on the unit sphere.
Relationship relate(VertexIterator const begin, VertexIterator const end, Box const &b)
This file contains the meat of the ConvexPolygon implementation.
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.
T copy_backward(T... args)
bool contains(UnitVector3d const &v) const override
Box getBoundingBox() const override
getBoundingBox returns a bounding-box for this region.
static constexpr uint8_t TYPE_CODE
Box3d represents a box in ℝ³.
std::vector< uint8_t > encode() const override
encode serializes this region into an opaque byte string.
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.
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.
Box3d boundingBox3d(VertexIterator const begin, VertexIterator const end)
Circle boundingCircle(VertexIterator const begin, VertexIterator const end)
static std::unique_ptr< ConvexPolygon > decode(std::vector< uint8_t > const &s)
Box3d getBoundingBox3d() const override
getBoundingBox3d returns a 3-dimensional bounding-box for this region.