cl-ballistics.lisp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. ;;;; cl-ballistics.lisp
  2. (in-package #:cl-ballistics)
  3. ;;; "cl-ballistics" goes here. Hacks and glory await!
  4. ;;; Constant definitions
  5. (defconstant +gravity+ -32.194)
  6. (defconstant +standard-pressure+ 29.92)
  7. ;;; Atmospheric Functions
  8. (defun calc-fp (pressure)
  9. (declare (rational pressure))
  10. (/ (- pressure +standard-pressure+) +standard-pressure+))
  11. (defun calc-fr (temperature pressure relative-humidity)
  12. (declare (rational temperature pressure relative-humidity))
  13. (let ((vpw (- (* 4e-6 (expt temperature 3))
  14. (+ (* 4e-4 (expt temperature 2))
  15. (* 0.0234 temperature))
  16. 0.2517)))
  17. (* 0.995
  18. (/ pressure (* (- pressure 0.3783)
  19. relative-humidity
  20. vpw)))))
  21. (defun calc-ft (temperature altitude)
  22. (declare (rational temperature altitude))
  23. (let ((tstd (+ (* -0.0036 altitude) 59)))
  24. (/ (- temperature tstd)
  25. (- 459.6 tstd))))
  26. (defun calc-fa (altitude)
  27. (declare (rational altitude))
  28. (/ 1 (+ (* -4e-15 (expt altitude 3))
  29. (* 4e-10 (expt altitude 2))
  30. (* -3e-5 altitude)
  31. 1)))
  32. (defun atmospheric-correction (drag-coefficient altitude pressure temperature relative-humidity)
  33. (declare (rational drag-coefficient altitude pressure temperature relative-humidity))
  34. (let* ((altitude-correction (calc-fa altitude))
  35. (temperature-correction (calc-ft temperature altitude))
  36. (humidity-correction (calc-fr temperatuer pressure relative-humidity))
  37. (pressure-correction (calc-fp pressure))
  38. (correction-factor (* altitude-correction
  39. (- (+ 1 temperature-correction)
  40. pressure-correction)
  41. humidity-correction)))
  42. (* drag-coefficient correction-factor)))
  43. (export 'atmospheric-correction)
  44. ;;; Angular conversion functions
  45. ;; degree-to-moa : *60
  46. ;; degree-to-radian : * (π / 180)
  47. ;; moa-to-degree : / 60
  48. ;; moa-to-radian : / 60 * (π / 180)
  49. ;; radian-to-degree : * (180 / π)
  50. ;; radian-to-moa : * 60 * (180 / π)