23#ifndef LSST_SPHGEOM_CONVEXPOLYGONIMPL_H_
24#define LSST_SPHGEOM_CONVEXPOLYGONIMPL_H_
47template <
typename VertexIterator>
57 VertexIterator j = begin;
58 for (; j !=
end; i = j, ++j) {
61 double c = (*i).dot(*j);
62 double a = (s == 0.0 && c == 0.0) ? 0.0 :
std::atan2(s, c);
68template <
typename VertexIterator>
73 VertexIterator i = begin;
75 for (; i !=
end; ++i) {
76 cl2 =
std::max(cl2, (*i - c).getSquaredNorm());
84template <
typename VertexIterator>
86 Angle const eps(5.0e-10);
89 VertexIterator j = begin;
103 for (; j !=
end; i = j, ++j) {
105 bbox.expandTo(
Box(p, eps, eps));
106 if (!haveCW || !haveCCW) {
108 haveCCW = haveCCW || (o > 0);
109 haveCW = haveCW || (o < 0);
122 n.
x() * n.
x() + n.
y() * n.
y());
127 double zni = i->y() * n.
x() - i->x() * n.
y();
128 double znj = j->y() * n.
x() - j->x() * n.
y();
130 if (zni > 0.0 && znj < 0.0) {
133 }
else if (zni < 0.0 && znj > 0.0) {
143 bbox.expandTo(northPole);
144 }
else if (!haveCCW) {
146 bbox.expandTo(southPole);
151template <
typename VertexIterator>
153 static double const maxError = 1.0e-14;
155 VertexIterator j = begin;
156 double emin[3] = { j->x(), j->y(), j->z() };
157 double emax[3] = { j->x(), j->y(), j->z() };
158 for (++j; j !=
end; ++j) {
159 for (
int i = 0; i < 3; ++i) {
160 double v = j->operator()(i);
185 VertexIterator k = begin;
186 for (; k !=
end; j = k, ++k) {
188 for (
int i = 0; i < 3; ++i) {
193 i == 1 ? -d : n.
y() * ni,
194 i == 2 ? -d : n.
z() * ni);
199 double vdj = v.
dot(*j);
200 double vdk = v.
dot(*k);
201 if (vdj >= 0.0 && vdk <= 0.0) {
204 if (vdj <= 0.0 && vdk >= 0.0) {
212 bool a[3] = {
true,
true,
true };
213 bool b[3] = {
true,
true,
true };
216 for (; k !=
end; j = k, ++k) {
221 a[0] =
a[0] && (ox <= 0);
222 b[0] =
b[0] && (ox >= 0);
224 a[1] =
a[1] && (oy <= 0);
225 b[1] =
b[1] && (oy >= 0);
227 a[2] =
a[2] && (oz <= 0);
228 b[2] =
b[2] && (oz >= 0);
233 for (
int i = 0; i < 3; ++i) {
234 emin[i] =
a[i] ? -1.0 :
std::max(-1.0, emin[i] - maxError);
235 emax[i] =
b[i] ? 1.0 :
std::min(1.0, emax[i] + maxError);
242template <
typename VertexIterator>
244 VertexIterator
const end,
248 VertexIterator j = begin;
249 for (; j !=
end; i = j, ++j) {
257template <
typename VertexIterator>
259 VertexIterator
const end,
266template <
typename VertexIterator>
268 VertexIterator
const end,
272 return CONTAINS | DISJOINT;
281 for (VertexIterator v = begin; v !=
end; ++v) {
282 double d = (*v - c.
getCenter()).getSquaredNorm();
291 }
else if (inside !=
b) {
334template <
typename VertexIterator1,
335 typename VertexIterator2>
337 VertexIterator1
const end1,
338 VertexIterator2
const begin2,
339 VertexIterator2
const end2)
354 for (VertexIterator1 i = begin1; i != end1; ++i) {
359 for (VertexIterator2 j = begin2; j != end2; ++j) {
366 return (all1 ? WITHIN : INTERSECTS) | (all2 ? CONTAINS : INTERSECTS);
374 for (VertexIterator1
a =
std::prev(end1),
b = begin1;
375 b != end1;
a =
b, ++
b) {
376 for (VertexIterator2 c =
std::prev(end2), d = begin2;
377 d != end2; c = d, ++d) {
380 if (acd == bdc && acd != 0) {
383 if (cba == dab && cba == acd) {
393template <
typename VertexIterator>
395 VertexIterator
const end,
401template <
typename VertexIterator>
403 VertexIterator
const end,
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.
Angle represents an angle in radians.
AngleInterval represents closed intervals of arbitrary angles.
Box3d represents a box in ℝ³.
Box represents a rectangle in spherical coordinate space that contains its boundary.
Relationship relate(LonLat const &p) const
static NormalizedAngleInterval allLongitudes()
allLongitudes returns a normalized angle interval containing all valid longitude angles.
Circle is a circular region on the unit sphere that contains its boundary.
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.
ConvexPolygon is a closed convex polygon on the unit sphere.
std::vector< UnitVector3d > const & getVertices() const
Ellipse is an elliptical region on the sphere.
Circle getBoundingCircle() const override
getBoundingCircle returns a bounding-circle for this region.
Interval1d represents closed intervals of ℝ.
LonLat represents a spherical coordinate (longitude/latitude angle) pair.
static Angle latitudeOf(Vector3d const &v)
latitudeOf returns the latitude of the point on the unit sphere corresponding to the direction of v.
UnitVector3d is a unit vector in ℝ³ with components stored in double precision.
Vector3d is a vector in ℝ³ with components stored in double precision.
double dot(Vector3d const &v) const
dot returns the inner product of this vector and v.
double normalize()
normalize scales this vector to have unit norm and returns its norm prior to scaling.
Vector3d cross(Vector3d const &v) const
cross returns the cross product of this vector and v.
bool contains(VertexIterator const begin, VertexIterator const end, UnitVector3d const &v)
Circle boundingCircle(VertexIterator const begin, VertexIterator const end)
Box3d boundingBox3d(VertexIterator const begin, VertexIterator const end)
UnitVector3d centroid(VertexIterator const begin, VertexIterator const end)
Relationship relate(VertexIterator const begin, VertexIterator const end, Box const &b)
Box boundingBox(VertexIterator const begin, VertexIterator const end)
int orientationZ(UnitVector3d const &b, UnitVector3d const &c)
orientationZ(b, c) is equivalent to orientation(UnitVector3d::Z(), b, c).
double getMaxSquaredChordLength(Vector3d const &v, Vector3d const &a, Vector3d const &b, Vector3d const &n)
Let p be the unit vector furthest from v that lies on the plane with normal n in the direction of the...
double getMinSquaredChordLength(Vector3d const &v, Vector3d const &a, Vector3d const &b, Vector3d const &n)
Let p be the unit vector closest to v that lies on the plane with normal n in the direction of the cr...
constexpr double MAX_SQUARED_CHORD_LENGTH_ERROR
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.
int orientationX(UnitVector3d const &b, UnitVector3d const &c)
orientationX(b, c) is equivalent to orientation(UnitVector3d::X(), b, c).
int orientationY(UnitVector3d const &b, UnitVector3d const &c)
orientationY(b, c) is equivalent to orientation(UnitVector3d::Y(), b, c).
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.
This file declares functions for orienting points on the sphere.
This file declares miscellaneous utility functions.