Skip to content

Commit 513ccd1

Browse files
authored
Merge pull request NASAWorldWind#63 from wcmatthysen/normalize-latitude
Latitude normalization fix for angles > 180-deg.
2 parents f671d51 + 8da56ac commit 513ccd1

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

src/gov/nasa/worldwind/geom/Angle.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -677,11 +677,14 @@ public static double normalizedDegrees(double degrees)
677677
double a = degrees % 360;
678678
return a > 180 ? a - 360 : a < -180 ? 360 + a : a;
679679
}
680-
680+
681681
public static double normalizedDegreesLatitude(double degrees)
682682
{
683683
double lat = degrees % 180;
684-
return lat > 90 ? 180 - lat : lat < -90 ? -180 - lat : lat;
684+
double normalizedLat = lat > 90 ? 180 - lat : lat < -90 ? -180 - lat : lat;
685+
// Determine whether the latitude is in the northern or southern hemisphere.
686+
int numEquatorCrosses = (int) (degrees / 180);
687+
return (numEquatorCrosses % 2 == 0) ? normalizedLat : -normalizedLat;
685688
}
686689

687690
public static double normalizedDegreesLongitude(double degrees)

test/gov/nasa/worldwind/geom/AngleTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,56 @@ public void testFromDMSString_ConflictingPrefixSuffixCaseFour()
267267

268268
assertEquals("conflicting string format, positive sign and direction", expectedValue, actualValue, 0.0);
269269
}
270+
271+
@Test
272+
public void testNormalizedDegreesLatitude_AngleBelow90()
273+
{
274+
double angle = 67.0;
275+
double normalizedAngle = Angle.normalizedDegreesLatitude(angle); // Expected angle should be 67-degrees.
276+
assertEquals("test with angle less than 90 degrees", angle, normalizedAngle, 0.0);
277+
}
278+
279+
@Test
280+
public void testNormalizedDegreesLatitude_AngleAbove90()
281+
{
282+
double angle = 95.0;
283+
double normalizedAngle = Angle.normalizedDegreesLatitude(angle);
284+
double expectedValue = 180.0 - angle; // Expected angle should be 85-degrees.
285+
assertEquals("test with angle above 90 degrees", expectedValue, normalizedAngle, 0.0);
286+
}
287+
288+
@Test
289+
public void testNormalizedDegreesLatitude_AngleAbove180()
290+
{
291+
double angle = 184.0;
292+
double normalizedAngle = Angle.normalizedDegreesLatitude(angle);
293+
double expectedValue = -1.0 * (angle % 180.0); // Expected angle should be -4-degrees.
294+
assertEquals("test with angle above 180 degrees", expectedValue, normalizedAngle, 0.0);
295+
}
296+
297+
@Test
298+
public void testNormalizedDegreesLatitude_AngleAboveNeg90()
299+
{
300+
double angle = -73.0;
301+
double normalizedAngle = Angle.normalizedDegreesLatitude(angle); // Expected angle should be -73-degrees.
302+
assertEquals("test with angle above -90 degrees", angle, normalizedAngle, 0.0);
303+
}
304+
305+
@Test
306+
public void testNormalizedDegreesLatitude_AngleBelowNeg90()
307+
{
308+
double angle = -130.0;
309+
double normalizedAngle = Angle.normalizedDegreesLatitude(angle);
310+
double expectedValue = -180.0 - angle; // Expeccted angle should be -50-degrees.
311+
assertEquals("test with angle below -90 degrees", expectedValue, normalizedAngle, 0.0);
312+
}
313+
314+
@Test
315+
public void testNormalizedDegreesLatitude_AngleBelowNeg180()
316+
{
317+
double angle = -190.0;
318+
double normalizedAngle = Angle.normalizedDegreesLatitude(angle);
319+
double expectedValue = -1.0 * (angle % 180.0); // Expected angle should be 10-degrees.
320+
assertEquals("test with angle below -180-degrees", expectedValue, normalizedAngle, 0.0);
321+
}
270322
}

0 commit comments

Comments
 (0)