예제 #1
0
    def testRotatedAlias(self):
        """White-box test: all representations of a pole should rotate into the same point.
        """
        longitudes = [0.0, 90.0, 242.0]
        latitude = 90.0
        arcLen = 10.0
        pole = SpherePoint(90.0 * degrees, 0.0 * degrees)
        for longitude in longitudes:
            point = SpherePoint(longitude * degrees, latitude * degrees)
            newPoint = point.rotated(pole, arcLen * degrees)

            self.assertAlmostEqual(0.0, newPoint.getLongitude().asDegrees())
            self.assertAlmostEqual(80.0, newPoint.getLatitude().asDegrees())
예제 #2
0
    def testRotatedValue(self):
        """Test if rotated() returns the expected value.
        """
        # Try rotating about the equatorial pole (ie. along a parallel).
        longitude = 90.0
        latitudes = [0.0, 30.0, 60.0]
        arcLen = 10.0
        pole = SpherePoint(0.0 * degrees, 90.0 * degrees)
        for latitude in latitudes:
            point = SpherePoint(longitude * degrees, latitude * degrees)
            newPoint = point.rotated(pole, arcLen * degrees)

            self.assertIsInstance(newPoint, SpherePoint)
            self.assertAlmostEqual(longitude + arcLen,
                                   newPoint.getLongitude().asDegrees())
            self.assertAlmostEqual(latitude,
                                   newPoint.getLatitude().asDegrees())

        # Try with pole = vernal equinox and rotate up the 90 degree meridian.
        pole = SpherePoint(0.0 * degrees, 0.0 * degrees)
        for latitude in latitudes:
            point = SpherePoint(longitude * degrees, latitude * degrees)
            newPoint = point.rotated(pole, arcLen * degrees)

            self.assertAlmostEqual(longitude,
                                   newPoint.getLongitude().asDegrees())
            self.assertAlmostEqual(latitude + arcLen,
                                   newPoint.getLatitude().asDegrees())

        # Test accuracy close to coordinate pole
        point = SpherePoint(90.0 * degrees, np.nextafter(90.0, -inf) * degrees)
        newPoint = point.rotated(pole, 90.0 * degrees)
        self.assertAlmostEqual(270.0, newPoint.getLongitude().asDegrees())
        self.assertAlmostEqual(90.0 - np.nextafter(90.0, -inf),
                               newPoint.getLatitude().asDegrees())

        # Generic pole; can't predict position, but test for rotation
        # invariant.
        pole = SpherePoint(283.5 * degrees, -23.6 * degrees)
        for lon, lat in self._dataset:
            point = SpherePoint(lon, lat)
            dist = point.separation(pole)
            newPoint = point.rotated(pole, -32.4 * afwGeom.radians)

            self.assertNotAlmostEqual(point.getLongitude().asDegrees(),
                                      newPoint.getLongitude().asDegrees())
            self.assertNotAlmostEqual(point.getLatitude().asDegrees(),
                                      newPoint.getLatitude().asDegrees())
            self.assertAnglesAlmostEqual(dist, newPoint.separation(pole))

        # Non-finite values give undefined rotations
        for latitude in latitudes:
            point = SpherePoint(longitude * degrees, latitude * degrees)
            nanPoint = point.rotated(pole, nan * degrees)
            infPoint = point.rotated(pole, inf * degrees)

            self.assertTrue(math.isnan(nanPoint.getLongitude().asRadians()))
            self.assertTrue(math.isnan(nanPoint.getLatitude().asRadians()))
            self.assertTrue(math.isnan(infPoint.getLongitude().asRadians()))
            self.assertTrue(math.isnan(infPoint.getLatitude().asRadians()))

        # Non-finite points rotate into non-finite points
        for point in [
                SpherePoint(-inf * degrees, 1.0 * radians),
                SpherePoint(32.0 * degrees, nan * radians),
        ]:
            newPoint = point.rotated(pole, arcLen * degrees)
            self.assertTrue(math.isnan(nanPoint.getLongitude().asRadians()))
            self.assertTrue(math.isnan(nanPoint.getLatitude().asRadians()))
            self.assertTrue(math.isnan(infPoint.getLongitude().asRadians()))
            self.assertTrue(math.isnan(infPoint.getLatitude().asRadians()))

        # Rotation around non-finite poles undefined
        for latitude in latitudes:
            point = SpherePoint(longitude * degrees, latitude * degrees)
            for pole in [
                    SpherePoint(-inf * degrees, 1.0 * radians),
                    SpherePoint(32.0 * degrees, nan * radians),
            ]:
                newPoint = point.rotated(pole, arcLen * degrees)
                self.assertTrue(math.isnan(
                    nanPoint.getLongitude().asRadians()))
                self.assertTrue(math.isnan(nanPoint.getLatitude().asRadians()))
                self.assertTrue(math.isnan(
                    infPoint.getLongitude().asRadians()))
                self.assertTrue(math.isnan(infPoint.getLatitude().asRadians()))