var half = 0.5 var one = 1.0 var two = 2.0 var pie = 3.1415926536 var miles_to_feet = 5280.0 var alpha // radian measure var beta // elevation/radius var standard_Earth_radius = 3959.0 // in statute miles var max_input_distance = (pie/two)*standard_Earth_radius var max_input_elevation = 100.0*miles_to_feet*standard_Earth_radius // about 2 billion feet var distance var elevation var secant var tangent var elev_depression var horizon_distance function get_Set_ObserverObjectDistance() { distance = window.document.elevation_depression.dist_input.value if (!checkDistance()) return compute_Display_elevationDepression(distance); } function get_Set_ObserverElevation() { elevation = window.document.horizon_distance.elev_input.value if (!checkElevation()) return compute_Display_horizonDistance(elevation); } function checkDistance() { if (distance < 0.0) { alert("Distance must be non-negative - reenter value.") return false } if (distance > max_input_distance) { alert("Distance must be less than 1/4 of Earth's circumference - reenter value.") return false } return true } // end CheckDistance function checkElevation() { if (elevation < 0.0) { alert("Elevation must be non-negative - reenter value.") return false } if (elevation > max_input_elevation) { alert("Please enter a sane elevation (in feet).") return false } return true } // end CheckElevation function compute_Display_elevationDepression(distance) { alpha = distance / standard_Earth_radius if (alpha < 0.1) secant = computeSecant(alpha) else secant = one / Math.cos(alpha) elev_depression = (secant - one) * standard_Earth_radius elev_depression *= miles_to_feet //elev_depression = 0.6668 * distance * distance window.document.elevation_depression.depression.value = roundA(elev_depression) } function compute_Display_horizonDistance(elevation) { elevation /= miles_to_feet beta = elevation / standard_Earth_radius tangent = Math.sqrt(beta * (two + beta)); // tangent of distance along ground alpha = Math.atan(tangent) horizon_distance = alpha * standard_Earth_radius window.document.horizon_distance.distance.value = roundB(horizon_distance) } function computeSecant(alpha) { var const4 = 5.0/24.0 var const6 = 61.0/720.0 var const8 = 277.0/8064.0 var a2 = alpha*alpha var a4 = a2*a2 var a6 = a4*a2 var a8 = a6*a2 return secant = one + half*a2 + const4*a4 + const6*a6 + const8*a8 } function roundA(elev_depr) { var inv_precision if (elev_depr < 0.000001) inv_precision = 1000000000.0 else if (elev_depr < 0.00001) inv_precision = 100000000.0 else if (elev_depr < 0.0001) inv_precision = 10000000.0 else if (elev_depr < 0.001) inv_precision = 1000000.0 else if (elev_depr < 0.01) inv_precision = 100000.0 else if (elev_depr < 0.1) inv_precision = 10000.0 else if (elev_depr < 1.0) inv_precision = 1000.0 else if (elev_depr < 10.0) inv_precision = 100.0 else if (elev_depr < 100.0) inv_precision = 10.0 else if (elev_depr < 1000.0) inv_precision = 1.0 else if (elev_depr < 10000.0) inv_precision = 0.1 else if (elev_depr < 100000.0) inv_precision = 0.01 else if (elev_depr < 1000000.0) inv_precision = 0.001 else inv_precision = 0.0001 var rounded = Math.round(inv_precision*elev_depr) rounded /= inv_precision return rounded } function roundB(h_dist) { // CONSTRUCT THIS METHOD var inv_precision if (h_dist < 0.0001) inv_precision = 10000000.0 else if (h_dist < 0.001) inv_precision = 1000000.0 else if (h_dist < 0.01) inv_precision = 100000.0 else if (h_dist < 0.1) inv_precision = 10000.0 else if (h_dist < 1.0) inv_precision = 1000.0 else if (h_dist < 10.0) inv_precision = 100.0 else if (h_dist < 100.0) inv_precision = 10.0 else if (h_dist < 1000.0) inv_precision = 1.0 else inv_precision = 0.1 var rounded = Math.round(inv_precision*h_dist) rounded /= inv_precision return rounded } function resetElevationCorrectionValues() { window.document.elevation_depression.dist_input.value = "" window.document.elevation_depression.depression.value = "" } function resetHorizonDistanceValues() { window.document.horizon_distance.elev_input.value = "" window.document.horizon_distance.distance.value = "" }