Show earth curvature in contact elevation profile
Terrain elevations now include the earth bulge correction, so the profile visually humps up in the middle relative to the straight LOS beam — showing how the curved earth rises into the signal path. Uses actual k-factor from HRRR refractivity when available, otherwise standard 4/3. For a 300 km path at k=4/3, the midpoint bulge is ~2,650 m (8,700 ft).
This commit is contained in:
parent
ab8773acd0
commit
9fea93f59c
3 changed files with 14 additions and 2 deletions
|
|
@ -67,10 +67,20 @@ export const ElevationProfile = {
|
||||||
renderChart(data) {
|
renderChart(data) {
|
||||||
const points = data.points
|
const points = data.points
|
||||||
const distances = points.map(p => p.dist_km * KM2MI)
|
const distances = points.map(p => p.dist_km * KM2MI)
|
||||||
const elevations = points.map(p => p.elev * M2FT)
|
const showFresnel = data.freq_mhz >= 1000
|
||||||
|
|
||||||
|
// Earth curvature: add bulge to terrain so it curves up in the middle
|
||||||
|
// relative to the straight LOS beam. bulge(f) = d1*d2 / (2*k*R)
|
||||||
|
const k = data.k_factor || (4 / 3)
|
||||||
|
const R = 6371000 // earth radius in meters
|
||||||
|
const dTotal = (data.dist_km || 0) * 1000
|
||||||
|
const elevations = points.map((p, i) => {
|
||||||
|
const f = points.length > 1 ? i / (points.length - 1) : 0
|
||||||
|
const bulge = (f * dTotal * (1 - f) * dTotal) / (2 * k * R)
|
||||||
|
return (p.elev + bulge) * M2FT
|
||||||
|
})
|
||||||
const losLine = points.map(p => p.beam * M2FT)
|
const losLine = points.map(p => p.beam * M2FT)
|
||||||
const fresnelLower = points.map(p => (p.beam - p.r1) * M2FT)
|
const fresnelLower = points.map(p => (p.beam - p.r1) * M2FT)
|
||||||
const showFresnel = data.freq_mhz >= 1000
|
|
||||||
|
|
||||||
const ducts = (data.ducts || []).map(d => ({
|
const ducts = (data.ducts || []).map(d => ({
|
||||||
base_ft: d.base_m_msl * M2FT,
|
base_ft: d.base_m_msl * M2FT,
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,7 @@ defmodule Microwaveprop.Terrain.TerrainAnalysis do
|
||||||
points: points,
|
points: points,
|
||||||
diffraction_db: diffraction_db,
|
diffraction_db: diffraction_db,
|
||||||
verdict: verdict,
|
verdict: verdict,
|
||||||
|
k_factor: k,
|
||||||
max_elevation_m: max_elevation_m,
|
max_elevation_m: max_elevation_m,
|
||||||
min_clearance_m: min_clearance_m,
|
min_clearance_m: min_clearance_m,
|
||||||
obstructed_count: length(obstructed),
|
obstructed_count: length(obstructed),
|
||||||
|
|
|
||||||
|
|
@ -1103,6 +1103,7 @@ defmodule MicrowavepropWeb.ContactLive.Show do
|
||||||
end),
|
end),
|
||||||
freq_mhz: freq_ghz * 1000,
|
freq_mhz: freq_ghz * 1000,
|
||||||
dist_km: dist_km,
|
dist_km: dist_km,
|
||||||
|
k_factor: analysis.k_factor,
|
||||||
fwd_az: fwd_az,
|
fwd_az: fwd_az,
|
||||||
rev_az: rev_az,
|
rev_az: rev_az,
|
||||||
fwd_el: fwd_el,
|
fwd_el: fwd_el,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue