This only works for projectiles that travel straight, and at a constant velocity.
You don't need to lead more if the target is farther away. For the same angle, target velocity and projectile velocity, the lead angle will always be the same. Think of it as a triangle with the following corners: player, target, and impact. If the distance between the player and the target is doubled, then the target and the projectile will travel twice farther or twice longer, resulting in the same three angles.
Most heroes run at 5.5m/s, except for Tracer and Genji who run at 6m/s.
All heroes run backwards slower by 10%: 4.95m/s, or 5.4m/s for Tracer and Genji.
You could extend the crosshair length based on the running speed of Tracer and Genji, or the speed of heroes running with LĂșcio's speed boost.
The circle reticle is useful when aiming from high ground, or against a flying Phara.
You can confirm the experiment by strafing left or right, and firing: the projectiles should stay on the edge of the reticle. This is useful if you don't know the velocity of your projectiles, so you can get a somewhat accurate estimate.
The various wikis have generally incorrect or outdated projectile speeds. This is a more useful but limited resource.
Simple geometry
hres:
horizontal resolution (pixels)
fov:
horizontal field of view (°)
Vt:
target velocity (m/s)
Vp:
projectile velocity (m/s)
Dpt:
initial distance between player and target (m)
A:
impact angle
L:
lead angle
Lpx:
lead in pixels
Knowing that projectiles move much faster than our targets, it's safe to assume that the maximum impact angle will generally be around 90°, and we get a right triangle. We have enough data to use basic trigonometry and get the lead angle. Fig. 1
L = arctan(Vt / Vp)
Now that we have the lead angle, we can deduce how many pixels this represents in the actual game: ratio of the angle to the FOV times the resolution. Fig. 2
Lpx = tan(L) / tan(fov / 2) × (hres / 2)
simplified:
Lpx = (Vt / Vp) / tan(fov / 2) × (hres / 2)
Knowing this we can now get the ideal reticle. It's important to know what the units in the reticle settings correspond to 1px at 1080p, so hres is set to 1920. Then we simply need to multiply Lpx by 2, and we can get the desired reticle size.
What about different impact angles? Without a right triangle we first need to use the law of cosines to get Dpt.
Dpt = √(Vt2 + Vp2 - 2 × Vt × Vp × cos(A))
We follow up by using the law of sines to get the lead angle.
L = arcsin(sin(A) × Vt / Dpt)
And we finish by translating the lead angle to pixels, just like we did before.