Install the Archer Solver App
Get the best experience by installing our app directly to your home screen.
- Open the link in Safari.
- Tap the Share icon ⎋ at the bottom.
- Scroll down and tap "Add to Home Screen".
- Open the link in Chrome.
- Tap the Menu (three dots) at top right.
- Tap "Install App" or "Add to Home Screen".
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.
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.
| Symbol | Variable | Unit |
|---|---|---|
| L | Arrow length | inches |
| GPI | Grains per inch of shaft | gr/in |
| Wpoint | Point / broadhead weight | grains |
| Winsert | Insert weight | grains |
| Wnock | Nock weight | grains |
| Wwrap | Wrap weight | grains |
| Wvane | Weight per vane / feather | grains |
| Nvanes | Number of vanes or feathers | — |
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.
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.
| Symbol | Variable | Rate |
|---|---|---|
| IBO | Manufacturer IBO rating | base |
| DL | Draw length (inches) | −10 fps per inch below 30" |
| DW | Draw weight (lbs) | −2 fps per lb below 70 lbs |
| Warrow | Total arrow weight (grains) | −1 fps per 3 grains above 350 |
| — | Peep sight loss | −8 fps (fixed) |
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.
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.
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.
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.
| Material | Low (micro/target) | Standard (Blazer/2") | High (3–4" / helical) |
|---|---|---|---|
| Plastic vane | 0.60 | 1.80 | 2.40 |
| Natural feather | 0.75 | 2.20 | 3.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).
Tip contribution
| Tip type | Example | Cd addition |
|---|---|---|
| Field point | Any field point | 0.00 |
| Mechanical | Any mechanical broadhead | 0.20 |
| Fixed (compact) | QAD Exodus, similar | 1.20 |
| Fixed (large) | Iron Will Wide, similar | 2.80 |
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:
Air density is then derived from the ideal gas law:
| Symbol | Constant | Value |
|---|---|---|
| P0 | Sea level pressure | 101,325 Pa |
| T0 | Sea level standard temperature | 288.15 K |
| L | Temperature lapse rate | 0.0065 K/m |
| M | Molar mass of dry air | 0.02896 kg/mol |
| R | Universal gas constant | 8.3144 J/(mol·K) |
| g | Gravitational acceleration | 9.80665 m/s² |
| h | Altitude above sea level | metres |
| T | Actual temperature | Kelvin |
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:
Where the relative airspeed magnitude is:
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:
Start of interval
Derivatives evaluated at the current state sn
Midpoint estimate A
Derivatives at sn + k₁ · Δt/2
Midpoint estimate B
Derivatives at sn + k₂ · Δt/2 — a corrected midpoint
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:
When the simulation reaches the target horizontal distance, the exact impact position is recovered by linear interpolation between the last two time steps.
| Symbol | Variable |
|---|---|
| A | Arrow cross-sectional area (based on 0.244" standard shaft diameter) |
| m | Arrow mass (kg) |
| ρ | Air density at field conditions (kg/m³) |
| vwind,x/z | Wind velocity components derived from clock-face direction input |
| Δt | Time step — 1 millisecond |
Launch Angle
ballistics.js › calculateSolution() — Step 1The 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:
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.
Initialise search bounds
−85° to +85° — wide enough to cover any physically possible shot
Bisect and simulate
Test the midpoint angle with a full RK4 simulation using field air density and wind
Compare impact height
If impact Y < Htarget → raise lower bound. If Y > Htarget → lower upper bound
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.
Dial-To Number
ballistics.js › calculateSolution() — Step 2Knowing 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:
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:
Outer loop — candidate tape distance
Binary search over dtape from 10m to 2× the field distance. Up to 25 iterations.
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.
Compute candidate sight angle
φcandidate = αflat − arctan(−hpeep / dtape)
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.
Kinetic Energy at Distance
ballistics.js › calculateSolution() — Step 3After 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.
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.