;;;; solve-triangle.lisp (defpackage #:solve-triangle (:use :cl) (:export #:solve-asa #:solve-ssa)) (in-package #:solve-triangle) ;; SAA, ASA -- Law of Sines ;; SSA -- Law of Sines, (or 0 1 2) solutions ;; SAS -- Law of Cosines ;; SSS -- Law of Cosines (defun solve-asa (anglea sidea angleb) "Solve a ASA triangle using the method of sines. Angles assumed to be in degrees." (let* ((anglec (- 180 anglea angleb)) (sideb (/ (* (sin angleb) sidea) (sin anglea))) (sidec (/ (* (sin anglec) sidea) (sin anglea)))) (list :angle-a anglea :angle-b angleb :angle-c anglec :side-a sidea :side-b sideb :side-c sidec))) (defun solve-ssa (sidea sideb anglea) "Solve an SSA triangle using the method of sines. Angles are assumed to be in degrees." (let ((angleb (asin (/ (* sideb (sin anglea)) sidea)))) (cond ((< 1 angleb) nil) (()))) (let* ((angleb (asin (/ (* sideb (sin anglea)) sidea))) (anglec (- 180 anglea angleb)) (sidec (/ (* (sin anglec) sidea) (sin anglea)))) (list :angle-a anglea :angle-b angleb :angle-c anglec :side-a sidea :side-b sideb :side-c sidec)))