cl-ballistics.lisp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. (defconstant +to-radians+ (/ pi 180))
  8. (defconstant +to-degrees+ (/ 180 pi))
  9. (defconstant +standard-altitude+ 0)
  10. (defconstant +standard-temperature+ 32)
  11. (defconstant +standard-humidity+ 1)
  12. ;;; Atmospheric Functions
  13. (defun calc-fp (pressure)
  14. (declare (real pressure))
  15. (/ (- pressure +standard-pressure+) +standard-pressure+))
  16. (defun calc-fr (temperature pressure relative-humidity)
  17. (declare (real temperature pressure relative-humidity))
  18. (let ((vpw (- (* 4e-6 (expt temperature 3))
  19. (+ (* 4e-4 (expt temperature 2))
  20. (* 0.0234 temperature))
  21. 0.2517)))
  22. (* 0.995
  23. (/ pressure (* (- pressure 0.3783)
  24. relative-humidity
  25. vpw)))))
  26. (defun calc-ft (temperature altitude)
  27. (declare (real temperature altitude))
  28. (let ((tstd (+ (* -0.0036 altitude) 59)))
  29. (/ (- temperature tstd)
  30. (- 459.6 tstd))))
  31. (defun calc-fa (altitude)
  32. (declare (real altitude))
  33. (/ 1 (+ (* -4e-15 (expt altitude 3))
  34. (* 4e-10 (expt altitude 2))
  35. (* -3e-5 altitude)
  36. 1)))
  37. (defun atmospheric-correction (drag-coefficient &optional (altitude +standard-altitude+) (pressure +standard-pressure+) (temperature +standard-temperature+) (relative-humidity +standard-humidity+))
  38. (declare (real drag-coefficient altitude pressure temperature relative-humidity))
  39. (let* ((altitude-correction (calc-fa altitude))
  40. (temperature-correction (calc-ft temperature altitude))
  41. (humidity-correction (calc-fr temperature pressure relative-humidity))
  42. (pressure-correction (calc-fp pressure))
  43. (correction-factor (* altitude-correction
  44. (- (+ 1 temperature-correction)
  45. pressure-correction)
  46. humidity-correction)))
  47. (* drag-coefficient correction-factor)))
  48. (export 'atmospheric-correction)
  49. ;;; G-function retardation
  50. ;;; Angular conversion functions
  51. (defun degrees-to-moa (degrees)
  52. (declare (real degrees))
  53. (* degrees 60))
  54. (defun degrees-to-radians (degrees)
  55. (declare (real degrees))
  56. (* degrees +to-radians+))
  57. (defun moa-to-degrees (moa)
  58. (declare (real moa))
  59. (/ moa 60))
  60. (defun moa-to-radians (moa)
  61. (declare (real moa))
  62. (degrees-to-radians (moa-to-degrees moa)))
  63. (defun radians-to-degrees (radians)
  64. (declare (real radians))
  65. (* radians +to-degrees+))
  66. (defun radians-to-moa (radians)
  67. (declare (real radians))
  68. (degrees-to-moa (radians-to-degrees radians)))
  69. (export '(degrees-to-moa
  70. degrees-to-radians
  71. moa-to-degrees
  72. moa-to-radians
  73. radians-to-degrees
  74. radians-to-moa))
  75. ;;; Windage functions
  76. (defun windage (wind-speed vi xx tv)
  77. (declare (real wind-speed vi xx tv))
  78. (let ((wind-speed-inches-per-second (* wind-speed 17.60)))
  79. (* wind-speed-inches-per-second (/ (- tv xx) vi))))
  80. (defun head-wind (wind-speed wind-angle)
  81. (declare (real wind-speed wind-angle))
  82. (* (cos (degrees-to-radians wind-angle))
  83. wind-speed))
  84. (defun cross-wind (wind-speed wind-angle)
  85. (* (sin (degrees-to-radians wind-angle))
  86. wind-speed))
  87. (export '(windage
  88. head-wind
  89. cross-wind))
  90. ;;; Bore angle functions
  91. ;;; Solving
  92. ;;; Retrieving Data