ballistics_engine/
form_factor.rs1use crate::DragModel;
10
11pub fn get_default_form_factor(bullet_name: &str, drag_model: &DragModel) -> f64 {
13 let name_upper = bullet_name.to_uppercase();
14
15 match drag_model {
16 DragModel::G1 => {
17 if name_upper.contains("MATCH")
18 || name_upper.contains("SMK")
19 || name_upper.contains("SCENAR")
20 || name_upper.contains("BERGER")
21 {
22 0.90 } else if name_upper.contains("VLD")
24 || name_upper.contains("HYBRID")
25 || name_upper.contains("ELD")
26 {
27 0.85 } else if name_upper.contains("FMJ") {
29 1.10 } else if name_upper.contains("HUNT") || name_upper.contains("SP") {
31 1.05 } else {
33 1.00 }
35 }
36 DragModel::G7 => {
37 if name_upper.contains("MATCH")
38 || name_upper.contains("SMK")
39 || name_upper.contains("SCENAR")
40 {
41 0.95 } else if name_upper.contains("VLD") || name_upper.contains("HYBRID") {
43 0.90 } else if name_upper.contains("FMJ") {
45 1.15 } else {
47 1.05 }
49 }
50 _ => 1.00, }
52}
53
54pub fn apply_form_factor_to_drag(
56 cd_base: f64,
57 bullet_name: Option<&str>,
58 drag_model: &DragModel,
59 use_form_factor: bool,
60) -> f64 {
61 if !use_form_factor {
62 return cd_base;
63 }
64
65 let form_factor = if let Some(name) = bullet_name {
67 get_default_form_factor(name, drag_model)
68 } else {
69 1.0 };
71
72 cd_base * form_factor
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn test_g1_form_factors() {
82 let drag_model = DragModel::G1;
83
84 assert_eq!(get_default_form_factor("168gr SMK", &drag_model), 0.90);
86 assert_eq!(get_default_form_factor("Berger Match", &drag_model), 0.90);
87 assert_eq!(get_default_form_factor("Lapua Scenar", &drag_model), 0.90);
88
89 assert_eq!(get_default_form_factor("VLD Target", &drag_model), 0.85);
91 assert_eq!(get_default_form_factor("ELD-X", &drag_model), 0.85); assert_eq!(get_default_form_factor("Hybrid OTM", &drag_model), 0.85); assert_eq!(get_default_form_factor("M855 FMJ", &drag_model), 1.10);
96
97 assert_eq!(get_default_form_factor("Hunting SP", &drag_model), 1.05);
99
100 assert_eq!(get_default_form_factor("Generic Bullet", &drag_model), 1.00);
102 }
103
104 #[test]
105 fn test_g7_form_factors() {
106 let drag_model = DragModel::G7;
107
108 assert_eq!(get_default_form_factor("175gr SMK", &drag_model), 0.95);
110
111 assert_eq!(get_default_form_factor("VLD Hunting", &drag_model), 0.90);
113
114 assert_eq!(get_default_form_factor("147gr FMJ", &drag_model), 1.15);
116
117 assert_eq!(get_default_form_factor("Generic", &drag_model), 1.05);
119 }
120
121 #[test]
122 fn test_apply_form_factor() {
123 let cd_base = 0.5;
124 let drag_model = DragModel::G1;
125
126 let cd_with_ff = apply_form_factor_to_drag(cd_base, Some("168gr SMK"), &drag_model, true);
128 assert_eq!(cd_with_ff, 0.5 * 0.90); let cd_without_ff =
132 apply_form_factor_to_drag(cd_base, Some("168gr SMK"), &drag_model, false);
133 assert_eq!(cd_without_ff, 0.5);
134
135 let cd_no_name = apply_form_factor_to_drag(cd_base, None, &drag_model, true);
137 assert_eq!(cd_no_name, 0.5); }
139
140 #[test]
141 fn test_case_insensitive() {
142 let drag_model = DragModel::G1;
143
144 assert_eq!(get_default_form_factor("smk", &drag_model), 0.90);
146 assert_eq!(get_default_form_factor("SMK", &drag_model), 0.90);
147 assert_eq!(get_default_form_factor("SmK", &drag_model), 0.90);
148 }
149}