Skip to content

Commit

Permalink
Remove UnitVector3d constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
r-owen committed Apr 26, 2018
1 parent 59cf4b1 commit 263e906
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 68 deletions.
12 changes: 0 additions & 12 deletions include/lsst/afw/geom/SpherePoint.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,18 +108,6 @@ class SpherePoint final {
*/
explicit SpherePoint(sphgeom::Vector3d const& vector);

/**
* Construct a SpherePoint from a unit vector representing a direction.
*
* @param unitVector A unit vector whose direction will be stored as a SpherePoint.
*
* @exceptsafe Provides strong exception guarantee.
*
* @note If the SpherePoint is at a pole then longitude is set to 0.
* That provides predictable behavior for @ref bearingTo and @ref offset.
*/
explicit SpherePoint(sphgeom::UnitVector3d const& unitVector);

/**
* Construct a SpherePoint from a sphgeom::LonLat.
*
Expand Down
2 changes: 0 additions & 2 deletions src/geom/SpherePoint.cc
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,6 @@ SpherePoint::SpherePoint(sphgeom::Vector3d const& vector) {
_set(unitVector);
}

SpherePoint::SpherePoint(sphgeom::UnitVector3d const& unitVector) { _set(unitVector); }

SpherePoint::SpherePoint(sphgeom::LonLat const& lonLat)
: SpherePoint(lonLat.getLon().asRadians(), lonLat.getLat().asRadians(), radians) {}

Expand Down
103 changes: 49 additions & 54 deletions tests/test_spherePoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
from numpy.testing import assert_allclose

import lsst.utils.tests
from lsst.sphgeom import Vector3d, UnitVector3d
import lsst.sphgeom
import lsst.afw.geom as afwGeom
import lsst.pex.exceptions as pexEx

Expand Down Expand Up @@ -136,39 +136,34 @@ def testLonLatConstructorErrors(self):

def testVector3dConstructor(self):
# test poles
for VectorType in UnitVector3d, Vector3d:
for z in (-11.3, -1.1, 0.1, 2.5): # arbitrary non-zero values
sp = SpherePoint(VectorType(0.0, 0.0, z))
self.assertTrue(sp.atPole())
self.assertEqual(sp.getLongitude().asRadians(), 0.0)
if z < 0:
self.assertAnglesAlmostEqual(sp.getLatitude(), -90 * degrees)
else:
self.assertAnglesAlmostEqual(sp.getLatitude(), 90 * degrees)
for z in (-11.3, -1.1, 0.1, 2.5): # arbitrary non-zero values
sp = SpherePoint(lsst.sphgeom.Vector3d(0.0, 0.0, z))
self.assertTrue(sp.atPole())
self.assertEqual(sp.getLongitude().asRadians(), 0.0)
if z < 0:
self.assertAnglesAlmostEqual(sp.getLatitude(), -90 * degrees)
else:
self.assertAnglesAlmostEqual(sp.getLatitude(), 90 * degrees)

spx = SpherePoint(VectorType(11.1, 0.0, 0.0))
self.assertAnglesAlmostEqual(spx.getLongitude(), 0.0 * degrees)
self.assertAnglesAlmostEqual(spx.getLatitude(), 0.0 * degrees)
spx = SpherePoint(lsst.sphgeom.Vector3d(11.1, 0.0, 0.0))
self.assertAnglesAlmostEqual(spx.getLongitude(), 0.0 * degrees)
self.assertAnglesAlmostEqual(spx.getLatitude(), 0.0 * degrees)

spy = SpherePoint(VectorType(0.0, 234234.5, 0.0))
self.assertAnglesAlmostEqual(spy.getLongitude(), 90.0 * degrees)
self.assertAnglesAlmostEqual(spy.getLatitude(), 0.0 * degrees)
spy = SpherePoint(lsst.sphgeom.Vector3d(0.0, 234234.5, 0.0))
self.assertAnglesAlmostEqual(spy.getLongitude(), 90.0 * degrees)
self.assertAnglesAlmostEqual(spy.getLatitude(), 0.0 * degrees)

spxy = SpherePoint(VectorType(7.5, -7.5, 0.0))
self.assertAnglesAlmostEqual(spxy.getLongitude(), -45.0 * degrees)
self.assertAnglesAlmostEqual(spxy.getLatitude(), 0.0 * degrees)
spxy = SpherePoint(lsst.sphgeom.Vector3d(7.5, -7.5, 0.0))
self.assertAnglesAlmostEqual(spxy.getLongitude(), -45.0 * degrees)
self.assertAnglesAlmostEqual(spxy.getLatitude(), 0.0 * degrees)

spxz = SpherePoint(VectorType(100.0, 0.0, -100.0))
self.assertAnglesAlmostEqual(spxz.getLongitude(), 0.0 * degrees)
self.assertAnglesAlmostEqual(spxz.getLatitude(), -45.0 * degrees)
spxz = SpherePoint(lsst.sphgeom.Vector3d(100.0, 0.0, -100.0))
self.assertAnglesAlmostEqual(spxz.getLongitude(), 0.0 * degrees)
self.assertAnglesAlmostEqual(spxz.getLatitude(), -45.0 * degrees)

# Only one singularity, at zero
# Only one singularity: a vector of all zeros
with self.assertRaises(pexEx.InvalidParameterError):
SpherePoint(Vector3d(0.0, 0.0, 0.0))

with self.assertRaises(RuntimeError):
# this fails on construction of the UnitVector3d
SpherePoint(UnitVector3d(0.0, 0.0, 0.0))
SpherePoint(lsst.sphgeom.Vector3d(0.0, 0.0, 0.0))

def testDefaultConstructor(self):
sp = SpherePoint()
Expand Down Expand Up @@ -216,7 +211,7 @@ def testGetLongitudeValue(self):
self.assertAnglesAlmostEqual(lon, point.getRa())

# Vector construction should return valid longitude even in edge cases.
point = SpherePoint(Vector3d(0.0, 0.0, -1.0))
point = SpherePoint(lsst.sphgeom.Vector3d(0.0, 0.0, -1.0))
self.assertGreaterEqual(point.getLongitude().asDegrees(), 0.0)
self.assertLess(point.getLongitude().asDegrees(), 360.0)

Expand All @@ -236,7 +231,7 @@ def testTicket1394(self):
# The problem was that the coordinate is less than epsilon
# close to RA == 0 and bounds checking was getting a
# negative RA.
point = SpherePoint(Vector3d(
point = SpherePoint(lsst.sphgeom.Vector3d(
0.6070619982, -1.264309928e-16, 0.7946544723))

self.assertEqual(point[0].asDegrees(), 0.0)
Expand Down Expand Up @@ -265,17 +260,17 @@ def testGetVectorValue(self):
The test includes conformance to vector-angle conventions.
"""
for lon, lat, vector in [
(0.0*degrees, 0.0*degrees, Vector3d(1.0, 0.0, 0.0)),
(90.0*degrees, 0.0*degrees, Vector3d(0.0, 1.0, 0.0)),
(0.0*degrees, 90.0*degrees, Vector3d(0.0, 0.0, 1.0)),
(0.0*degrees, 0.0*degrees, lsst.sphgeom.Vector3d(1.0, 0.0, 0.0)),
(90.0*degrees, 0.0*degrees, lsst.sphgeom.Vector3d(0.0, 1.0, 0.0)),
(0.0*degrees, 90.0*degrees, lsst.sphgeom.Vector3d(0.0, 0.0, 1.0)),
]:
for point in (
SpherePoint(lon, lat),
SpherePoint(lon.asDegrees(), lat.asDegrees(), degrees),
SpherePoint(lon.asRadians(), lat.asRadians(), radians),
):
newVector = point.getVector()
self.assertIsInstance(newVector, UnitVector3d)
self.assertIsInstance(newVector, lsst.sphgeom.UnitVector3d)
for oldElement, newElement in zip(vector, newVector):
self.assertAlmostEqual(oldElement, newElement)

Expand All @@ -286,12 +281,12 @@ def testGetVectorValue(self):

# Try some un-normalized ones, too.
pointList = [
((0.0, 0.0), Vector3d(1.3, 0.0, 0.0)),
((90.0, 0.0), Vector3d(0.0, 1.2, 0.0)),
((0.0, 90.0), Vector3d(0.0, 0.0, 2.3)),
((0.0, 0.0), Vector3d(0.5, 0.0, 0.0)),
((90.0, 0.0), Vector3d(0.0, 0.7, 0.0)),
((0.0, 90.0), Vector3d(0.0, 0.0, 0.9)),
((0.0, 0.0), lsst.sphgeom.Vector3d(1.3, 0.0, 0.0)),
((90.0, 0.0), lsst.sphgeom.Vector3d(0.0, 1.2, 0.0)),
((0.0, 90.0), lsst.sphgeom.Vector3d(0.0, 0.0, 2.3)),
((0.0, 0.0), lsst.sphgeom.Vector3d(0.5, 0.0, 0.0)),
((90.0, 0.0), lsst.sphgeom.Vector3d(0.0, 0.7, 0.0)),
((0.0, 90.0), lsst.sphgeom.Vector3d(0.0, 0.0, 0.9)),
]

for lonLat, vector in pointList:
Expand All @@ -300,7 +295,7 @@ def testGetVectorValue(self):
newLon, newLat = point
self.assertAlmostEqual(lonLat[0], newLon.asDegrees())
self.assertAlmostEqual(lonLat[1], newLat.asDegrees())
vector = Vector3d(point.getVector())
vector = lsst.sphgeom.Vector3d(point.getVector())
self.assertAlmostEqual(1.0, vector.getSquaredNorm())

# Ill-defined points should be all NaN after normalization
Expand All @@ -310,7 +305,7 @@ def testGetVectorValue(self):
for badValue in badValues:
values = cleanValues[:]
values[i] = badValue
nonFiniteVector = Vector3d(*values)
nonFiniteVector = lsst.sphgeom.Vector3d(*values)
for element in SpherePoint(nonFiniteVector).getVector():
self.assertTrue(math.isnan(element))

Expand All @@ -319,10 +314,10 @@ def testTicket1761(self):
Checks for math errors caused by unnormalized vectors.
"""
refPoint = SpherePoint(Vector3d(0, 1, 0))
refPoint = SpherePoint(lsst.sphgeom.Vector3d(0, 1, 0))

point1 = SpherePoint(Vector3d(0.1, 0.1, 0.1))
point2 = SpherePoint(Vector3d(0.6, 0.6, 0.6))
point1 = SpherePoint(lsst.sphgeom.Vector3d(0.1, 0.1, 0.1))
point2 = SpherePoint(lsst.sphgeom.Vector3d(0.6, 0.6, 0.6))
sep1 = refPoint.separation(point1)
sep2 = refPoint.separation(point2)
sepTrue = 54.735610317245339*degrees
Expand All @@ -339,8 +334,8 @@ def testAtPoleValue(self):
[SpherePoint(42.0*degrees, -lat) for lat in self._poleLatitudes] + \
[SpherePoint(42.0, -lat.asDegrees(), degrees) for lat in self._poleLatitudes] + \
[
SpherePoint(Vector3d(0.0, 0.0, 1.0)),
SpherePoint(Vector3d(0.0, 0.0, -1.0)),
SpherePoint(lsst.sphgeom.Vector3d(0.0, 0.0, 1.0)),
SpherePoint(lsst.sphgeom.Vector3d(0.0, 0.0, -1.0)),
]
nonPoleList = \
[SpherePoint(42.0*degrees, self.nextDown(lat)) for lat in self._poleLatitudes] + \
Expand All @@ -349,8 +344,8 @@ def testAtPoleValue(self):
[SpherePoint(42.0, self.nextUp(-lat).asDegrees(), degrees)
for lat in self._poleLatitudes] + \
[
SpherePoint(Vector3d(9.9e-7, 0.0, 1.0)),
SpherePoint(Vector3d(9.9e-7, 0.0, -1.0)),
SpherePoint(lsst.sphgeom.Vector3d(9.9e-7, 0.0, 1.0)),
SpherePoint(lsst.sphgeom.Vector3d(9.9e-7, 0.0, -1.0)),
SpherePoint(0.0*degrees, nan*degrees),
]

Expand All @@ -368,7 +363,7 @@ def testIsFiniteValue(self):
finiteList = [
SpherePoint(0.0*degrees, -90.0*degrees),
SpherePoint(0.0, -90.0, degrees),
SpherePoint(Vector3d(0.1, 0.2, 0.3)),
SpherePoint(lsst.sphgeom.Vector3d(0.1, 0.2, 0.3)),
]
nonFiniteList = [
SpherePoint(0.0*degrees, nan*degrees),
Expand All @@ -379,9 +374,9 @@ def testIsFiniteValue(self):
SpherePoint(inf, 0.0, degrees),
SpherePoint(-inf*degrees, 0.0*degrees),
SpherePoint(-inf, 0.0, degrees),
SpherePoint(Vector3d(nan, 0.2, 0.3)),
SpherePoint(Vector3d(0.1, inf, 0.3)),
SpherePoint(Vector3d(0.1, 0.2, -inf)),
SpherePoint(lsst.sphgeom.Vector3d(nan, 0.2, 0.3)),
SpherePoint(lsst.sphgeom.Vector3d(0.1, inf, 0.3)),
SpherePoint(lsst.sphgeom.Vector3d(0.1, 0.2, -inf)),
]

for finite in finiteList:
Expand All @@ -395,7 +390,7 @@ def testIsFiniteValue(self):
def testGetItemError(self):
"""Test if indexing correctly handles invalid input.
"""
point = SpherePoint(Vector3d(1.0, 1.0, 1.0))
point = SpherePoint(lsst.sphgeom.Vector3d(1.0, 1.0, 1.0))

with self.assertRaises(IndexError):
point[2]
Expand Down

0 comments on commit 263e906

Please sign in to comment.