//--------------------------------------------------------------- // //--------------------------------------------------------------- private void ReadSystemConfig(string cfg) { XmlDocument doc = new XmlDocument(); doc.Load(cfg); var nodes = doc.GetElementsByTagName("Body"); foreach (XmlNode node in nodes) { // Body data structure BodyData data = new BodyData(); // Read all "Body" nodes foreach (XmlNode subnode in node.ChildNodes) { // Read body parameters if (subnode.Name == "name") { data.name = subnode.InnerText; } if (subnode.Name == "id") { data.id = int.Parse(subnode.InnerText); } if (subnode.Name == "RefBody") { data.refBody = subnode.InnerText; } if (subnode.Name == "mass") { data.mass = double.Parse(subnode.InnerText, CultureInfo.InvariantCulture); } if (subnode.Name == "radius") { data.radius = double.Parse(subnode.InnerText, CultureInfo.InvariantCulture); } if (subnode.Name == "gravParameter") { data.gravParameter = double.Parse(subnode.InnerText, CultureInfo.InvariantCulture); } if (subnode.Name == "rotationPeriod") { data.rotationPeriod = double.Parse(subnode.InnerText, CultureInfo.InvariantCulture); } if (subnode.Name == "sphereOfInfluence") { if (subnode.InnerText != "Infinity") data.sphereOfInfluence = double.Parse(subnode.InnerText, CultureInfo.InvariantCulture); else data.sphereOfInfluence = 1e50; } if (subnode.Name == "initialRotation") { data.initialRotation = double.Parse(subnode.InnerText, CultureInfo.InvariantCulture); } if (subnode.Name == "Orbit") { data.orbit = new Orbit(); // Read body orbit parameters foreach (XmlNode orb_param in subnode.ChildNodes) { if (orb_param.Name == "semiMajorAxis") { data.orbit.a = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } if (orb_param.Name == "eccentricity") { data.orbit.e = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } if (orb_param.Name == "epoch") { data.orbit.t0 = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } if (orb_param.Name == "meanAnomalyAtEpoch") { data.orbit.M0 = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } if (orb_param.Name == "period") { data.orbit.period = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } if (orb_param.Name == "argPe") { data.orbit.omega = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } if (orb_param.Name == "LAN") { data.orbit.Omega = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } if (orb_param.Name == "inclination") { data.orbit.i = double.Parse(orb_param.InnerText, CultureInfo.InvariantCulture); } } } } CelestialBody Body = new CelestialBody(); Body.set_data(ref data); Bodies.Add(Body); } // Init reference IDs and radiuses for (int i = 0; i < Bodies.Count; i++) { string refBody = Bodies[i].get_ref_body(); int refId = get_body_index(refBody); if (refId != -1) { Bodies[i].set_refId(refId); Bodies[i].set_refRadius(Bodies[refId].get_radius()); Bodies[i].set_refGravParameter(Bodies[refId].get_gravParameter()); } } }
//--------------------------------------------------------------------- // //--------------------------------------------------------------------- private void buttonHomanSearch_Click(object sender, EventArgs e) { double t0 = KCalendar.date_to_sec(int.Parse(textBeginYear.Text.ToString()), int.Parse(comboBeginDay.Text.ToString()), int.Parse(comboBeginHour.Text.ToString()), int.Parse(comboBeginMin.Text.ToString()), int.Parse(comboBeginSec.Text.ToString())); double t1 = KCalendar.date_to_sec(int.Parse(textEndYear.Text.ToString()), int.Parse(comboEndDay.Text.ToString()), int.Parse(comboEndHour.Text.ToString()), int.Parse(comboEndMin.Text.ToString()), int.Parse(comboEndSec.Text.ToString())); int dep_idx = get_body_index(comboHomanArrivList.Text.ToString()); int arr_idx = get_body_index(comboHomanDepList.Text.ToString()); // Check same reference body!!! if (Bodies[dep_idx].get_ref_body() != Bodies[arr_idx].get_ref_body()) { labelNoTransfer.Text = "Bodies must have same reference body!\nPlease, change other bodies"; return; } Transfer trans = new Transfer(); double psi = Convert.ToDouble(textPsi.Text) * RAD; bool ready = Lambert.get_transfer_date(t0, t1, Bodies[dep_idx], Bodies[arr_idx], psi, ref trans); if (!ready) { panelHomanRes.Visible = false; labelNoTransfer.Text = "Transfer is imposible in changed period"; return; } labelNoTransfer.Text = ""; panelHomanRes.Visible = true; KDate deltaDate = new KDate(); KCalendar.DeltaDate(trans.arrivTime - trans.depTime, ref deltaDate); labelArivDate.Text = trans.depDate.year.ToString() + "y " + trans.depDate.day.ToString() + "d " + trans.depDate.hour.ToString() + "h " + trans.depDate.min.ToString() + "m " + trans.depDate.sec.ToString() + "s"; labelDepDate.Text = trans.arrivDate.year.ToString() + "y " + trans.arrivDate.day.ToString() + "d " + trans.arrivDate.hour.ToString() + "h " + trans.arrivDate.min.ToString() + "m " + trans.arrivDate.sec.ToString() + "s"; labelTransTime.Text = deltaDate.year.ToString() + "y " + deltaDate.day.ToString() + "d " + deltaDate.hour.ToString() + "h " + deltaDate.min.ToString() + "m " + deltaDate.sec.ToString() + "s"; labelSmiMajorAxis.Text = Math.Round(trans.orbit.a, 0).ToString() + " m"; labelEccentricity.Text = Math.Round(trans.orbit.e, 4).ToString(); labelInclination.Text = Math.Round(trans.orbit.i, 4).ToString() + " deg"; labelLAN.Text = Math.Round(trans.orbit.Omega, 4).ToString() + " deg"; labelArgPe.Text = Math.Round(trans.orbit.omega, 4).ToString() + " deg"; CelestialBody craft = new CelestialBody(); BodyData craft_data = new BodyData(); craft_data.name = "Space craft"; craft_data.orbit = trans.orbit; craft.set_data(ref craft_data); craft.set_refGravParameter(Bodies[dep_idx].get_refGravParameter()); DepManuever manuever = new DepManuever(); manuever.h = double.Parse(textAltitude.Text)*1000.0; manuever.turns = int.Parse(textWaitTurns.Text); Lambert.get_depatrure_manuever(Bodies[dep_idx], craft, trans.depTime, ref manuever); labelDeltaV.Text = Math.Round(manuever.dv, 2).ToString(); labelInc.Text = Math.Round(manuever.orbit.i, 4).ToString(); labelStartLAN.Text = Math.Round(manuever.orbit.Omega, 4).ToString(); labelEjectDate.Text = manuever.ejectDate.year.ToString() + "y " + manuever.ejectDate.day.ToString() + "d " + manuever.ejectDate.hour.ToString() + "h " + manuever.ejectDate.min.ToString() + "m " + manuever.ejectDate.sec.ToString() + "s"; double latDeg = double.Parse(textLatDeg.Text); double latMin = double.Parse(textLatMin.Text); double latSec = double.Parse(textLatSec.Text); double lonDeg = double.Parse(textLonDeg.Text); double lonMin = double.Parse(textLonMin.Text); double lonSec = double.Parse(textLonSec.Text); manuever.launchLat = (latDeg + latMin / 60.0 + latSec / 3600.0) * RAD; manuever.launchLon = (lonDeg + lonMin / 60.0 + lonSec / 3600.0) * RAD; if (radioButtonSouth.Checked) manuever.launchLat = -manuever.launchLat; if (radioButtonWest.Checked) manuever.launchLon = -manuever.launchLon; bool flag = Lambert.get_launch_params(Bodies[dep_idx], ref manuever); if (flag) { labelStartDate.Text = manuever.launchDate.year.ToString() + "y " + manuever.launchDate.day.ToString() + "d " + manuever.launchDate.hour.ToString() + "h " + manuever.launchDate.min.ToString() + "m " + manuever.launchDate.sec.ToString() + "s"; labelAzimuth.Text = Math.Round(manuever.azimuth, 2).ToString(); } // Draw trajectory DrawTransOrbit(panelTransOrbit, trans, Bodies[dep_idx], Bodies[arr_idx], craft); }