This is the exact same real solar geometry as the 3D version, drawn as a side-view cross-section looking straight down a north–south tracker row. Each row rotates about one N–S torque tube to follow the sun east→west; the angle that points the panel normal straight at the sun ("true tracking") is:
θ_true = atan2( sin γ·cos α , sin α )
where α is solar elevation and γ is solar azimuth from south, both from a standard equinox solar-position model (sin α = cos φ·cos H, sin γ = sin H / cos α, H = hour angle, φ = latitude). Because the E–W component of the sun's direction is exactly what this side-view shows, the 2D cross-section carries the real physics, not an approximation.
Near sunrise/sunset θ_true is large, and neighboring rows start shading each other. Backtracking backs the tilt off just enough to avoid it, given the ground coverage ratio GCR = panel width ÷ row pitch:
critical angle = acos(GCR)
if |θ_true| > critical:
θ = θ_true − sign(θ_true)·(|θ_true| − critical)
else: θ = θ_true
The shaded region drawn between rows comes from exact 2D ray-shadow geometry: the up-sun row's panel edges are projected along the real sun ray onto the down-sun row's tilted plane. Two losses are tracked separately and both scenarios (backtracking on/off) are computed every frame so you can compare them live:
- Shading loss — power lost to a neighbor's shadow. With backtracking this is always ≈0%.
- Cosine loss — power lost because the panel is angled off the sun to avoid shading. This is the real trade tracker firmware makes.
Drag row spacing tighter (or panels wider) to raise the GCR and watch the critical angle shrink — backtracking has to give up more cosine alignment to keep shading at zero.