private void DoSimulation(SimData simData, double fTimeDelta) { simData.ElapsedSeconds += fTimeDelta * simData.SimulationSpeed; double time = simData.ElapsedSeconds; simData.CurrentEarthRotation = (float)(time % simData.RealEarthPeriode / simData.RealEarthPeriode * 2 * Math.PI); for (int i = 0; i < simData.Satellites.Length; i++) { var satellite = simData.Satellites[i]; if (satellite.IsVisible) { CalculateSatelitePosition(satellite, time); } } }
// // simulation stuff // private void InitSimulationData(SimData simData) { simData.CurrentEarthRotation = 0; simData.SimulationSpeed = 1000.0f; simData.SimulationSizeScalar = 0.001f; var satelites = new List <SatelliteSimData>(); var satDataStream = Utils.OpenEmbeddedResource("vissatellite.simdata.UCS_Satellite_Database_9-1-2017.txt"); var streamReader = new System.IO.StreamReader(satDataStream); streamReader.ReadLine(); string line; var rand = new Random(); while ((line = streamReader.ReadLine()) != null) { string[] elements = line.Split('\t'); var satelite = new SatelliteSimData(); satelite.IsVisible = true; satelite.IsSelected = false; satelite.Name = elements[0]; switch (elements[4]) { case "Civil": satelite.Users = SatelliteUsers.CIVIL; break; case "Military": satelite.Users = SatelliteUsers.MILITARY; break; case "Government": satelite.Users = SatelliteUsers.GOVERNMENT; break; case "Commercial": satelite.Users = SatelliteUsers.COMMERCIAL; break; default: satelite.Users = SatelliteUsers.MIXED; break; } switch (elements[7]) { case "LEO": satelite.ClassOfOrbit = OrbitType.LEO; break; case "MEO": satelite.ClassOfOrbit = OrbitType.MEO; break; case "GEO": satelite.ClassOfOrbit = OrbitType.GEO; break; case "Elliptical": satelite.ClassOfOrbit = OrbitType.ELLIPTICAL; break; } //Read all the data we have if (!elements[9].Equals("")) { satelite.LongitudeOfGeo = float.Parse(elements[9], CultureInfo.InvariantCulture); } satelite.Perigee = float.Parse(elements[10].Replace("\"", "").Replace(",", "")); satelite.Apogee = float.Parse(elements[11].Replace("\"", "").Replace(",", "")); satelite.Eccentricity = float.Parse(elements[12], CultureInfo.InvariantCulture); satelite.Inclenation = float.Parse(elements[13], CultureInfo.InvariantCulture) * (float)Math.PI / 180; satelite.Periode = float.Parse(elements[14].Replace("\"", ""), CultureInfo.InvariantCulture) * 60; //Calculated what we need satelite.SemiMajorAxis = (float)(satelite.Apogee + satelite.Perigee + simData.RealEarthDiameter) / 2; //Generate random values for needed object elements that are not in the dataset satelite.LongitudeOfAscendingNode = (float)(rand.NextDouble() * Math.PI * 2); satelite.ArgumentOfPeriapsis = (float)(rand.NextDouble() * Math.PI * 2); satelite.Position = new Vector3(0, 0, 0); satelites.Add(satelite); } simData.Satellites = satelites.ToArray(); }