RosettaCodeData/Task/Angles-geometric-normalization-and-conversion/Red/angles-geometric-normalization-and-conversion.red
2026-04-30 12:34:36 -04:00

76 lines
2 KiB
Text

angle: object [
;- internal value is stored in mil
internal-value: none
set-value: func [arg1 /turn /degre /gradian /mil /radian ]
[
if turn [
if (arg1 < -1) or (arg1 > 1) [ cause-error 'user 'message "turn must be >= -1 and <= 1"]
self/internal-value: (arg1 * 6400)
]
if degre [
if (arg1 < -360) or ( arg1 > 360) [cause-error 'user 'message "degre must be >= -360 and <= 360"]
self/internal-value: ( arg1 / 360 ) * 6400
]
if gradian [
if (arg1 < -400) or (arg1 > 400) [cause-error 'user 'message "gradian must be >= -400 and <= 400"]
self/internal-value: ((arg1 / 400) * 6400)
]
if mil [
if (arg1 < -6400) or (arg1 > 6400) [ cause-error 'user 'message "mil must be >= -6400 and <= 6400"]
self/internal-value: arg1
]
if radian [
if (arg1 < (-2 * pi) ) or (arg1 > (2 * pi)) [cause-error 'user 'message "radian must be >= -2*PI and <= 2*PI"]
self/internal-value: ( arg1 * ( 1 / pi / 2) * 6400)
]
]
get-value: func [ /turn /degre /gradian /mil /radian ]
[
if turn [
return (self/internal-value / 6400)
]
if degre [
return (self/internal-value / 6400 ) * 360
]
if gradian [
return (( self/internal-value * 400) / 6400)
]
if mil [
return self/internal-value
]
if radian [
return (self/internal-value / ( ( 1 / pi / 2) * 6400))
]
]
]
;- test setters and getter
angle-turn: copy angle
angle-turn/set-value/turn 1
print angle-turn/get-value/turn
angle-degre: copy angle
angle-degre/set-value/degre 180
print angle-degre/get-value/degre
angle-gradian: copy angle
angle-gradian/set-value/gradian 100
print angle-gradian/get-value/gradian
angle-mil: copy angle
angle-mil/set-value/mil 10
print angle-mil/get-value/mil
angle-rad: copy angle
angle-rad/set-value/radian pi
print ( angle-rad/get-value/radian ) / pi
;- test normalization
angle-turn/set-value/turn -0.5
print angle-turn/get-value/turn
;-test conversions
print angle-turn/get-value/degre
print angle-turn/get-value/gradian
print angle-turn/get-value/mil
print (angle-turn/get-value/radian) / pi