Jelajahi Sumber

Started writing the atmospheric adjustment functions

Samuel W. Flint 9 tahun lalu
induk
melakukan
7593a2bf92
1 mengubah file dengan 56 tambahan dan 0 penghapusan
  1. 56 0
      cl-ballistics.lisp

+ 56 - 0
cl-ballistics.lisp

@@ -4,3 +4,59 @@
 
 ;;; "cl-ballistics" goes here. Hacks and glory await!
 
+;;; Constant definitions
+(defconstant +gravity+ -32.194)
+
+(defconstant +standard-pressure+ 29.92)
+
+;;; Atmospheric Functions
+
+(defun calc-fp (pressure)
+  (declare (rational pressure))
+  (/ (- pressure +standard-pressure+) +standard-pressure+))
+
+(defun calc-fr (temperature pressure relative-humidity)
+  (declare (rational temperature pressure relative-humidity))
+  (let ((vpw (- (* 4e-6 (expt temperature 3))
+                (+ (* 4e-4 (expt temperature 2))
+                   (* 0.0234 temperature))
+                0.2517)))
+    (* 0.995
+       (/ pressure (* (- pressure 0.3783)
+                      relative-humidity
+                      vpw)))))
+
+(defun calc-ft (temperature altitude)
+  (declare (rational temperature altitude))
+  (let ((tstd (+ (* -0.0036 altitude) 59)))
+    (/ (- temperature tstd)
+       (- 459.6 tstd))))
+
+(defun calc-fa (altitude)
+  (declare (rational altitude))
+  (/ 1 (+ (* -4e-15 (expt altitude 3))
+          (* 4e-10 (expt altitude 2))
+          (* -3e-5 altitude)
+          1)))
+
+(defun atmospheric-correction (drag-coefficient altitude pressure temperature relative-humidity)
+  (declare (rational drag-coefficient altitude pressure temperature relative-humidity))
+  (let* ((altitude-correction (calc-fa altitude))
+         (temperature-correction (calc-ft temperature altitude))
+         (humidity-correction (calc-fr temperatuer pressure relative-humidity))
+         (pressure-correction (calc-fp pressure))
+         (correction-factor (* altitude-correction
+                               (- (+ 1 temperature-correction)
+                                  pressure-correction)
+                               humidity-correction)))
+    (* drag-coefficient correction-factor)))
+
+(export 'atmospheric-correction)
+
+;;; Angular conversion functions
+;; degree-to-moa : *60
+;; degree-to-radian :  * (π / 180)
+;; moa-to-degree : / 60
+;; moa-to-radian : / 60 * (π / 180)
+;; radian-to-degree : * (180 / π)
+;; radian-to-moa : * 60 * (180 / π)