pub struct EffectsV1 {
pub magnus: Option<bool>,
pub coriolis: Option<bool>,
pub enhanced_spin_drift: Option<bool>,
pub wind_shear_model: Option<WindShearModelV1>,
pub aerodynamic_jump: Option<bool>,
}Expand description
Optional physical effects supported by solve-json v1.
Fields§
§magnus: Option<bool>§coriolis: Option<bool>§enhanced_spin_drift: Option<bool>§wind_shear_model: Option<WindShearModelV1>Altitude-dependent wind shear model (0.36.0). None (the omitted-field default, and
every request from before this field existed) means no shear at all — byte-identical
to pre-0.36.0 behavior, exactly as an explicit "none" solves. The model is echoed at
ResolvedEffectsV1::wind_shear_model whenever the raw request supplies one,
including an explicit "none".
An unrecognized model name is an invalid_value error at
$.effects.wind_shear_model, never a silent fall back to no shear: a typo’d model
must not quietly produce unsheared numbers that look like sheared ones.
aerodynamic_jump: Option<bool>Crosswind aerodynamic (gyroscopic) jump, as a muzzle launch-angle perturbation
(MBA-959). None — the omitted-field default, and every request from before this
field existed — means no jump, byte-identical to earlier behavior.
EXPERIMENTAL, and the bridge says so: enabling it raises an experimental_effect
warning, the same as magnus and enhanced_spin_drift. The model is Bryan Litz’s
regression Y = 0.01*Sg - 0.0024*L + 0.032 MOA per mph of crosswind, a fit that is
best near Sg ~ 1.75 rather than a first-principles derivation.
Two consequences a caller has to know, because neither is visible in the numbers:
the jump is VERTICAL and is computed from the crosswind AT THE MUZZLE, so a shot with
no crosswind there is unaffected however much wind it meets downrange; and its
magnitude is a function of stability, so it reads rifle.twist_rate_m_per_turn and
projectile.length_m. Omitting either does not disable the correction — it computes
one from an assumed barrel, which is why enabling this flag without them raises
aerodynamic_jump_assumed_geometry.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for EffectsV1
impl<'de> Deserialize<'de> for EffectsV1
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for EffectsV1
impl StructuralPartialEq for EffectsV1
Auto Trait Implementations§
impl Freeze for EffectsV1
impl RefUnwindSafe for EffectsV1
impl Send for EffectsV1
impl Sync for EffectsV1
impl Unpin for EffectsV1
impl UnsafeUnpin for EffectsV1
impl UnwindSafe for EffectsV1
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.