A GNSS receiver estimates 4 unknowns — 3D position plus its own clock bias — from pseudorange measurements to N visible satellites. For satellite i with unit line-of-sight vector (E,N,U) in local East-North-Up coordinates, one row of the geometry matrix is:
G_i = [ -E_i, -N_i, -U_i, 1 ]
Q = (G^T G)^-1
GDOP = sqrt(trace(Q))
HDOP = sqrt(Q_EE + Q_NN)
VDOP = sqrt(Q_UU)
The sky plot on the right is the classic receiver-side view: zenith (straight up) sits at the center, the horizon is the outer rim, and azimuth runs clockwise from north. Every satellite you see on a real GNSS status screen is plotted exactly this way — this simulator lets you drag satellites around that same plot and rebuilds the geometry matrix live from wherever you drop them.
- Satellites clustered together (low spread, or dragged into a tight group) → the geometry-matrix rows point in similar directions → G^T G is nearly singular → DOP is large → a small ranging error blows up into a large position error.
- Satellites spread across the whole sky (high spread, low mask) → the rows are well separated → DOP is small (ideally near 1) → the same ranging error yields a tight position fix.
- Elevation mask excludes low satellites (drawn dim, near the rim) — they help horizontal geometry most but suffer the worst multipath and atmospheric delay, so real receivers trade DOP against signal quality with this exact slider.
The inset panel is the resulting horizontal position-error ellipse, drawn from the East/North block of Q with its true orientation (the E-N covariance term rotates the ellipse, it isn't just stretched along the compass axes). Final estimated error = DOP × UERE (User Equivalent Range Error, the one-sigma pseudorange noise from clock, ephemeris and atmospheric errors — fixed here at 5 m, a realistic single-frequency civilian value).