Rebol3 Code Examplex


Angles (geometric), normalization and conversion

Normalize angles and convert between units or representations.

Rebol [
    title: "Rosetta code: Angles (geometric), normalization and conversion"
    file:  %"Angles_(geometric),_normalization_and_conversion.r3"
    url:   https://rosettacode.org/wiki/Angles_%28geometric%29%2C_normalization_and_conversion
]

convert-angle: function/with [
    "Convert a numeric angle value from one unit to another."
    value [number!]  "The angle value to convert"
    src   [any-word!] "Source unit: 'degrees, 'gradians, 'mils, or 'radians"
    tgt   [any-word!] "Target unit: 'degrees, 'gradians, 'mils, or 'radians"
][
    (remainder (value * turns/:src) 1) / turns/:tgt
][
    turns: compose [
        degrees:  (1 / 360)
        gradians: (1 / 400)
        mils:     (1 / 6400)
        radians:  (0.5 / pi)
    ]
]

tests: reduce [-2 -1 0 1 2 (2 * pi) 16 57.2957795 359 399 6399 1000000]
units: [degrees gradians mils radians] 

print "    angle unit          degrees   gradians       mils    radians"
foreach value tests [
    foreach unit units [
        prin format [-9 SP 10][value unit]
        foreach tgt units [
            prin format ["  " -9] convert-angle value unit tgt
        ]
        print ""
    ]
    print ""
]

Output:

    angle unit          degrees   gradians       mils    radians
       -2 degrees          -2.0  -2.222222  -35.55555  -0.034906
       -2 gradians         -1.8       -2.0      -32.0  -0.031415
       -2 mils          -0.1125     -0.125       -2.0  -0.001963
       -2 radians     -114.5915  -127.3239  -2037.183       -2.0

       -1 degrees          -1.0  -1.111111  -17.77777  -0.017453
       -1 gradians         -0.9       -1.0      -16.0  -0.015707
       -1 mils         -0.05625    -0.0625       -1.0  -0.000981
       -1 radians     -57.29577  -63.66197  -1018.591       -1.0

        0 degrees           0.0        0.0        0.0        0.0
        0 gradians          0.0        0.0        0.0        0.0
        0 mils              0.0        0.0        0.0        0.0
        0 radians           0.0        0.0        0.0        0.0

        1 degrees           1.0  1.1111111  17.777777  0.0174532
        1 gradians          0.9        1.0       16.0  0.0157079
        1 mils          0.05625     0.0625        1.0  0.0009817
        1 radians     57.295779  63.661977  1018.5916        1.0

        2 degrees           2.0  2.2222222  35.555555  0.0349065
        2 gradians          1.8        2.0       32.0  0.0314159
        2 mils           0.1125      0.125        2.0  0.0019634
        2 radians     114.59155  127.32395  2037.1832        2.0

6.2831853 degrees     6.2831853  6.9813170  111.70107  0.1096622
6.2831853 gradians    5.6548667  6.2831853  100.53096  0.0986960
6.2831853 mils        0.3534291  0.3926990  6.2831853  0.0061685
6.2831853 radians           0.0        0.0        0.0        0.0

       16 degrees          16.0  17.777777  284.44444  0.2792526
       16 gradians         14.4       16.0      256.0  0.2513274
       16 mils              0.9        1.0       16.0  0.0157079
       16 radians     196.73247  218.59163  3497.4661  3.4336293

57.295779 degrees     57.295779  63.661977  1018.5916  0.9999999
57.295779 gradians    51.566201  57.295779  916.73247  0.8999999
57.295779 mils        3.2228875  3.5809862  57.295779  0.0562499
57.295779 radians     42.806349  47.562610  761.00176  0.7471117

      359 degrees         359.0  398.88888  6382.2222  6.2657320
      359 gradians        323.1      359.0     5744.0  5.6391588
      359 mils         20.19375    22.4375      359.0  0.3524474
      359 radians     49.184845  54.649827  874.39724  0.8584374

      399 degrees          39.0  43.333333  693.33333  0.6806784
      399 gradians        359.1      399.0     6384.0  6.2674773
      399 mils         22.44375    24.9375      399.0  0.3917173
      399 radians     181.01602  201.12891  3218.0626  3.1593256

     6399 degrees     279.00000  310.00000  4960.0000  4.8694686
     6399 gradians        359.1      399.0     6384.0  6.2674773
     6399 mils        359.94375   399.9375     6399.0  6.2822035
     6399 radians     155.69310  172.99233  2767.8774  2.7173572

  1000000 degrees     280.00000  311.11111  4977.7777  4.8869219
  1000000 gradians          0.0        0.0        0.0        0.0
  1000000 mils             90.0      100.0     1600.0  1.5707963
  1000000 radians     339.51308  377.23675  6035.7881  5.9256211