Install the Archer Solver App

Get the best experience by installing our app directly to your home screen.

iOS (iPhone/iPad)
  1. Open the link in Safari.
  2. Tap the Share icon at the bottom.
  3. Scroll down and tap "Add to Home Screen".
Android
  1. Open the link in Chrome.
  2. Tap the Menu (three dots) at top right.
  3. Tap "Install App" or "Add to Home Screen".
Launch App
Technical Reference

The Math Behind
Pro Archer Solver

Every calculation the app performs, documented in full. From arrow weight to the two-simulation solver that produces the dial-to number.

01 — Arrow

Total Weight

app.js › saveArrow()

Arrow weight is calculated by summing the mass of every component. The shaft weight is derived from its length and the manufacturer-specified grains-per-inch (GPI) rating.

Total Weight (grains) $$W_{total} = (L \times GPI) + W_{point} + W_{insert} + W_{nock} + W_{wrap} + (W_{vane} \times N_{vanes})$$
SymbolVariableUnit
LArrow lengthinches
GPIGrains per inch of shaftgr/in
WpointPoint / broadhead weightgrains
WinsertInsert weightgrains
WnockNock weightgrains
WwrapWrap weightgrains
WvaneWeight per vane / feathergrains
NvanesNumber of vanes or feathers

02 — Arrow

Front of Center

app.js › saveArrow()

Front of Center (FOC) expresses how far forward of the physical midpoint the arrow's centre of gravity sits. Higher FOC improves flight stability and penetration.

The calculation uses moment arms — each component's weight multiplied by its distance from the nock end (the reference point at position 0"). The nock itself sits at 0" and therefore contributes no moment.

Moment Sum (grains·inches) $$M_{total} = \underbrace{(W_{shaft}) \cdot \frac{L}{2}}_{shaft} + \underbrace{W_{insert} \cdot L}_{insert} + \underbrace{W_{point} \cdot L}_{point} + \underbrace{(W_{vane} \cdot N_{vanes} + W_{wrap}) \cdot 2}_{vanes/wrap}$$
Centre of Gravity (inches from nock) $$CG = \frac{M_{total}}{W_{total}}$$
FOC (%) $$FOC = \frac{CG - \tfrac{L}{2}}{L} \times 100$$
Vane moment arm: Vanes and wraps are assigned a fixed 2" moment arm from the nock, representing their approximate mid-fletching position on a standard arrow build. This is a practical simplification — a more precise calculation would require the exact fletch offset from the nock groove.

03 — Arrow

Speed Estimation

app.js › calculateEstimatedSpeed()

When no measured chronograph speed is available, the app estimates arrow speed from the bow's IBO rating. IBO (International Bowhunter Organization) speed is measured at a standardised setup: 70 lbs draw weight, 30" draw length, 350 grain arrow.

Each deviation from those standard conditions incurs a speed penalty.

Estimated Speed (fps) $$v_{est} = IBO - \underbrace{(30 - DL) \times 10}_{draw\ length} - \underbrace{\max(0,\ (70 - DW) \times 2)}_{draw\ weight} - \underbrace{\frac{W_{arrow} - 350}{3}}_{arrow\ weight} - \underbrace{8}_{peep\ loss}$$
SymbolVariableRate
IBOManufacturer IBO ratingbase
DLDraw length (inches)−10 fps per inch below 30"
DWDraw weight (lbs)−2 fps per lb below 70 lbs
WarrowTotal arrow weight (grains)−1 fps per 3 grains above 350
Peep sight loss−8 fps (fixed)
Measured speed always takes priority. If a chronograph reading has been saved for a bow/arrow combination, the estimate is never used for ballistic calculations. The estimate is labelled "EST. SPEED" in the app HUD.

04 — Arrow

Kinetic Energy & Momentum

app.js › calcBallistics()

Kinetic energy and momentum are computed at the bow — the muzzle values used in the Ballistic Lab for hunting lethality assessment. These use imperial archery conventions with unit-conversion constants baked into the divisors.

Kinetic Energy (ft·lbs) $$KE = \frac{W_{arrow} \times v^2}{450{,}240}$$
Momentum (slug·ft/s) $$p = \frac{W_{arrow} \times v}{225{,}218}$$

The divisor 450,240 is derived from: 2 × 7000 gr/lb × 32.174 ft/s². The divisor 225,218 is 7000 × 32.174. Both convert grain-fps units into standard imperial equivalents.


05 — Ballistics

Drag Coefficient

ballistics.js › estimateDrag()

The drag coefficient (Cd) represents total aerodynamic resistance relative to dynamic pressure acting on the arrow's cross-sectional area. The app calculates it additively from three contributions: bare shaft, fletching, and tip.

Total Drag Coefficient $$C_d = C_{d,shaft} + C_{d,fletch} + C_{d,tip}$$

Shaft baseline

A naked shaft with nock contributes a base drag of 1.3. This accounts for skin friction drag along the shaft length, which dominates at arrow velocities.

Fletching contribution

Fletching drag depends on material, profile, and count. The values below represent the combined Cd contribution of a standard 3-vane configuration. Feather values are approximately 22% higher than plastic equivalents, consistent with published aerodynamic research showing natural feathers carry 15–30% more drag due to surface roughness and fiber irregularity.

MaterialLow (micro/target)Standard (Blazer/2")High (3–4" / helical)
Plastic vane0.601.802.40
Natural feather0.752.203.00

For 4-vane configurations, the fletching contribution is scaled by a factor of 1.33 (approximately one additional vane's worth of drag, not a 33% increase in total Cd).

4-Vane Scaling $$C_{d,fletch}^{(4)} = C_{d,fletch}^{(3)} \times 1.33$$

Tip contribution

Tip typeExampleCd addition
Field pointAny field point0.00
MechanicalAny mechanical broadhead0.20
Fixed (compact)QAD Exodus, similar1.20
Fixed (large)Iron Will Wide, similar2.80
Validation: A standard 3-vane plastic setup with a field point gives Cd = 3.10. At 280 fps, this produces ~260 fps at 40 yards — consistent with published chronograph data for hunting arrows. A large fixed broadhead at Cd = 5.90 produces ~2.4" more drop at 40 yards than a field point, matching controlled broadhead penetration test data (2–4" range).

06 — Ballistics

Air Density

ballistics.js › getAirDensity()

Air density directly scales drag force. The app models it using the International Standard Atmosphere (ISA) barometric formula, accounting for both altitude and temperature.

First, atmospheric pressure at altitude is calculated from the standard lapse rate:

Atmospheric Pressure (Pa) $$P = P_0 \left(1 - \frac{L \cdot h}{T_0}\right)^{\frac{gM}{RL}}$$

Air density is then derived from the ideal gas law:

Air Density (kg/m³) $$\rho = \frac{P \cdot M}{R \cdot T}$$
SymbolConstantValue
P0Sea level pressure101,325 Pa
T0Sea level standard temperature288.15 K
LTemperature lapse rate0.0065 K/m
MMolar mass of dry air0.02896 kg/mol
RUniversal gas constant8.3144 J/(mol·K)
gGravitational acceleration9.80665 m/s²
hAltitude above sea levelmetres
TActual temperatureKelvin
Two densities are computed per solve: ρzero using home range temperature and altitude (conditions under which the sight tape was built), and ρfield using current field conditions. Both are used in the solver — see sections 8 and 9.

07 — Ballistics

RK4 Flight Simulation

ballistics.js › simulateShot() › rk4Step()

Arrow flight is governed by two forces: gravity and aerodynamic drag. The drag force acts opposite to the arrow's velocity relative to the surrounding air (accounting for wind). At every instant:

Equations of Motion $$\ddot{x} = -\frac{\rho \cdot C_d \cdot A}{2m} \cdot v_{rel} \cdot (v_x - v_{wind,x})$$ $$\ddot{y} = -g - \frac{\rho \cdot C_d \cdot A}{2m} \cdot v_{rel} \cdot v_y$$ $$\ddot{z} = -\frac{\rho \cdot C_d \cdot A}{2m} \cdot v_{rel} \cdot (v_z - v_{wind,z})$$

Where the relative airspeed magnitude is:

Relative Airspeed $$v_{rel} = \sqrt{(v_x - v_{wind,x})^2 + v_y^2 + (v_z - v_{wind,z})^2}$$

Because drag is a continuous nonlinear function of velocity, a simple Euler step would accumulate significant error. The app uses the fourth-order Runge-Kutta (RK4) integrator at 1ms time steps, which takes four slope estimates per step and combines them as a weighted average:

RK4 Step (applied to all 6 state variables) $$\mathbf{s}_{n+1} = \mathbf{s}_n + \frac{\Delta t}{6}(\mathbf{k}_1 + 2\mathbf{k}_2 + 2\mathbf{k}_3 + \mathbf{k}_4)$$
k₁

Start of interval

Derivatives evaluated at the current state sn

k₂

Midpoint estimate A

Derivatives at sn + k₁ · Δt/2

k₃

Midpoint estimate B

Derivatives at sn + k₂ · Δt/2 — a corrected midpoint

k₄

End of interval

Derivatives at sn + k₃ · Δt — the projected end state

The midpoint estimates k₂ and k₃ are weighted double, giving RK4 fourth-order accuracy — local truncation error of O(Δt⁵) and global error of O(Δt⁴). At 1ms steps this is more than sufficient for archery distances.

The state vector tracks six values simultaneously — position and velocity in three axes:

State Vector $$\mathbf{s} = [x,\ y,\ z,\ v_x,\ v_y,\ v_z]$$

When the simulation reaches the target horizontal distance, the exact impact position is recovered by linear interpolation between the last two time steps.

SymbolVariable
AArrow cross-sectional area (based on 0.244" standard shaft diameter)
mArrow mass (kg)
ρAir density at field conditions (kg/m³)
vwind,x/zWind velocity components derived from clock-face direction input
ΔtTime step — 1 millisecond

08 — Solver

Launch Angle

ballistics.js › calculateSolution() — Step 1

The first solver problem: find the physical launch angle that makes the arrow arrive at the correct position in 3D space — the correct horizontal distance and the correct height for a sloped shot.

For a shot at distance DLOS yards along a slope of θslope degrees, the horizontal and vertical targets are:

Target Geometry $$D_{horiz} = D_{LOS} \cdot \cos(\theta_{slope})$$ $$H_{target} = D_{LOS} \cdot \sin(\theta_{slope})$$

There is no closed-form solution for the launch angle once drag is included. The app uses binary search over the launch angle space, running a full RK4 simulation at each candidate angle until the impact height converges on Htarget to within 1mm.

01

Initialise search bounds

−85° to +85° — wide enough to cover any physically possible shot

02

Bisect and simulate

Test the midpoint angle with a full RK4 simulation using field air density and wind

03

Compare impact height

If impact Y < Htarget → raise lower bound. If Y > Htarget → lower upper bound

04

Repeat up to 30 iterations

Each iteration halves the search window — 30 iterations gives sub-microradian angular precision

The output is α — the physical launch angle in radians. This is the angle the arrow bore must point above horizontal for the shot to connect, accounting for real drag and the full air density at field conditions.

This is not the cosine rule. The cosine rule (Htarget = D × cos θ) is a flat-trajectory approximation that ignores drag entirely. Because drag decelerates the arrow non-uniformly across the trajectory, the correct launch angle for a sloped shot cannot be derived algebraically — it requires simulation.

09 — Solver

Dial-To Number

ballistics.js › calculateSolution() — Step 2

Knowing the required launch angle α is not enough. The archer needs a yardage number to dial on their existing sight tape. To produce that number, the app must convert the physical launch angle into a sight tape yardage — the flat-ground distance at which the archer's tape was calibrated to produce that same mechanical sight angle.

Required sight angle

The mechanical sight angle is the angle the sight hardware is physically set to relative to the bow's bore axis. For the sloped shot, it is:

Required Sight Angle (radians) $$\phi_{required} = (\alpha - \theta_{slope}) - \arctan\!\left(\frac{-h_{peep}}{D_{horiz}}\right)$$

The arctan term is the parallax correction — the small downward angle from peep to target caused by the peep sitting above the bore axis. This is the only place peep height appears in the calculation, and it enters as a ratio with target distance. The peep-to-housing distance cancels from this geometry.

Binary search over tape distance

The app then searches for the flat-ground yardage dtape at which a flat shot — simulated using home range air density and the home arrow, with no wind — produces that exact same mechanical sight angle:

01

Outer loop — candidate tape distance

Binary search over dtape from 10m to 2× the field distance. Up to 25 iterations.

02

Inner loop — flat ground launch angle

For each candidate distance, binary search for the launch angle that produces a flat ground impact (y = 0). Simulated using home air density and home arrow ballistics. Up to 20 iterations.

03

Compute candidate sight angle

φcandidate = αflat − arctan(−hpeep / dtape)

04

Compare and bisect

If φcandidate < φrequired → raise lower bound. Else → lower upper bound.

The result is converted to yards and displayed as the dial-to number. Up to 25 × 20 = 500 individual RK4 arrow simulations may be performed for a single solve — all in real time.

Home tape mode: If a different arrow is designated as the sight tape reference, the inner loop uses that arrow's ballistics and speed for the flat ground simulation. This allows the dial-to number to read correctly off a tape built for a different arrow, without re-zeroing.

10 — Solver

Kinetic Energy at Distance

ballistics.js › calculateSolution() — Step 3

After the launch angle is found, the app re-runs the field shot simulation one final time to recover the impact velocity vector. The speed at the target plane is recovered by linear interpolation of velocity components between the last two time steps, identical to how impact position is recovered.

Impact Speed (m/s) $$v_{impact} = \sqrt{v_x^2 + v_y^2 + v_z^2}$$
KE at Distance (ft·lbs) $$KE_{dist} = \frac{1}{2} m v_{impact}^2 \times 0.737562$$

The factor 0.737562 converts joules to foot-pounds. This value updates live as distance, slope, wind, temperature, altitude, arrow, and bow inputs change — it is always the kinetic energy the arrow carries at exactly the dialed distance, not at the bow.

Wind is included. The final simulation uses field wind conditions, so the impact speed accounts for both the downrange velocity decay from drag and the energy carried in the lateral (Z-axis) velocity component from wind deflection.

Pro Archer Solver — Technical Reference  ·  All calculations performed client-side  ·  No data is transmitted or stored remotely