private void Fix2CenterButton_Click(object sender, EventArgs e) { // East declination is positive; west is negative // True (map) Heading = Mag Bearing + Declination // Mag Hdg = True Brg - Declination // VOR headings are always magnetic (Hdg) if (FixListDataGridView.SelectedRows.Count > 0) { string FixText = string.Empty; double[] Coords; double Lat = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[1].Value); double Lon = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[2].Value); // VORs are in bearings and need no adjustment //double MagVar = Convert.ToDouble(MagVarTextBox.Text); if (FixOffsetCheckBox.Checked) { double Dist = Convert.ToDouble(FixDistTextBox.Text); double Brg = Convert.ToDouble(FixBrgNUD.Value); //if (FixListDataGridView.SelectedRows[0].Cells[3].Value != null) //MagVar = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[3].Value); Coords = LatLongCalc.Destination(Lat, Lon, Dist, Brg, 'N'); Lat = Coords[0]; Lon = Coords[1]; FixText = String.Format("{0:000}", FixBrgNUD.Value) + String.Format("{0:000.0}", Convert.ToDouble(FixDistTextBox.Text)); } CenterLatitudeTextBox.Text = Conversions.Degrees2SCT(Lat, true); CenterLat = Lat; CenterLongitudeTextBox.Text = Conversions.Degrees2SCT(Lon, false); CenterLon = Lon; //MagVarTextBox.Text = MagVar.ToString(); CenterFixTextBox.Text = FixListDataGridView.SelectedRows[0].Cells[0].Value.ToString() + FixText; UpdateStats(); } }
private void InsertCoordsButton_Click(object sender, EventArgs e) { if ((CenterLat == -1) || (CenterLon == -1)) { SCTcommon.SendMessage("First select the center point of the arc."); return; } if ((CalcDistanceTextBox.TextLength == 0) || (Convert.ToDouble(CalcDistanceTextBox.Text) < 1)) { SCTcommon.SendMessage("Radius of arc must be at least 1 NM"); return; } else { double[] Coords; double CenterLat = Conversions.DMS2Degrees(CenterLatitudeTextBox.Text); double CenterLon = Conversions.DMS2Degrees(CenterLongitudeTextBox.Text); double Dist = Convert.ToDouble(CalcDistanceTextBox.Text); double BrgStart = Convert.ToDouble(StartRadialNUD.Value); double BrgEnd = Convert.ToDouble(EndRadialNUD.Value); double MagVar = Convert.ToDouble(MagVarTextBox.Text); double Lat; double Lon; if (CircleCheckBox.Checked) { Coords = LatLongCalc.Destination(CenterLat, CenterLon, Dist, 90, 'N'); Lat = Coords[0]; Lon = Coords[1]; StartLatitudeTextBox.Text = Conversions.Degrees2SCT(Lat, true); StartLongitudeTextBox.Text = Conversions.Degrees2SCT(Lon, false); StartLat = Lat; StartLon = Lon; EndLatitudeTextBox.Text = Conversions.Degrees2SCT(Lat, true); EndLongitudeTextBox.Text = Conversions.Degrees2SCT(Lon, false); EndLat = Lat; EndLon = Lon; } else { if (MagBrgCheckBox.Checked == true) { BrgStart -= MagVar; BrgEnd -= MagVar; } Coords = LatLongCalc.Destination(CenterLat, CenterLon, Dist, BrgStart, 'N'); Lat = Coords[0]; Lon = Coords[1]; StartLatitudeTextBox.Text = Conversions.Degrees2SCT(Lat, true); StartLongitudeTextBox.Text = Conversions.Degrees2SCT(Lon, false); StartLat = Lat; StartLon = Lon; Coords = LatLongCalc.Destination(CenterLat, CenterLon, Dist, BrgEnd, 'N'); Lat = Coords[0]; Lon = Coords[1]; EndLatitudeTextBox.Text = Conversions.Degrees2SCT(Lat, true); EndLongitudeTextBox.Text = Conversions.Degrees2SCT(Lon, false); EndLat = Lat; EndLon = Lon; } UpdateStats(); } }
private void FixToEndButton_Click(object sender, EventArgs e) { if (FixListDataGridView.SelectedRows.Count > 0) { string FixText = string.Empty; double[] Coords; double Lat = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[1].Value); double Lon = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[2].Value); // VORs are in bearings and need no adjustment //double MagVar = Convert.ToDouble(MagVarTextBox.Text); if (FixOffsetCheckBox.Checked) { double Dist = Convert.ToDouble(FixDistTextBox.Text); double Brg = Convert.ToDouble(FixBrgNUD.Value); //if (FixListDataGridView.SelectedRows[0].Cells[3].Value != null) //MagVar = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[3].Value); Coords = LatLongCalc.Destination(Lat, Lon, Dist, Brg, 'N'); Lat = Coords[0]; Lon = Coords[1]; FixText = String.Format("{0:000}", FixBrgNUD.Value) + String.Format("{0:000.0}", Convert.ToDouble(FixDistTextBox.Text)); } EndLatitudeTextBox.Text = Conversions.Degrees2SCT(Lat, true); EndLat = Lat; EndLongitudeTextBox.Text = Conversions.Degrees2SCT(Lon, false); EndLon = Lon; //MagVarTextBox.Text = MagVar.ToString(); EndFixTextBox.Text = FixListDataGridView.SelectedRows[0].Cells[0].Value.ToString() + FixText; UpdateStats(); } }
private void CalcEndButton_Click(object sender, EventArgs e) { /// Summary /// "West is Best, East is least" /// To calculate true bearing from compass bearing (and known deviation and variation): /// Compass bearing +deviation = magnetic bearing /// Magnetic bearing + variation = true bearing /// To calculate compass bearing from true bearing(and known deviation and variation): /// True bearing -variation = Magnetic bearing /// West Variations are negative /// In the US, the agonic line is roughly along the Mississippi river /// In aviation, maps, GPS and runways use true bearings double CalcTrueBrg = CalcBrg; if (MagBrgCheckBox.Checked) { CalcTrueBrg -= CalcMag; } double[] CalcLocation = LatLongCalc.Destination(StartLat, StartLon, DistanceAdjust(CalcDist, CalcType), CalcTrueBrg, CalcType); EndLat = CalcLocation[0]; EndLon = CalcLocation[1]; EndLatitudeTextBox.Text = Conversions.Degrees2SCT(EndLat, true); EndLongitudeTextBox.Text = Conversions.Degrees2SCT(EndLon, false); EndFixTextBox.Text = string.Empty; UpdateCopyButtons(); }
private void ImportFixToHold() { // East declination is positive; west is negative // True (map) Heading = Mag Bearing + Declination // Mag Hdg = True Brg - Declination // VOR headings are always magnetic (Hdg) if (FixListDataGridView.SelectedRows.Count > 0) { string FixText = string.Empty; double[] Coords; double Lat = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[1].Value); double Lon = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[2].Value); // VORs are in bearings and need no adjustment //double MagVar = Convert.ToDouble(MagVarTextBox.Text); if (FixOffsetCheckBox.Checked) { double Dist = Convert.ToDouble(FixOffsetDistTextBox.Text); double Brg = Convert.ToDouble(FixOffsetBrgNUD.Value); //if (FixListDataGridView.SelectedRows[0].Cells[3].Value != null) //MagVar = Convert.ToDouble(FixListDataGridView.SelectedRows[0].Cells[3].Value); Coords = LatLongCalc.Destination(Lat, Lon, Dist, Brg, 'N'); Lat = Coords[0]; Lon = Coords[1]; FixText = String.Format("{0:000}", FixOffsetBrgNUD.Value) + String.Format("{0:000.0}", Convert.ToDouble(FixOffsetDistTextBox.Text)); } HoldLatitudeTextBox.Text = Conversions.Degrees2SCT(Lat, true); HoldLat = Lat; HoldLongitudeTextBox.Text = Conversions.Degrees2SCT(Lon, false); HoldLon = Lon; //MagVarTextBox.Text = MagVar.ToString(); HoldFixTextBox.Text = FixListDataGridView.SelectedRows[0].Cells[0].Value.ToString() + FixText; AddFixLabelCheckBox.Enabled = AddFixSymbolCheckBox.Enabled = (HoldFixTextBox.TextLength != 0); } }
private void FixEndCoordButton_Click(object sender, EventArgs e) { double[] coords = LatLongCalc.Destination(CenterLat, CenterLon, ArcRadius, Convert.ToDouble(EndRadialNUD.Value), 'N'); EndLat = coords[0]; EndLon = coords[1]; EndLatitudeTextBox.Text = Conversions.Degrees2SCT(EndLat, true); EndLongitudeTextBox.Text = Conversions.Degrees2SCT(EndLon, false); UpdateStats(); }
private void RadBrgStartButton_Click(object sender, EventArgs e) { double[] coords = new double[2]; if ((CenterLat != -1) && (CenterLon != -1)) { coords = LatLongCalc.Destination(CenterLat, CenterLon, ArcRadius, Convert.ToDouble(StartRadialNUD.Value), 'N'); StartLat = coords[0]; StartLon = coords[1]; StartLatitudeTextBox.Text = Conversions.Degrees2SCT(StartLat, true); StartLongitudeTextBox.Text = Conversions.Degrees2SCT(StartLon, false); } }
private string BuildArcString(double StartBrg, double EndBrg, double StartLat, double StartLon) { string Lat0 = string.Empty; string Lon0 = string.Empty; string Lat1; string Lon1; string output = string.Empty; double[] Coords; // Make sure we aren't crossing 360... if ((StartBrg + Math.Abs(EndBrg - StartBrg)) > 360) { for (double i = StartBrg; i < 360; i++) { Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, i, 'N'); Lat1 = Conversions.Degrees2SCT(Coords[0], true); Lon1 = Conversions.Degrees2SCT(Coords[1], false); output += OutputText(Lat0, Lon0, Lat1, Lon1); Lat0 = Lat1; Lon0 = Lon1; } for (double i = 1; i < EndBrg; i++) { Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, i, 'N'); Lat1 = Conversions.Degrees2SCT(Coords[0], true); Lon1 = Conversions.Degrees2SCT(Coords[1], false); output += OutputText(Lat0, Lon0, Lat1, Lon1); Lat0 = Lat1; Lon0 = Lon1; } } else { for (double i = StartBrg; i < EndBrg; i++) { Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, i, 'N'); Lat1 = Conversions.Degrees2SCT(Coords[0], true); Lon1 = Conversions.Degrees2SCT(Coords[1], false); output += OutputText(Lat0, Lon0, Lat1, Lon1); Lat0 = Lat1; Lon0 = Lon1; } } // Draw last segment Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, EndBrg, 'N'); PasteLat = Coords[0]; PasteLon = Coords[1]; Lat1 = Conversions.Degrees2SCT(Coords[0], true); Lon1 = Conversions.Degrees2SCT(Coords[1], false); output += OutputText(Lat0, Lon0, Lat1, Lon1); return(output); }
private void CenterFromChord() { // The center is perpendicular to the midpoint of the start/end chord // Since I'm always turning to the right, perpendicular is always +90 double Lat0 = (StartLat + EndLat) / 2.0; double Lon0 = (StartLon + EndLon) / 2.0; double Brg = (LatLongCalc.Bearing(StartLat, StartLon, EndLat, EndLon) + 90) % 360; double[] Coords = LatLongCalc.Destination(Lat0, Lon0, RadiusFromChordArc(), Brg, 'N'); CenterLat = Coords[0]; CenterLon = Coords[1]; CenterLatitudeTextBox.Text = Conversions.Degrees2SCT(CenterLat, true); CenterLongitudeTextBox.Text = Conversions.Degrees2SCT(CenterLon, false); CenterFixTextBox.Text = "<calculated from chord>"; StartBrg = (LatLongCalc.Bearing(CenterLat, CenterLon, StartLat, StartLon) + 90) % 360; StartRadialNUD.Value = (int)StartBrg; EndBrg = (LatLongCalc.Bearing(CenterLat, CenterLon, EndLat, EndLon) + 90) % 360; EndRadialNUD.Value = (int)EndBrg; }
private string BuildArcString() { string Lat0 = string.Empty; string Lon0 = string.Empty; string Lat1; string Lon1; string output = string.Empty; double[] Coords; if (CircleCheckBox.Checked) { StartBrg = 0; EndBrg = 360; } // Make sure we aren't crossing 360... if ((StartBrg + (EndBrg - StartBrg)) > 360) { for (double i = StartBrg; i < 360; i++) { Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, i, 'N'); Lat1 = Conversions.Degrees2SCT(Coords[0], true); Lon1 = Conversions.Degrees2SCT(Coords[1], false); output += OutputText(Lat0, Lon0, Lat1, Lon1); Lat0 = Lat1; Lon0 = Lon1; } for (double i = 1; i < EndBrg; i++) { Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, i, 'N'); Lat1 = Conversions.Degrees2SCT(Coords[0], true); Lon1 = Conversions.Degrees2SCT(Coords[1], false); output += OutputText(Lat0, Lon0, Lat1, Lon1); Lat0 = Lat1; Lon0 = Lon1; } } else { for (double i = StartBrg; i < EndBrg; i++) { Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, i, 'N'); Lat1 = Conversions.Degrees2SCT(Coords[0], true); Lon1 = Conversions.Degrees2SCT(Coords[1], false); output += OutputText(Lat0, Lon0, Lat1, Lon1); Lat0 = Lat1; Lon0 = Lon1; } } return(output); }
private string BuildRaceTrack() { string output = string.Empty; // Step 1 - build leg away from hold fix double StartLat = HoldLat; double StartLon = HoldLon; double StartBrg; double EndBrg; double EndLat; double EndLon; double[] Coords; string Lat0; string Lon0; string Lat1; string Lon1; double OutTrack = Track; if (InboundTrackRadioButton.Checked) { OutTrack = Track + 540 % 360; // Reverse track to outbnd } Coords = LatLongCalc.Destination(StartLat, StartLon, LegLnthDist, OutTrack, 'N'); EndLat = Coords[0]; EndLon = Coords[1]; Lat0 = Conversions.Degrees2SCT(PasteLat, true); Lon0 = Conversions.Degrees2SCT(PasteLon, false); Lat1 = Conversions.Degrees2SCT(EndLat, true); Lon1 = Conversions.Degrees2SCT(EndLon, false); output += OutputText(Lat0, Lon0, Lat1, Lon1); // Step 2 - Enter first turn StartLat = EndLat; StartLon = EndLon; // This is start of turn if (TurnRight) { StartBrg = (OutTrack + 270) % 360; EndBrg = (OutTrack + 90) % 360; } else { EndBrg = (OutTrack + 270) % 360; StartBrg = (OutTrack + 90) % 360; } Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, EndBrg, 'N'); double CenterLat = Coords[0]; double CenterLon = Coords[1]; // Center of arc output += BuildArcString(StartBrg, EndBrg, CenterLat, CenterLon); // Build Arc 1 // Step 3 - Return leg // Need to close the end of arc with next line Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius * 2, EndBrg, 'N'); StartLat = Coords[0]; StartLon = Coords[1]; Lat0 = Conversions.Degrees2SCT(PasteLat, true); Lon0 = Conversions.Degrees2SCT(PasteLon, false); Lat1 = Conversions.Degrees2SCT(StartLat, true); Lon1 = Conversions.Degrees2SCT(StartLon, false); output += OutputText(Lat0, Lon0, Lat1, Lon1); // Now draw the leg line double InTrack = (OutTrack + 180) % 360; Coords = LatLongCalc.Destination(StartLat, StartLon, LegLnthDist, InTrack, 'N'); EndLat = Coords[0]; EndLon = Coords[1]; Lat0 = Conversions.Degrees2SCT(StartLat, true); Lon0 = Conversions.Degrees2SCT(StartLon, false); Lat1 = Conversions.Degrees2SCT(EndLat, true); Lon1 = Conversions.Degrees2SCT(EndLon, false); output += OutputText(Lat0, Lon0, Lat1, Lon1); // Step 4 - Return arc if (TurnRight) { EndBrg = (OutTrack + 270) % 360; StartBrg = (OutTrack + 90) % 360; } else { StartBrg = (OutTrack + 270) % 360; EndBrg = (OutTrack + 90) % 360; } StartLat = EndLat; StartLon = EndLon; Coords = LatLongCalc.Destination(StartLat, StartLon, ArcRadius, EndBrg, 'N'); CenterLat = Coords[0]; CenterLon = Coords[1]; output += BuildArcString(StartBrg, EndBrg, CenterLat, CenterLon); if (DrawFixSymbol) { output += DrawFix_Symbol(); } if (DrawFixLabel) { output += DrawFix_Label(); } return(output); }