RikaNV Reference Ballistic Calculator

v0.0.0 · build

Results

Drop
Drift (total)
Time of flight
Stability SG
Energy at target
at target

Trajectory

Drop table

Distance, m Drop, mil (Adv) Drop, mil (Simple) Drift, cm (Adv) Drift, cm (Simple) Velocity, m/s Mach Time, s Energy, J

What the "(Simple)" columns show

Every row carries two values for drop and drift — one from the Advanced engine (everything you entered: wind, atmosphere, Coriolis, spin drift, dynamic BC) and one from the Simple engine. The Simple column is a deliberately stripped-down algorithm: only gravity + drag at ICAO sea-level standard. Side-by-side they show how much the corrections actually buy you at each range.

📘 Exactly what Simple does (and does not) include

Inputs the Simple algorithm uses

  • Bullet: drag profile, ballistic coefficient (BC), muzzle velocity, mass (for kinetic-energy figure).
  • Target distance, zero distance, sight height.
  • Slant angle — uphill/downhill. Applied as rifleman's-rule gravity scaling (cos(slant)); irrelevant on level shots.

What the Simple algorithm does

  • Integrates with two forces only: drag (your drag profile at the local Mach) + gravity (scaled by cos(slant)).
  • Air density and speed of sound are constants: ρ = 1.225 kg/m³, c ≈ 340.27 m/s — ICAO sea level, never varied.
  • Zero is found by Newton iteration on a level range — zeroing assumes horizontal gravity.

What Simple does not include

  • Wind
  • Earth Coriolis
  • Spin drift (Litz formula)
  • Dynamic BC (Mach-dependent correction)
  • Atmospheric variation (humidity, pressure, altitude, temperature)
  • Miller spin stability

The Simple algorithm is intentionally not just "Advanced with toggles off" — it's a separate, simpler code path. That makes its outputs trivially auditable (every number in the Simple column traces to src/engine/SimpleBallisticEngine.ts) and lets a hand-held device run it cheaply for short-range shots.

Что показывают колонки «(Simple)»

В каждой строке таблицы — два значения снижения и сноса. Одно от Advanced движка (полная физика: всё что вы ввели — ветер, атмосфера, Кориолис, деривация, динамический BC), второе от Simple. Simple — это намеренно упрощённый алгоритм: только гравитация и drag в стандартной атмосфере ICAO на уровне моря. Сравнение строкой показывает, насколько корректировки реально что-то меняют на каждой дистанции.

📘 Что именно использует Simple и чего в нём НЕТ

Что использует Simple

  • Пуля: drag-профиль, баллистический коэффициент (БК), начальная скорость, масса (для расчёта энергии у цели).
  • Дальность до цели, дистанция пристрелки, высота прицела.
  • Угол наклона к цели — стрельба вверх/вниз. Применяется как rifleman's-rule (gравитация × cos(угла)). На горизонтальном выстреле не важен.

Что делает Simple

  • Интегрирует траекторию только с двумя силами: drag (по drag-профилю пули при текущем Маха) и гравитация (масштабируется на cos(угла наклона)).
  • Плотность воздуха и скорость звука — константы: ρ = 1,225 кг/м³ и c ≈ 340,27 м/с (стандарт ICAO на уровне моря). Не меняются.
  • Пристрелка ищется методом Ньютона на горизонтальной дистанции.

Чего в Simple НЕТ

  • Ветра
  • Эффекта Кориолиса
  • Деривации (формула Litz)
  • Динамического БК (поправка по числу Маха)
  • Атмосферных вариаций (влажность, давление, высота, температура)
  • Фактора стабильности Miller

Simple — это не «Advanced с выключенными тумблерами», а отдельный, более простой код. Это позволяет каждое число в колонке Simple проследить до src/engine/SimpleBallisticEngine.ts, и даёт возможность ручному устройству считать его дёшево для коротких дистанций.

"(Simple)"列显示什么

表中每一行都带两个下沉和偏移值——一个来自Advanced引擎(您输入的全部内容:风、大气、科里奥利、自旋偏移、动态 BC),另一个来自Simple引擎。Simple 是一个有意精简的算法:仅有重力 + 阻力,在 ICAO 海平面标准大气下。并排比较显示每个距离上各种修正实际带来多大差异。

📘 Simple 究竟使用什么(不使用什么)

Simple 算法的输入

  • 子弹:阻力模型、弹道系数(BC)、初速、质量(用于动能数值)。
  • 目标距离、校准距离、瞄准镜高度。
  • 倾斜角度——上坡/下坡。按 rifleman's-rule(重力 × cos(角度))应用;水平射击无关。

Simple 算法做什么

  • 仅在两种力下积分:阻力(您的阻力曲线在当前马赫数)+ 重力(按 cos(倾角) 缩放)。
  • 空气密度和声速为常数:ρ = 1.225 kg/m³,c ≈ 340.27 m/s——ICAO 海平面,永不变化。
  • 校零由水平距离上的牛顿法求解。

Simple 包括

  • 地球科里奥利效应
  • 自旋偏移(Litz 公式)
  • 动态 BC(与马赫数相关的修正)
  • 大气变化(湿度、气压、海拔、温度)
  • Miller 稳定性

Simple 算法不只是"关闭所有修正的 Advanced"——它是单独的更简单代码路径。这使得 Simple 列中的每个数字都可以追踪到 src/engine/SimpleBallisticEngine.ts,并允许手持设备低成本运行它以应对短距射击。

Multi-BC (Dynamic BC) — how it works in this calculator

Multi-BC describes how the ballistic coefficient of a bullet changes with speed. The "Dynamic BC" toggle in the Corrections section turns on a piecewise-linear correction for the G1 and G7 drag models. Open the block below for the full story.

📘 Multi-BC: what it is, how the calculator handles it, how to use it

What is the ballistic coefficient (BC)

BC is a number that says how well a bullet "punches through air" compared with a reference projectile. The higher the BC, the more slowly the bullet loses velocity and the less it drops downrange. Formula: BC = mass / (diameter² · form_factor), where the form factor is the ratio between the bullet's real drag profile and the reference one.

Why BC is not constant

In reality BC drifts a little with speed. When the bullet crosses the speed of sound (≈ 340 m/s under standard conditions), the flow around it changes dramatically: in supersonic flight a cone of shock waves forms; in subsonic flight the flow is smooth-then-vortex. For most match bullets BC drops by 5–15 % between the muzzle and the moment of crossing the sonic barrier.

A calculator that uses a single BC for the whole trajectory either over- or under-predicts depending on which part of the flight you care about.

Three industry approaches

1. Sierra Multi-BC (G1 + several BC values). Sierra Bullets — the oldest American match-bullet maker — publish not one BC but an array of BC values for different velocity bands. Example for .308 168 grain SMK:

  • above 792 m/s: BC = 0.462
  • 640–792 m/s: BC = 0.447
  • 549–640 m/s: BC = 0.424
  • below 549 m/s: BC = 0.405

The calculator looks up the current velocity at every step and switches BC to the matching band. Accurate at long range. Downside: you need a Sierra catalogue — most other makers publish a single averaged BC.

2. Litz / G7 (one BC, but the right drag model). Bryan Litz (Applied Ballistics) proposed a different fix: use the G7 drag model instead of G1. G7 is a reference projectile shaped more like a modern match bullet — long, slender, boat-tail. Logic: BC drifts with speed mostly because G1 doesn't match modern bullet shapes. If the reference looks like the real bullet, the non-linearity is small and one G7 BC is enough. Today G7 + single BC is the long-range gold standard.

3. Hornady 4DOF / Custom Drag Model. The most accurate approach. Hornady measures the drag curve of every bullet directly with a Doppler radar on real firings — no reference projectile at all. In their 4DOF app there is no "BC" concept — there is a full Cd(M) profile (drag coefficient as a function of Mach number) for each bullet. Downside: only works for bullets Hornady have actually measured.

What this calculator does — piecewise-linear dynamic BC factor

The calculator supports all six standard reference drag models (G1, G2, G5, G6, G7, G8). The Litz approach (G7 + single BC) works out of the box.

On top of that we implement a 4th approach — a piecewise-linear dynamic BC factor. It's not a Sierra-style table of 3–4 BCs and not Hornady's CDM, but a math function that on every integration step adjusts the effective BC depending on the current bullet velocity. Toggle "Dynamic BC" in the Corrections section to enable it.

The function shape — piecewise-linear with separate constants for G1 and G7. For G7 (typical modern match scenario):

  • Above hypersonic threshold (Mach > 2.5) — factor = 1.0 (no correction; faster than typical bullets)
  • Supersonic (1.8–2.5) — factor falls linearly from 1.0 to 0.965 (small correction ~3.5 %)
  • Trans-sonic (1.2–1.8) — factor falls from 0.965 to 0.905 (~6 %)
  • Around the speed of sound (1.0–1.2) — factor drops from 0.905 to 0.87 (sharp zone, ~4 % over a narrow range)
  • Subsonic (Mach < 1.0) — factor ≈ 0.87 (stable correction)

Effect: with the toggle on, the effective BC grows as the bullet slows down (BC_effective = BC_user / factor). This compensates for the drag rise when the bullet crosses the sound barrier and gives more accurate predictions at long range.

Important limitation: the dynamic BC factor is implemented only for G1 and G7. For the other drag models (G2, G5, G6, G8) the toggle does nothing — there are no calibrated constants for them, so the factor would just return 1.0.

Comparison with industry approaches

Our implementation is a hybrid: G1/G7 as base drag models (like Sierra / Litz), but with a piecewise-linear BC correction on top, instead of a switching table over multiple BC values. Lighter than Sierra (no per-bullet table), more accurate than single-BC for long-range work.

Side-by-side:

  • Sierra multi-BC table — 3–4 BC values per bullet, one per velocity band. Very accurate at long range, but you need the manufacturer's data.
  • Litz G7 + single BC — the simplest accurate approach for modern match bullets.
  • Hornady CDM (4DOF) — full drag curve from Doppler radar. Most accurate, but limited to the bullets they measured.
  • Piecewise-linear (this calculator) — middle ground between accuracy and simplicity.

Practical advice

For modern match bullets (.308 SMK, .338 Lapua, 6.5 Creedmoor ELD-M, etc.) — pick G7 drag model, enter the manufacturer's G7 BC, and turn on "Dynamic BC". That gives the best accuracy at long range. At 1000 m for typical sniper combinations the difference between "no dynamic" and "with dynamic" is 15–25 cm of drop — noticeable for point-target shooting.

How Multi-BC works step by step (under the hood)

The calculator uses explicit Euler integration with a fixed downrange step (typically 5 cm at 1000 m target). The trajectory is built as a long sequence of small steps. For an 800 m target that's about 16 000 steps; everything is recomputed at every step.

What happens at each step:

  1. Read current bullet velocity components (vx, vy, vz)
  2. Atmosphere at current altitude (density ρ, speed of sound c)
  3. Mach number: M = v_current / c
  4. Drag coefficient Cd — quadratic interpolation in the drag table (G1, G7, …) at M
  5. If Multi-BC is on: compute the factor from the piecewise formula above and divide Cd by it (effectively raising BC)
  6. Drag acceleration: a_drag = (ρ/ρ_std) · k_const · Cd · v_rel
  7. Gravity: −9.80665 m/s² along y (scaled by cos(slant) if shooting up/downhill)
  8. Coriolis (if enabled): −2 · (ω × v)
  9. Time step: dt = step / vx
  10. Update velocity: v_new = v − dt · (a_drag + a_grav + a_cor)
  11. Update position: pos_new = pos + dt · v_new (semi-implicit Euler)
  12. Accumulate TOF: TOF += dt

Concrete example — .308 168 gr SMK at 800 m (G7 BC = 0.218, MV = 817 m/s, standard atmosphere):

Distance v_current (m/s) Mach factor (G7) Drop, no Multi-BC Drop, with Multi-BC Δ
100 m7582.220.986−10 cm−10 cm~0
300 m6701.970.973−84 cm−83 cm+1 cm
500 m5931.750.960−255 cm−250 cm+5 cm
700 m5241.550.940−551 cm−535 cm+16 cm
800 m4921.460.931−748 cm−722 cm+26 cm

Note the trend: at 100 m the factor is 0.986 (~1.4 % correction); at 800 m it's already 0.931 (~7 %). As the bullet slows down and gets closer to Mach 1, the correction grows.

Where the correction works hardest, in terms of Mach:

  • Above Mach 2.5 — factor = 1.0, no correction (bullet faster than the regime where it matters)
  • Mach 2.5 → 1.0 — factor falls smoothly from 1.0 to ~0.87
  • "Hot zone" — Mach 1.0–1.2 (near the sound barrier): factor drops sharply 0.905 → 0.87. For .308 this is typically 900–1100 m
  • Subsonic (Mach < 1.0) — factor stable at ~0.87

Bottom line: Multi-BC is most useful past 500 m. At shorter distances it barely matters. At 1000 m+ it gives typically 40–50 cm of drop correction for the .308 class.

📐 Why drop = 0 at the zero distance (and why some other calculators show −0.1 cm)

What you see in our table

At the zero distance you set (say, 100 m) the Drop column reads 0.0 cm / 0.00 mil. That is what physically happens at the range: you crank the scope until the bullet hits the crosshair, and from that moment on, at that distance, POI = POA by construction. The calculator agrees with that picture.

Why some other calculators show −0.1 cm at the zero distance

If you switch Earth Coriolis on, the bullet's vertical position gets a tiny push along the flight (≈ a millimetre or two at 100 m, growing with distance). Many calculators (including the original Lesnik firmware and our own legacy calculator-corrected.html) find the zero pitch using a simplified physics model — gravity + drag only, no Coriolis, no spin drift. Then the main shot is integrated with the full physics. The leftover ≈ 0.1 cm at the zero distance is the vertical Coriolis term the simplified solver didn't compensate for.

Numerically tiny, but it always bothered users who expect "zero means zero."

What this engine does instead

The zero pitch solver runs the full physics — the same Coriolis and spin-drift models that the main shot uses. The solver iterates the reported drop (raw vertical position + Coriolis vertical offset) to zero, so the burned-in sight angle reflects everything you would mechanically dial out at the range. The result: drop at the zero distance is exactly 0, regardless of which corrections you have enabled.

Trade-off: the burned-in sight angle is now slightly different from the simplified-solver number (by ≈ 0.001°), so downrange drops shift by ≈ 0.5–1 cm at 1000 m and ≈ 1 cm at 2000 m. This is the correct direction — it absorbs Coriolis into the zero rather than pretending it was off during zeroing.

Lateral drift at the zero distance is not 0 — and that is correct

Wind, the horizontal component of Coriolis, and spin drift act on the bullet from the muzzle onwards. By the time it reaches the zero distance, the bullet has drifted laterally by a few millimetres to centimetres. The pitch solver only adjusts vertical aim — it cannot null out horizontal drift. In real shooting you dial windage on a separate knob, on the day, for the conditions at hand.

So at the zero distance: drop = 0, lateral ≠ 0, and both are physically honest.

Reference

The change lives in src/engine/BallisticEngine.ts — the zero solver callback now passes coriolis and drift through, and returns finalState.y + cor.result().dy rather than just finalState.y. Simplified mode (SimpleBallisticEngine) is unaffected: both phases use pure gravity + drag there, so drop at zero was already 0 by construction.

Multi-BC (Dynamic BC) — как работает в этом калькуляторе

Multi-BC — это про то, как баллистический коэффициент пули меняется со скоростью. Тумблер «Динамический БК» в разделе «Поправки» включает piecewise-linear коррекцию для G1 и G7 drag-моделей. Раскрой блок ниже для подробностей.

📘 Multi-BC: что это, как работает в калькуляторе, и как использовать

Что такое баллистический коэффициент (BC)

BC — это число, описывающее насколько хорошо пуля «пробивает воздух» по сравнению с эталонной пулей. Чем больше BC, тем медленнее пуля теряет скорость и меньше падает на дистанции. Формула: BC = масса / (диаметр² × form_factor), где form factor — это отношение реального drag-профиля к эталонному.

Почему BC не постоянен

На самом деле BC чуть-чуть меняется в зависимости от скорости. Когда пуля проходит через скорость звука (~340 м/с при стандартных условиях), форма обтекания радикально меняется: на сверхзвуке формируется конус ударных волн, на дозвуке — обычное вихревое течение. У большинства match-пуль BC падает на 5-15% между начальной скоростью и моментом перехода через звуковой барьер.

Если калькулятор использует один BC на всю траекторию, он либо переоценивает дальность, либо недооценивает её на части траектории.

Три подхода в индустрии

1. Sierra Multi-BC (G1 + несколько BC). Sierra Bullets — старейший американский производитель match-пуль — публикует не одно BC, а массив значений в разных скоростных диапазонах. Пример для .308 168 grain SMK:

  • выше 792 м/с: BC = 0,462
  • 640–792 м/с: BC = 0,447
  • 549–640 м/с: BC = 0,424
  • ниже 549 м/с: BC = 0,405

Калькулятор на каждом шаге смотрит текущую скорость пули и переключает BC на соответствующий диапазон. Это даёт точные предсказания на длинных дистанциях. Минус — работает только если у тебя есть Sierra-каталог; большинство производителей публикуют только одно усреднённое значение.

2. Litz / G7 (один BC, но правильная drag-модель). Bryan Litz (Applied Ballistics) предложил другое решение: использовать drag model G7 вместо G1. G7 — это эталонная пуля более похожей на современную match-пулю формы (длинная и обтекаемая, boat-tail). Логика: BC меняется со скоростью в основном потому что эталон G1 неподходящий для современных пуль. Если эталон похож на реальную пулю — нелинейность маленькая, и одного G7 BC хватает. Сейчас G7 + single BC — золотой стандарт для длинных дистанций.

3. Hornady 4DOF / Custom Drag Model. Самый точный подход. Hornady замеряет drag-кривую каждой пули напрямую через doppler-радар на реальных стрельбах — без эталонной пули вообще. В их 4DOF приложении нет понятия «BC» — есть полный профиль Cd(M) (drag coefficient как функция числа Маха) для каждой пули. Минус — работает только для пуль которые они замерили.

Что в этом калькуляторе — piecewise-linear dynamic BC factor

Калькулятор поддерживает все 6 стандартных drag-моделей (G1, G2, G5, G6, G7, G8). Litz-подход (G7 + single BC) работает «из коробки».

Дополнительно реализован 4-й подход — piecewise-linear dynamic BC factor. Это не Sierra-style таблица из 3-4 BC значений и не Hornady CDM, а математическая функция, которая на каждом шаге интегрирования корректирует эффективный BC в зависимости от текущей скорости пули. Включается тумблером «Динамический БК» в разделе «Поправки».

Форма функции — piecewise-linear (кусочно-линейная) с разными константами для G1 и G7. Для G7 (типичный современный match-сценарий):

  • На гиперзвуке (Mach > 2.5) — factor = 1.0 (нет коррекции, выше типичных скоростей пуль)
  • На сверхзвуке (1.8–2.5) — factor линейно падает с 1.0 до 0.965 (малая коррекция ~3.5%)
  • Trans-sonic (1.2–1.8) — factor падает с 0.965 до 0.905 (~6%)
  • Около звука (1.0–1.2) — factor падает с 0.905 до 0.87 (резкая зона ~4% на узком диапазоне)
  • Дозвук (Mach < 1.0) — factor ≈ 0.87 (стабильная коррекция)

Эффект: при включённой опции эффективный BC растёт по мере замедления пули (BC_effective = BC_user / factor). Это компенсирует увеличение drag при переходе через скорость звука и даёт более точные предсказания на дальних дистанциях.

Важное ограничение: dynamic BC factor реализован только для G1 и G7. Для других drag-моделей (G2, G5, G6, G8) тумблер ничего не делает — для них нет калиброванных констант, factor возвращал бы 1.0.

Сравнение с industry-подходами

Наша реализация — гибрид: G1/G7 как base drag models (как Sierra/Litz), но применяется piecewise-linear correction к BC, а не табличное переключение между несколькими BC значениями. Легче в реализации (нет таблиц BC на каждую пулю) и работает достаточно точно для практических задач.

Если хочешь сравнить с другими подходами:

  • Sierra multi-BC table — 3-4 BC значения на пулю по velocity bands. Точнее на дальних, но требует данных от производителя
  • Litz G7 + single BC — простейший подход, достаточно точный для современных match-пуль
  • Hornady CDM (4DOF) — полная drag curve через doppler-радар. Самый точный, но только для пуль которые Hornady замерили
  • Piecewise-linear (этот калькулятор) — компромисс между точностью и простотой

Практический совет

Для современных match-пуль (.308 SMK, .338 Lapua, 6.5 Creedmoor ELD-M и т.д.) — рекомендую: выбрать G7 drag model + ввести G7 BC от производителя + включить «Динамический БК». Это даст лучшую точность на дальних дистанциях. На 1000 м для типичных снайперских комбинаций разница между «без dynamic» и «с dynamic» составляет 15-25 см drop'a — заметная для стрельбы по точечным целям.

Как именно считается баллистика при включенном Multi-BC (пошагово)

Калькулятор использует метод явного Эйлера с шагом по дистанции (~5 см при цели 1000 м). Это значит траектория считается не «за один раз», а как последовательность маленьких шажков. Для цели на 800 метров — это около 16 000 шагов, на каждом всё пересчитывается заново.

Что происходит на каждом шаге:

  1. Считается текущая скорость пули в трёх осях (vx, vy, vz)
  2. По текущей высоте — атмосферные параметры (плотность ρ, скорость звука c)
  3. Число Маха: M = v_current / c
  4. Коэффициент сопротивления Cd — квадратичная интерполяция по drag-таблице (G1 или G7) по M
  5. Если включен Multi-BC: вычисляется поправочный factor по piecewise-формуле (значения выше), и Cd делится на factor (BC становится «эффективным»)
  6. Drag-ускорение: a_drag = (ρ/ρ_std) × k_const × Cd × v_rel
  7. Гравитационное ускорение: −9,80665 м/с² по y (масштабируется на cos(slant) при стрельбе под наклоном)
  8. Кориолис (если включён): −2·(ω × v)
  9. Time-step: dt = step / vx
  10. Обновляем скорость: v_new = v − dt·(a_drag + a_grav + a_cor)
  11. Обновляем позицию: pos_new = pos + dt·v_new (semi-implicit Euler)
  12. Накапливаем TOF: TOF += dt

Конкретный пример для .308 168 grain SMK на 800 м (G7 BC=0,218, MV=817 м/с, стандартная атмосфера):

Дистанция v_текущая (м/с) Mach factor (G7) Drop без MultiBC Drop с MultiBC Разница
100 м7582,220,986−10 см−10 см~0
300 м6701,970,973−84 см−83 см+1 см
500 м5931,750,960−255 см−250 см+5 см
700 м5241,550,940−551 см−535 см+16 см
800 м4921,460,931−748 см−722 см+26 см

Заметь динамику: на 100 м factor=0,986 (коррекция ~1,4%), на 800 м уже 0,931 (коррекция ~7%). По мере замедления пули и приближения к скорости звука коррекция растёт.

Где «работает» коррекция в зависимости от Mach:

  • На сверхзвуке (M > 2,5) — factor = 1,0, коррекции нет (пуля летит выше типичной зоны)
  • От M = 2,5 до 1,0 — factor плавно падает с 1,0 до ~0,87
  • «Горячая зона» — между M=1,0 и M=1,2 (около звука): factor падает резко с 0,905 до 0,87. Для .308 это типично дистанции 900-1100 м
  • На дозвуке (M < 1,0) — factor стабилен ~0,87

Bottom line: Multi-BC реально полезен на дистанциях больше 500 м. На короткой — почти не влияет. На 1000+ м даёт типично 40-50 см drop-коррекции для .308 класса.

📐 Почему снижение = 0 на дистанции пристрелки (и почему другие калькуляторы показывают −0.1 см)

Что вы видите в нашей таблице

На дистанции пристрелки (например, 100 м) колонка Снижение показывает 0.0 см / 0.00 mil. Это то, что физически происходит на стрельбище: вы крутите барабаны прицела пока пуля не попадает точно в крест, и с этого момента на этой дистанции POI = POA по определению. Калькулятор это и показывает.

Почему другие калькуляторы показывают −0.1 см на пристрелке

Если включить Кориолис, эффект вращения Земли даёт пуле небольшой вертикальный сдвиг по ходу полёта (≈ миллиметр на 100 м, растёт с дистанцией). Многие калькуляторы (включая прошивку Lesnik и наш legacy calculator-corrected.html) ищут угол пристрелки по упрощённой модели — только гравитация и drag, без Кориолиса и деривации. Потом основной выстрел считается по полной модели. Остаток ≈ 0.1 см на пристрелке — это вертикальная компонента Кориолиса, которую упрощённый solver не компенсировал.

Численно крошечно, но всегда раздражало пользователей, которые ожидают «ноль значит ноль».

Что делает этот engine

Solver угла пристрелки работает с полной физикой — теми же моделями Кориолиса и деривации, которые использует основной выстрел. Solver итерирует фактическое снижение (траектория + вертикальный сдвиг Кориолиса) к нулю, так что зашитый в прицел угол отражает ВСЁ, что вы крутили бы рукой на стрельбище. Результат: снижение на дистанции пристрелки = ровно 0, независимо от того, какие поправки включены.

Цена: угол пристрелки немного отличается от значения упрощённого solver'а (на ≈ 0.001°), так что downrange-снижения сдвигаются на ≈ 0.5–1 см на 1000 м и ≈ 1 см на 2000 м. Это правильное направление — Кориолис «впитывается» в угол пристрелки вместо того, чтобы делать вид, что во время пристрелки его не было.

Боковой снос на дистанции пристрелки не 0 — и это правильно

Ветер, горизонтальная компонента Кориолиса и деривация действуют на пулю с самого вылета из ствола. К дистанции пристрелки пуля смещена в сторону на несколько миллиметров — сантиметров. Solver угла правит только вертикаль — он принципиально не может обнулить боковой снос. На реальной стрельбе вы крутите windage отдельным барабаном — на месте, под текущие условия.

Поэтому на дистанции пристрелки: снижение = 0, боковой снос ≠ 0, и оба числа физически честные.

Где в коде

Изменение в src/engine/BallisticEngine.ts — callback zero solver'а теперь получает coriolis и drift, и возвращает finalState.y + cor.result().dy вместо просто finalState.y. Упрощённый режим (SimpleBallisticEngine) не затронут: там обе фазы используют чистую гравитацию + drag, так что снижение на пристрелке было нулём ещё до этого изменения.

Multi-BC(动态弹道系数)— 本计算器的实现方式

Multi-BC 描述子弹的弹道系数如何随速度变化。「修正」区域的「动态 BC」开关启用 G1 和 G7 阻力模型的分段线性修正。展开下方区块查看完整说明。

📘 Multi-BC:是什么,计算器如何处理,如何使用

什么是弹道系数(BC)

BC 是一个数值,表示子弹相比参考弹丸「穿透空气」的能力。BC 越大,子弹失速越慢,远距离下沉越少。公式:BC = 质量 / (直径² × 形状系数),形状系数是真实阻力曲线与参考曲线的比值。

为什么 BC 不是恒定的

实际上 BC 会随速度略有变化。当子弹穿过声速(标准条件下约 340 米/秒),其外流型态发生剧烈变化:超音速时形成激波锥,亚音速时流动光滑然后出现涡流。对大多数比赛子弹而言,从初速到穿过声障的过程中,BC 下降 5%–15%

如果计算器全程使用单一 BC,那么必定在某段轨迹高估或低估射程。

行业三种方案

1. Sierra Multi-BC(G1 + 多个 BC)。美国最老牌的比赛子弹厂家 Sierra Bullets 发布的不是一个 BC,而是一组按速度区间分段的 BC 数组。例如 .308 168 格令 SMK:

  • 高于 792 米/秒:BC = 0.462
  • 640–792 米/秒:BC = 0.447
  • 549–640 米/秒:BC = 0.424
  • 低于 549 米/秒:BC = 0.405

计算器每步检查当前速度并切换到对应区间的 BC。远距离精度高。缺点:仅在你有 Sierra 数据表时可用,大多数厂家只发布一个平均 BC。

2. Litz / G7(单 BC,但用合适的阻力模型)。Bryan Litz(Applied Ballistics)提出了另一种思路:使用 G7 阻力模型取代 G1。G7 是一种形状更接近现代比赛子弹的参考弹丸(长、流线、船尾形)。逻辑:BC 随速度变化主要是因为 G1 不适合现代弹形;如果参考弹与真实子弹形状相近,非线性就小,单个 G7 BC 就够用。现在 G7 + 单 BC 是远距离的金标准。

3. Hornady 4DOF / 自定义阻力模型。最精确的方法。Hornady 直接用多普勒雷达实弹测量每种子弹的阻力曲线 — 完全不需要参考弹丸。在其 4DOF 应用中根本没有「BC」概念,只有每颗子弹的完整 Cd(M)(阻力系数随马赫数)曲线。缺点:只对 Hornady 实测过的子弹有效。

本计算器的做法 — 分段线性 dynamic BC 修正

本计算器支持全部 6 种标准参考阻力模型(G1、G2、G5、G6、G7、G8)。Litz 方法(G7 + 单 BC)开箱即用。

额外实现了第 4 种方法 — 分段线性的 dynamic BC 修正。它不是 Sierra 风格的 3–4 个 BC 值表,也不是 Hornady CDM,而是一个数学函数,在每个积分步根据当前速度调整有效 BC。通过「修正」中的「动态 BC」开关启用。

函数形状 — 分段线性,G1 和 G7 有不同的常数。以 G7(典型现代比赛场景)为例:

  • 高超音速(Mach > 2.5)— factor = 1.0(无修正,高于子弹典型速度区间)
  • 超音速(1.8–2.5)— factor 从 1.0 线性下降至 0.965(小修正 ~3.5%)
  • 跨音速(1.2–1.8)— factor 从 0.965 下降至 0.905(~6%)
  • 近音速(1.0–1.2)— factor 从 0.905 急降至 0.87(窄区间内剧烈 ~4%)
  • 亚音速(Mach < 1.0)— factor ≈ 0.87(稳定修正)

效果:开启后,有效 BC 随子弹减速而增大(BC_effective = BC_user / factor)。这补偿了穿越声障时阻力的上升,远距离预测更准。

重要限制:dynamic BC 修正对 G1 和 G7 实现。对其他阻力模型(G2、G5、G6、G8)该开关无效 — 这些模型没有校准的常数,factor 总是返回 1.0。

与行业方案的对比

本实现是一个混合方案:以 G1/G7 作为基础阻力模型(与 Sierra/Litz 一致),但在其上叠加分段线性 BC 修正,而非在多个 BC 值之间切换。实现比 Sierra 更轻(无需每颗子弹的 BC 表),实用精度足够。

对比:

  • Sierra 多 BC 表 — 每颗子弹 3–4 个 BC,按速度区间。远距离精度高,但需要厂家数据
  • Litz G7 + 单 BC — 对现代比赛子弹最简单的精确方案
  • Hornady CDM(4DOF) — 多普勒雷达全曲线。最精确,但仅限实测过的子弹
  • 分段线性(本计算器) — 精度与简洁度的折中

实用建议

对于现代比赛子弹(.308 SMK、.338 Lapua、6.5 Creedmoor ELD-M 等)— 推荐:选择 G7 阻力模型 + 输入厂家 G7 BC + 启用「动态 BC」。这在远距离上精度最佳。在 1000 米对典型狙击组合,「开启」与「关闭」之间下沉差异约 15–25 cm — 对点目标射击是显著差距。

开启 Multi-BC 后的逐步计算(内部细节)

计算器使用显式欧拉法,按距离的固定步长(1000 米目标时约 5 cm)。轨迹分解为大量小步,每步重新计算所有量。800 米目标约 16 000 步

每一步发生什么:

  1. 读取当前子弹速度分量(vx, vy, vz)
  2. 根据当前高度算大气参数(密度 ρ,声速 c)
  3. 马赫数:M = v_current / c
  4. 阻力系数 Cd — 在阻力表(G1 或 G7)按 M 做二次插值
  5. 若 Multi-BC 开启:按上述分段公式计算 factor,并将 Cd 除以 factor(等效提升 BC)
  6. 阻力加速度:a_drag = (ρ/ρ_std) × k_const × Cd × v_rel
  7. 重力:−9.80665 m/s²沿 y 方向(如倾斜射击则乘以 cos(slant))
  8. 科里奥利(如启用):−2·(ω × v)
  9. 时间步:dt = step / vx
  10. 更新速度:v_new = v − dt·(a_drag + a_grav + a_cor)
  11. 更新位置:pos_new = pos + dt·v_new(半隐式欧拉)
  12. 累加 TOF:TOF += dt

具体示例 — .308 168 格令 SMK 在 800 米(G7 BC = 0.218,初速 817 米/秒,标准大气):

距离 v_当前(米/秒) Mach factor(G7) 无 Multi-BC 下沉 有 Multi-BC 下沉
100 m7582.220.986−10 cm−10 cm~0
300 m6701.970.973−84 cm−83 cm+1 cm
500 m5931.750.960−255 cm−250 cm+5 cm
700 m5241.550.940−551 cm−535 cm+16 cm
800 m4921.460.931−748 cm−722 cm+26 cm

注意趋势:100 m 处 factor=0.986(修正 ~1.4%),800 m 处已是 0.931(修正 ~7%)。子弹越慢越接近声速,修正越大。

修正按 Mach 数生效的区间:

  • 超音速(M > 2.5)— factor = 1.0,无修正(子弹快于典型区间)
  • M = 2.5 至 1.0 — factor 平滑下降,从 1.0 至 ~0.87
  • 「热区」— Mach 1.0–1.2(近声速):factor 急降 0.905 → 0.87。对 .308 通常是 900–1100 米
  • 亚音速(M < 1.0)— factor 稳定在 ~0.87

结论:Multi-BC 在 500 米以上有用。短距离几乎无影响。在 1000 米+ 对 .308 级别通常带来 40–50 cm 的下沉修正。

📐 为什么校准距离上下沉 = 0(其他计算器为什么显示 −0.1 cm)

本计算器表格中你看到什么

在你设置的校准距离(例如 100 m)上,下沉列显示 0.0 cm / 0.00 mil。这就是靶场上物理发生的情况:你旋转瞄准镜直到子弹击中十字线,从那一刻起在那个距离上 POI = POA。计算器与之一致。

为什么其他计算器在校准距离显示 −0.1 cm

若启用地球科里奥利效应,子弹在飞行中会获得微小的垂直推力(100 m 上约一两毫米,随距离增长)。许多计算器(包括 Lesnik 固件和我们旧的 calculator-corrected.html)用简化模型(仅重力 + 阻力,无科里奥利、无自旋偏移)求解校准俯仰角,然后用完整物理积分实际射击。校准距离上约 0.1 cm 的残差就是简化求解器未补偿的科里奥利垂直分量。

数值上很小,但总让期望"零就是零"的用户困惑。

本引擎的做法

校准俯仰角求解器使用完整物理——与主射击相同的科里奥利和自旋偏移模型。求解器迭代报告的下沉(原始垂直位置 + 科里奥利垂直偏移)至零,因此烧入瞄准镜的俯仰角反映你会在靶场机械上调出的全部修正。结果:无论启用哪些修正,校准距离上的下沉都恰好为 0

权衡:烧入的俯仰角与简化求解器结果略有差异(约 0.001°),因此 1000 m 处下沉移动 ≈ 0.5–1 cm,2000 m 处 ≈ 1 cm。这是正确的方向——把科里奥利吸收到校准中,而不是假装校准期间它不存在。

校准距离上的横向偏移为 0——这是正确的

风、科里奥利的水平分量和自旋偏移从离开枪口起就作用于子弹。到达校准距离时,子弹已经横向偏移几毫米至几厘米。俯仰求解器只调整垂直瞄准——无法消除横向偏移。实际射击中,你用单独的旋钮在现场为当前条件调整 windage。

因此在校准距离上:下沉 = 0横向偏移 ≠ 0,两者在物理上都是诚实的。

代码位置

修改在 src/engine/BallisticEngine.ts — 零点求解器回调现在传递 coriolisdrift,并返回 finalState.y + cor.result().dy 而非仅 finalState.y。简化模式(SimpleBallisticEngine)未受影响:那里两个阶段都使用纯重力 + 阻力,因此校准下沉早已为零。

Constants & data sources

Every number the engine multiplies by has a citation. This block lists each constant and the drag-profile data source so the calculation is fully auditable.

📐 Physical constants (with sources)
SymbolValueMeaningSource
g9.80665 m/s²Standard gravitational acceleration at Earth's surface — defined value (not measured locally; the bullet trajectory is scaled by cos(slant) in the line-of-sight frame for inclined shots).ISO 80000-3, CGPM 1901
Ω7.292115 × 10⁻⁵ rad/sEarth's sidereal angular rotation rate. Drives the Coriolis perturbation −2(Ω × v).IUGG / IERS Conventions 2010
K_McCoy0.000559Leading coefficient in a_drag = K · ρ · Cd · v² / BC (SI units, BC in lb/in²).McCoy, Modern Exterior Ballistics, 1999, p. 169
Litz_exp1.83Power exponent in spin-drift formula drift_in = (SG + 1.2) · 1.25 · t^1.83.Litz, Applied Ballistics for Long-Range Shooting, 2009
inch0.0254 mExact definition: 1 international inch = 25.4 mm.International Yard and Pound Agreement, 1959
c₀331.0 m/sSpeed of sound in dry air at 0 °C — base value used in c = c₀·√(T/T₀).Standard acoustics; matches reference calculator
T₀273.15 KCelsius–Kelvin offset (water triple-point, the exact Kelvin definition).SI, 13th CGPM 1967
L−0.0065 K/mTropospheric temperature lapse rate (standard atmosphere).ICAO ISA 1964 / U.S. Standard Atmosphere 1976
R8.31432 J/(mol·K)Universal gas constant (1976 ISA convention; differs from modern CODATA 8.31446 at the 4th significant digit — kept for ICAO compatibility).U.S. Standard Atmosphere 1976
M_air0.0289644 kg/molMean molar mass of dry air.U.S. Standard Atmosphere 1976
R_dry287.058 J/(kg·K)Specific gas constant of dry air. Used in ρ = P / (R_dry · T).Derived from R and M_air
R_vap461.495 J/(kg·K)Specific gas constant of water vapor. Used in humidity correction to density.Derived from R and M_water
ρ_std1.225 kg/m³ICAO sea-level standard air density (15 °C, 1013.25 hPa, dry).ICAO ISA 1964
MAX_DROP3048 mIntegration safety stop — bullet too far below sight line.Engine internal (10,000 ft)
MIN_VEL15.24 m/sIntegration safety stop — bullet too slow to track meaningfully (≈ 50 fps).Engine internal

Source code: src/physics/Constants.ts (engine constants), src/physics/atmosphere/IcaoAltitudeProfile.ts (ICAO ISA), src/physics/stability/MillerStabilityModel.ts (Miller-formula unit conversions: 15.4324 gr/g, 25.4 mm/in, 3386.388666 Pa/inHg).

📊 Drag profiles — source & verification

All six reference drag tables (G1, G2, G5, G6, G7, G8) are taken from JBM Ballistics — the industry-standard tabulation also reproduced in McCoy 1999. Verified on 2026-05-25 against https://www.jbmballistics.com/ballistics/downloads/text/mcg*.txt with tolerance |Δ Cd| < 5×10⁻⁵.

ProfilePointsMach rangeMismatchesNotes
G1780.0–5.00Mayevski 1881 flat-base (legacy)
G2760.0–3.60Aberdeen "J" projectile
G5760.0–5.00Short 7.5° boat-tail
G6790.0–5.00Flat-base spitzer
G7780.0–3.90Modern boat-tail match — default
G8780.0–5.00Flat-base, blunt-nose

Interpolation between table points: piecewise quadratic with per-node (a, b, c) coefficients — see src/physics/drag/TableDragModel.ts. Linear interpolation would underestimate Cd in the transonic shoulder by 1–3 %, enough to throw long-range drop off by tens of cm.

Source code per profile: src/data/drag-tables/g{1,2,5,6,7,8}.ts (raw tables), src/physics/drag/G{1,2,5,6,7,8}DragModel.ts (concrete strategies), src/physics/drag/DragModelRegistry.ts (resolver).

Константы и источники данных

Каждое число, на которое engine умножает — с указанием источника. Этот блок перечисляет все константы и источник drag-таблиц, чтобы расчёт был полностью аудитируем.

📐 Физические константы (с источниками)
СимволЗначениеСмыслИсточник
g9,80665 м/с²Стандартное ускорение свободного падения на поверхности Земли — определяющее значение (не измеряется локально; при наклонной стрельбе пуля масштабируется на cos(slant) в системе линии прицеливания).ISO 80000-3, CGPM 1901
Ω7,292115 × 10⁻⁵ рад/сУгловая скорость вращения Земли (сидерический день). Используется в Кориолисе −2(Ω × v).IUGG / IERS Conventions 2010
K_McCoy0,000559Главный коэффициент в формуле drag a_drag = K · ρ · Cd · v² / BC (СИ единицы, BC в lb/in²).McCoy, Modern Exterior Ballistics, 1999, стр. 169
Litz_exp1,83Степенной показатель в формуле деривации drift_in = (SG + 1,2) · 1,25 · t^1,83.Litz, Applied Ballistics for Long-Range Shooting, 2009
дюйм0,0254 мТочное определение: 1 международный дюйм = 25,4 мм.International Yard and Pound Agreement, 1959
c₀331,0 м/сСкорость звука в сухом воздухе при 0 °C — базовое значение в c = c₀·√(T/T₀).Стандартная акустика; совпадает с reference калькулятором
T₀273,15 KСдвиг Цельсий–Кельвин (тройная точка воды, точное определение Кельвина).СИ, 13-я CGPM 1967
L−0,0065 K/мТемпературный градиент тропосферы (стандартная атмосфера).ICAO ISA 1964 / U.S. Standard Atmosphere 1976
R8,31432 Дж/(моль·K)Универсальная газовая постоянная (соглашение ISA 1976; отличается от современной CODATA 8,31446 в 4-й значащей цифре — оставлено для совместимости с ICAO).U.S. Standard Atmosphere 1976
M_air0,0289644 кг/мольСредняя молярная масса сухого воздуха.U.S. Standard Atmosphere 1976
R_dry287,058 Дж/(кг·K)Удельная газовая постоянная сухого воздуха. Используется в ρ = P / (R_dry · T).Выведена из R и M_air
R_vap461,495 Дж/(кг·K)Удельная газовая постоянная водяного пара. Используется в поправке плотности на влажность.Выведена из R и M_water
ρ_std1,225 кг/м³Стандартная плотность воздуха ICAO на уровне моря (15 °C, 1013,25 гПа, сухой).ICAO ISA 1964
MAX_DROP3048 мSafety stop integration — пуля слишком далеко ниже линии прицеливания.Engine internal (10 000 ft)
MIN_VEL15,24 м/сSafety stop — пуля слишком медленная для tracking (≈ 50 fps).Engine internal

Коэффициенты перевода единиц

КоэффициентЗначениеГде используется
гран в грамме15,4323583529Перевод массы пули (Miller SG требует граны)
мм в дюйме25,4 (точно)Диаметр и длина пули
см в дюйме2,54 (точно)Шаг нарезов
м в футе0,3048 (точно)Начальная скорость → ft/s для Miller
Па на inHg3386,388666Давление для атмо-фактора Miller
Miller v_ref2800 ft/sReference скорость в v_factor = ∛(MV/2800) для Miller SG

Угловые единицы (mil / mrad / тысячная) — внимание

В природе существует ТРИ разных «mil» — одно имя, разные значения. Engine использует true mrad, и именно это значение размечено на сетках всех современных прицелов.

НазваниеВ окружности1 единица в радианахГде используется
True mrad / прицельный «mil»≈ 6283,190,001000Сетки Mil-Dot, Horus, MIL-C — и этот engine
NATO mil6400 (точно)0,000982 (~1,9 % отличие)Военный компас / артиллерия; не для прицельных поправок
Русская «тысячная»6000 (точно)0,001047 (~4,7 % отличие)Советская / варшавского блока артиллерия; иногда в Strelok-Pro UI тоже подписана «mil»

В engine: drop / distance — это угол в радианах. Умножив на 1000, получаем mrad — тот самый «mil», который размечен на сетках прицелов. 1 mrad поправки = 10 см на 100 м = 1 м на 1000 м.

Перевод в MOA (угловые минуты): 1 mrad = 3,4377 MOA. 1 MOA ≈ 2,908 см на 100 м.

Источник в коде: src/physics/Constants.ts (константы + угловые конвенции), src/physics/atmosphere/IcaoAltitudeProfile.ts (ICAO ISA), src/physics/stability/MillerStabilityModel.ts (конверсии единиц).

📊 Drag-профили — источник и сверка

Все 6 эталонных drag-таблиц (G1, G2, G5, G6, G7, G8) взяты с JBM Ballistics — индустриальный стандарт, также воспроизведённый в McCoy 1999. Сверены 2026-05-25 против https://www.jbmballistics.com/ballistics/downloads/text/mcg*.txt с tolerance |Δ Cd| < 5×10⁻⁵.

ПрофильТочекMach диапазонРасхожденийЗаметки
G1780,0–5,00Маевский 1881, плоскодонная пуля (legacy)
G2760,0–3,60Aberdeen "J" projectile
G5760,0–5,00Короткий 7,5° boat-tail
G6790,0–5,00Плоскодонный spitzer
G7780,0–3,90Современная boat-tail match — по умолчанию
G8780,0–5,00Плоскодонная, тупоносая

Интерполяция между точками: кусочно-квадратичная с коэффициентами (a, b, c) на узел — см. src/physics/drag/TableDragModel.ts. Линейная интерполяция занижала бы Cd в трансзвуковой области на 1–3 %, что давало бы расхождение в десятки см на дальних дистанциях.

Исходный код профилей: src/data/drag-tables/g{1,2,5,6,7,8}.ts (raw таблицы), src/physics/drag/G{1,2,5,6,7,8}DragModel.ts (конкретные стратегии), src/physics/drag/DragModelRegistry.ts (резолвер).

常数与数据来源

引擎所用的每个数字都标注了来源。本区块列出全部常数与阻力曲线数据源,使整个计算完全可审计。

📐 物理常数(含来源)
符号数值含义来源
g9.80665 m/s²地球表面标准重力加速度 — 定义值(非本地测量;倾斜射击时在瞄准线坐标系内按 cos(slant) 缩放)。ISO 80000-3, CGPM 1901
Ω7.292115 × 10⁻⁵ rad/s地球恒星日角速度。用于科里奥利项 −2(Ω × v)IUGG / IERS Conventions 2010
K_McCoy0.000559阻力公式中的首项系数:a_drag = K · ρ · Cd · v² / BC(SI 单位,BC 以 lb/in²)。McCoy, Modern Exterior Ballistics, 1999, p. 169
Litz_exp1.83自旋偏移公式的幂指数:drift_in = (SG + 1.2) · 1.25 · t^1.83Litz, Applied Ballistics for Long-Range Shooting, 2009
英寸0.0254 m精确定义:1 国际英寸 = 25.4 毫米。International Yard and Pound Agreement, 1959
c₀331.0 m/s0 °C 干燥空气中的声速 — c = c₀·√(T/T₀) 的基准值。标准声学;与参考计算器一致
T₀273.15 K摄氏–开氏偏移(水三相点,开尔文的精确定义)。SI,第 13 届 CGPM 1967
L−0.0065 K/m对流层温度递减率(标准大气)。ICAO ISA 1964 / U.S. Standard Atmosphere 1976
R8.31432 J/(mol·K)通用气体常数(1976 ISA 约定;与现代 CODATA 值 8.31446 在第 4 位有效数字处不同 — 保留以兼容 ICAO)。U.S. Standard Atmosphere 1976
M_air0.0289644 kg/mol干燥空气平均摩尔质量。U.S. Standard Atmosphere 1976
R_dry287.058 J/(kg·K)干燥空气比气体常数。用于 ρ = P / (R_dry · T)由 R 与 M_air 推得
R_vap461.495 J/(kg·K)水蒸气比气体常数。用于湿度对密度的修正。由 R 与 M_water 推得
ρ_std1.225 kg/m³ICAO 海平面标准空气密度(15 °C,1013.25 hPa,干燥)。ICAO ISA 1964
MAX_DROP3048 m积分安全终止 — 子弹相对瞄准线下沉过多。引擎内部(10,000 ft)
MIN_VEL15.24 m/s积分安全终止 — 子弹太慢以致跟踪无意义(≈ 50 fps)。引擎内部

单位换算系数

系数数值用途
格令/克15.4323583529子弹质量换算(Miller SG 需要格令)
毫米/英寸25.4(精确)子弹直径与长度
厘米/英寸2.54(精确)缠距
米/英尺0.3048(精确)初速 → ft/s 用于 Miller
Pa/inHg3386.388666Miller 大气因子的气压换算
Miller v_ref2800 ft/sMiller SG 中 v_factor = ∛(MV/2800) 的参考速度

角度单位(mil / mrad / тысячная)— 注意

世界上存在三种不同的「mil」,名称相同但数值不同。本引擎使用 true mrad,这也是所有现代瞄准镜标线上写「mil」的意思。

名称每整圈1 单位 (rad)使用场景
True mrad / 瞄准镜「mil」≈ 6283.190.001000Mil-Dot、Horus、MIL-C 标线 — 本引擎使用
NATO mil6400(精确)0.000982(~1.9% 偏差)军用罗盘 / 炮兵;不能用于瞄准镜修正
俄语「тысячная」6000(精确)0.001047(~4.7% 偏差)苏联 / 华沙公约炮兵;部分俄式瞄准镜和 Strelok-Pro UI 也用此名

引擎中:drop / distance = 角度(弧度)。乘以 1000 得 mrad,即瞄准镜标线上的「mil」。1 mrad 修正 = 100 m 处 10 cm = 1000 m 处 1 m — 便于记忆。

换算到 MOA(角分):1 mrad = 3.4377 MOA。1 MOA ≈ 100 m 处 2.908 cm。

代码位置:src/physics/Constants.ts(常数与角度规范),src/physics/atmosphere/IcaoAltitudeProfile.ts(ICAO ISA),src/physics/stability/MillerStabilityModel.ts(单位换算)。

📊 阻力曲线 — 来源与核验

全部六个参考阻力曲线(G1、G2、G5、G6、G7、G8)取自 JBM Ballistics — 行业标准表,亦见于 McCoy 1999。2026-05-25 与 https://www.jbmballistics.com/ballistics/downloads/text/mcg*.txt 核验,容差 |Δ Cd| < 5×10⁻⁵。

曲线点数Mach 范围不匹配备注
G1780.0–5.00Mayevski 1881 平底(传统)
G2760.0–3.60Aberdeen "J" 弹丸
G5760.0–5.00短 7.5° 船尾
G6790.0–5.00平底尖头
G7780.0–3.90现代船尾比赛 — 默认
G8780.0–5.00平底钝头

表点间插值:分段二次插值,每节点一组 (a, b, c) 系数 — 见 src/physics/drag/TableDragModel.ts。线性插值会在跨音速肩部低估 Cd 1–3%,足以在远距离造成数十厘米的下沉偏差。

各曲线源代码:src/data/drag-tables/g{1,2,5,6,7,8}.ts(原始表),src/physics/drag/G{1,2,5,6,7,8}DragModel.ts(具体策略),src/physics/drag/DragModelRegistry.ts(注册表)。