Rebol3 Code Examplex


Angle difference between two bearings

Find the smallest angular gap between the two directions, treating the bearings as circular values from 0 to 360 degrees.

Rebol [
    title: "Rosetta code: Angle difference between two bearings"
    file:  %Angle_difference_between_two_bearings.r3
    url:   https://rosettacode.org/wiki/Angle_difference_between_two_bearings
]

angle-diff: function [
    "Returns shortest signed angular difference from b1 to b2 in degrees, range (-180, 180]."
    b1 [integer! decimal!]
    b2 [integer! decimal!]
][
    angle:  b2 - b1 % 360
    case [
        angle < -180 [ angle: angle + 360 ]
        angle >= 180 [ angle: angle - 360 ]
    ]
    angle
]

foreach [b1 b2] [
     20.00      45.00 ;=   25.00
    -45.00      45.00 ;=   90.00
    -85.00      90.00 ;=  175.00
    -95.00      90.00 ;= -175.00
    -45.00     125.00 ;=  170.00
    -45.00     145.00 ;= -170.00
     29.48     -88.64 ;= -118.12
    -78.33    -159.04 ;=  -80.71
 -70099.74   29840.67 ;= -139.58
-165313.67   33693.99 ;=  -72.34
   1174.84 -154146.66 ;= -161.50
  60175.77   42213.07 ;=   37.30
][
    printf ["b1: " 12 " b2: " 12 "angle diff b2 - b1 = " /green -6.1 /reset][
        b1 b2 angle-diff b1 b2
    ]
]

Output:

b1: 20.0         b2: 45.0        angle diff b2 - b1 =   25.0
b1: -45.0        b2: 45.0        angle diff b2 - b1 =   90.0
b1: -85.0        b2: 90.0        angle diff b2 - b1 =  175.0
b1: -95.0        b2: 90.0        angle diff b2 - b1 = -175.0
b1: -45.0        b2: 125.0       angle diff b2 - b1 =  170.0
b1: -45.0        b2: 145.0       angle diff b2 - b1 = -170.0
b1: 29.48        b2: -88.64      angle diff b2 - b1 = -118.1
b1: -78.33       b2: -159.04     angle diff b2 - b1 =  -80.7
b1: -70099.74    b2: 29840.67    angle diff b2 - b1 = -139.6
b1: -165313.67   b2: 33693.99    angle diff b2 - b1 =  -72.3
b1: 1174.84      b2: -154146.66  angle diff b2 - b1 = -161.5
b1: 60175.77     b2: 42213.07    angle diff b2 - b1 =   37.3