#] #] ********************* #] loaddefs link d_Qndfs 'math - trigonometry.ndf' # October 2007 initial, 18Jan2021 added reduceAngel f_trigonometry := 'math - trigonometry.ndf' ; loaddefs_start f_trigonometry ; #****************************** #] +-----+ #] Given [sin, cos] what is the angle? # Angles - given cos, sin, tan, what is the angle? # don't use arctan - gives wrong answers!! IF flag_debug THEN write '+-----+' ; ENDIF ; IF flag_debug THEN write 'Given [sin, cos] what is the angle' ; ENDIF ; # loaddefs link d_Qndfs 'math - trigonometry.ndf' IF flag_debug THEN write 'loading arc_sin_cos' ; ENDIF ; #] arc_sin_cos IS OP sin cos - arc_sin_cos IS OP sin cos { arctan_bad := arctan (/ sin cos) ; IF AND (sin < 0) (cos < 0) THEN arctan_g := arctan_bad + pi ; ELSEIF AND (sin < 0) (cos > 0) THEN arctan_g := arctan_bad + (2 * pi) ; ELSEIF AND (sin > 0) (cos < 0) THEN arctan_g := arctan_bad + pi ; ELSEIF AND (sin > 0) (cos > 0) THEN arctan_g := arctan_bad ; ENDIF ; arctan_g } # Example y_deg := 30 60 90 120 150 180 210 240 270 300 330 360 ; y := y_deg / 180 * pi ; y_sin := sin y ; y_cos := cos y ; y_tan := tan y ; y_arctan := arctan y_tan ; y_myTan := EACHBOTH arc_sin_cos y_sin y_cos ; zz := transpose mix y_deg y_sin y_cos y_tan y y_arctan y_myTan ; IF flag_debug THEN write 'loading arc_cos_sin' ; ENDIF ; #] arc_cos_sin IS OP cos sin arc_cos_sin IS OP cos sin { angle := arctan (sin / cos) ; IF and (cos >= 0) (sin < 0) THEN angle := angle + (2 * pi) ; ENDIF ; IF and (cos < 0) (sin >= 0) THEN angle := angle + pi ; ENDIF ; IF and (cos < 0) (sin < 0) THEN angle := angle + pi ; ENDIF ; angle } # loaddefs link d_Qndfs 'math - trigonometry.ndf' #****************************** #] +-----+ #] What is the minimu equivalent angle +-PI? 18Jan2021 initial IF flag_debug THEN write '+-----+' ; ENDIF ; IF flag_debug THEN write 'What is the minimu equivalent angle +-PI?' ; ENDIF ; # loaddefs link d_Qndfs 'math - trigonometry.ndf' IF flag_debug THEN write 'loading reduceAngle' ; ENDIF ; #] reduceAngle IS OP angle - minimize the angle (radians) reduceAngle IS OP angle { PI2_floor := floor (2 * PI * 1e5) ; angle_floor := floor (angle * 1e5) ; anglePI := (mod angle_floor PI2_floor) / 1e5 ; IF (anglePI > PI) THEN anglePI - (2*PI) ELSE anglePI ENDIF } IF flag_debug THEN write 'loading reduceAngle_test' ; ENDIF ; #] reduceAngle_test IS - reduceAngle_test IS { LOCAL angle calc std ; write 'reduceAngle_test IS OP angleRadians' ; write ( 7 4 reshape 'angle' 'std' 'calc' 'comment' (angle := 2 *pi) (std := 0 ) (calc := reduceAngle angle) (IF ((std - calc) < 0.001) THEN 'OK' ELSE 'fail' ENDIF) (angle := 1.5 ) (std := 1.5 ) (calc := reduceAngle angle) (IF ((std - calc) < 0.001) THEN 'OK' ELSE 'fail' ENDIF) (angle := 1.8 *pi) (std := -0.628325 ) (calc := reduceAngle angle) (IF ((std - calc) < 0.001) THEN 'OK' ELSE 'fail' ENDIF) (angle := 3 *pi) (std := 3.14159 ) (calc := reduceAngle angle) (IF ((std - calc) < 0.001) THEN 'OK' ELSE 'fail' ENDIF) (angle := 0.1 *pi) (std := 0.314159 ) (calc := reduceAngle angle) (IF ((std - calc) < 0.001) THEN 'OK' ELSE 'fail' ENDIF) (angle := -0.1 *pi) (std := -0.314159 ) (calc := reduceAngle angle) (IF ((std - calc) < 0.001) THEN 'OK' ELSE 'fail' ENDIF) ) ; } loaddefs_ended f_trigonometry ; # enddoc