22 lines
658 B
Common Lisp
22 lines
658 B
Common Lisp
(defun average (list)
|
|
(/ (reduce #'+ list) (length list)))
|
|
|
|
(defun radians (angle)
|
|
(* pi 1/180 angle))
|
|
|
|
(defun degrees (angle)
|
|
(* (/ 180 pi) angle))
|
|
|
|
(defun mean-angle (angles)
|
|
(let* ((angles (map 'list #'radians angles))
|
|
(cosines (map 'list #'cos angles))
|
|
(sines (map 'list #'sin angles)))
|
|
(degrees (atan (average sines) (average cosines)))))
|
|
|
|
(loop for angles in '((350 10) (90 180 270 360) (10 20 30))
|
|
do (format t "~&The mean angle of ~a is ~$°." angles (mean-angle angles)))
|
|
|
|
;; or using complex numbers (cis and phase)
|
|
|
|
(defun mean-angle-2 (angles)
|
|
(degrees (phase (reduce #'+ angles :key (lambda (deg) (cis (radians deg)))))))
|