Skip to content

Commit 84b0c06

Browse files
BAEL-9402: Calculate the Difference of Two Angle Measures in Java (#18875)
Co-authored-by: Nikhil Bhargava <[email protected]>
1 parent e9631b6 commit 84b0c06

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* Package to host code for calculating three types of angle difference
3+
*/
4+
package com.baeldung.algorithms.twoanglesdifference;
5+
6+
public class AngleDifferenceCalculator {
7+
8+
/**
9+
* Normalizes an angle to be within the range [0, 360).
10+
*
11+
* @param angle The angle in degrees.
12+
* @return The normalized angle.
13+
*/
14+
public static double normalizeAngle(double angle) {
15+
return (angle % 360 + 360) % 360;
16+
}
17+
18+
/**
19+
* Calculates the absolute difference between two angles.
20+
*
21+
* @param angle1 The first angle in degrees.
22+
* @param angle2 The second angle in degrees.
23+
* @return The absolute difference in degrees.
24+
*/
25+
public static double absoluteDifference(double angle1, double angle2) {
26+
return Math.abs(angle1 - angle2);
27+
}
28+
29+
/**
30+
* Calculates the shortest difference between two angles.
31+
*
32+
* @param angle1 The first angle in degrees.
33+
* @param angle2 The second angle in degrees.
34+
* @return The shortest difference in degrees (0 to 180).
35+
*/
36+
public static double shortestDifference(double angle1, double angle2) {
37+
double diff = absoluteDifference(normalizeAngle(angle1), normalizeAngle(angle2));
38+
return Math.min(diff, 360 - diff);
39+
}
40+
41+
/**
42+
* Calculates the signed shortest difference between two angles.
43+
* A positive result indicates counter-clockwise rotation, a negative result indicates clockwise.
44+
*
45+
* @param angle1 The first angle in degrees.
46+
* @param angle2 The second angle in degrees.
47+
* @return The signed shortest difference in degrees (-180 to 180).
48+
*/
49+
public static double signedShortestDifference(double angle1, double angle2) {
50+
double normalizedAngle1 = normalizeAngle(angle1);
51+
double normalizedAngle2 = normalizeAngle(angle2);
52+
double diff = normalizedAngle2 - normalizedAngle1;
53+
54+
if (diff > 180) {
55+
return diff - 360;
56+
} else if (diff < -180) {
57+
return diff + 360;
58+
} else {
59+
return diff;
60+
}
61+
}
62+
}
63+
64+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Package to host JUnit Test code for AngleDifferenceCalculator Class
3+
*/
4+
package com.baeldung.algorithms.twoanglesdifference;
5+
6+
import static org.junit.jupiter.api.Assertions.assertEquals;
7+
8+
import org.junit.jupiter.api.Test;
9+
10+
11+
12+
class AngleDifferenceCalculatorTest {
13+
14+
private static final double EPSILON = 0.0001;
15+
16+
@Test
17+
void whenNormalizingAngle_thenReturnsCorrectRange() {
18+
assertEquals(90, AngleDifferenceCalculator.normalizeAngle(450), EPSILON);
19+
assertEquals(30, AngleDifferenceCalculator.normalizeAngle(390), EPSILON);
20+
assertEquals(330, AngleDifferenceCalculator.normalizeAngle(-30), EPSILON);
21+
assertEquals(0, AngleDifferenceCalculator.normalizeAngle(360), EPSILON);
22+
}
23+
24+
@Test
25+
void whenCalculatingAbsoluteDifference_thenReturnsCorrectValue() {
26+
assertEquals(100, AngleDifferenceCalculator.absoluteDifference(10, 110), EPSILON);
27+
assertEquals(290, AngleDifferenceCalculator.absoluteDifference(10, 300), EPSILON);
28+
assertEquals(30, AngleDifferenceCalculator.absoluteDifference(-30, 0), EPSILON);
29+
}
30+
31+
@Test
32+
void whenCalculatingShortestDifference_thenReturnsCorrectValue() {
33+
assertEquals(100, AngleDifferenceCalculator.shortestDifference(10, 110), EPSILON);
34+
assertEquals(70, AngleDifferenceCalculator.shortestDifference(10, 300), EPSILON);
35+
assertEquals(30, AngleDifferenceCalculator.shortestDifference(-30, 0), EPSILON);
36+
assertEquals(0, AngleDifferenceCalculator.shortestDifference(360, 0), EPSILON);
37+
}
38+
39+
@Test
40+
void whenCalculatingSignedShortestDifference_thenReturnsCorrectValue() {
41+
assertEquals(100, AngleDifferenceCalculator.signedShortestDifference(10, 110), EPSILON);
42+
assertEquals(-70, AngleDifferenceCalculator.signedShortestDifference(10, 300), EPSILON);
43+
assertEquals(30, AngleDifferenceCalculator.signedShortestDifference(-30, 0), EPSILON);
44+
assertEquals(70, AngleDifferenceCalculator.signedShortestDifference(300, 10), EPSILON);
45+
}
46+
}
47+

0 commit comments

Comments
 (0)