public SpacecraftState(Spacecraft sc) { this._kepler_orbit = sc.getKeplerOrbit(); this._initial_orientation = sc.getInitialOrientation(); this._orientation_transition = sc.getOrientationTransition(); this.orientation_given = sc.isOrientationGiven(); this._fixed_position = sc._fixed_position; this.fixedPositionGiven = sc.fixedPositionGiven; }
public void doCalculationsLogic(Spacecraft sc, double time) { int step = sc.addSpacecraftState(time); SpacecraftState scState = sc.getSpacecraftState(step); double simTime = sc.getSpacecraftState(step).getTime(); Vector3D position = sc.getSpacecraftState(step).getPosition(); Vector3D sun_position = sc.getSpacecraftState(step).getSunPosition(); Quaternion orientation = sc.getSpacecraftState(step).getOrientation(); Console.WriteLine(" Simulation time point #" + this.loopCount.ToString("D5") + ": " + simTime + " MJD (" + tools.MJDtoUTC(simTime).ToString("s") + " UTC)"); Console.WriteLine(" --------------------------------------------------------------------------------------------------------------"); Console.WriteLine(); Console.WriteLine(" Calculating spacecraft position at given simulation time..."); Console.WriteLine(" Result:"); Console.WriteLine(" x = " + position.x().ToString(Program.scientificFormat) + " m (" + tools.m2AU(position.x()).ToString(Program.scientificFormat) + " AU)"); Console.WriteLine(" y = " + position.y().ToString(Program.scientificFormat) + " m (" + tools.m2AU(position.y()).ToString(Program.scientificFormat) + " AU)"); Console.WriteLine(" z = " + position.z().ToString(Program.scientificFormat) + " m (" + tools.m2AU(position.z()).ToString(Program.scientificFormat) + " AU)"); Console.WriteLine(); if (sc.isOrientationGiven()) { Console.WriteLine(" Calculating spacecraft orientation at given simulation time..."); Console.WriteLine(" Result (Quaternion):"); Console.WriteLine(" q_0 = " + orientation.r().ToString(Program.scientificFormat)); Console.WriteLine(" q_1 = " + orientation.v().x().ToString(Program.scientificFormat)); Console.WriteLine(" q_2 = " + orientation.v().y().ToString(Program.scientificFormat)); Console.WriteLine(" q_3 = " + orientation.v().z().ToString(Program.scientificFormat)); Console.WriteLine(); } Console.WriteLine(" Calculating Sun position at given simulation time..."); Console.WriteLine(" Result:"); Console.WriteLine(" x = " + sun_position.x().ToString(Program.scientificFormat) + " m (" + tools.m2AU(sun_position.x()).ToString(Program.scientificFormat) + " AU)"); Console.WriteLine(" y = " + sun_position.y().ToString(Program.scientificFormat) + " m (" + tools.m2AU(sun_position.y()).ToString(Program.scientificFormat) + " AU)"); Console.WriteLine(" z = " + sun_position.z().ToString(Program.scientificFormat) + " m (" + tools.m2AU(sun_position.z()).ToString(Program.scientificFormat) + " AU)"); Console.WriteLine(); string filename = this.getOutputPath() + "MoonSurfIllumSim_step_" + this.loopCount.ToString("D5"); Console.WriteLine(" Ray tracing scene (Dynamical Surface Pattern Selection Algorithm - DSPSA)..."); this.generatePOVRayFile(sc.getSpacecraftState(step), filename); Console.WriteLine(" POV-Ray file written to \"" + filename + ".pov\""); Console.WriteLine(" Rendering using POV-Ray..."); Process pov = new Process(); pov.StartInfo.FileName = this._pov_path + "pvengine64.exe"; pov.StartInfo.Arguments = "/EXIT Quality=11 Antialias_Depth=3 Antialias=On Antialias_Threshold=0.1 Jitter_Amount=0.5 Jitter=On Width=" + this._width + " Height=" + this._height + " Antialias=On Antialias_Threshold=0.3 /RENDER \"" + filename + ".pov\""; pov.Start(); pov.WaitForExit(); if (Program.writeAnnotation) { Console.WriteLine(" Regenerating rendering with annotations..."); FileStream myStream = new FileStream(filename + ".png", FileMode.Open); Image myBitmap = Image.FromStream(myStream); myStream.Close(); myStream.Dispose(); Graphics g = Graphics.FromImage(myBitmap); //g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; float fontSize = (float)Convert.ToDouble(this._width) * 0.0095F; Font myFont = new Font("Consolas", fontSize); Quaternion rotQuat; if (sc.isOrientationGiven()) { rotQuat = scState.getOrientation(); } else { double phi = Math.Atan2(scState.getPosition().y(), scState.getPosition().x()); double theta = Math.Acos(scState.getPosition().z() / (scState.getPosition().norm())); rotQuat = new RotationQuaternion(new Vector3D(0, 1, 0), theta) * new RotationQuaternion(new Vector3D(0, 0, 1), -phi); } // Local Solar Illumination Angle Pen pen = new Pen(Color.Red, 2); pen.StartCap = LineCap.SquareAnchor; pen.EndCap = LineCap.Round; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; SolidBrush redBrush = new SolidBrush(Color.Red); foreach (var pixel in scState.PixelInfo) { double x1 = pixel.Key.x(); double y1 = pixel.Key.y(); Vector2D endPoint = new Vector2D(x1, y1) + new Vector2D(0, this.gridH/2).rotate(tools.deg2rad(pixel.Value.IlluminationAngle)); g.DrawLine(pen, new Point(Convert.ToInt32(x1), Convert.ToInt32(y1)), new Point(Convert.ToInt32(endPoint.x()), Convert.ToInt32(endPoint.y()))); g.FillEllipse(redBrush, (float)x1 - 3F, (float)y1 - 3F, 6, 6); } // Annotations to be written g.DrawString("Simulation Timecode: " + scState.getTime().ToString(Program.scientificFormat) + " MJD (" + tools.MJDtoUTC(simTime).ToString("s") + "Z UTC)", myFont, Brushes.White, new PointF(2 * fontSize, 1 * 1.8F * fontSize)); g.DrawString("S/C Position: [" + scState.getPosition().x().ToString(Program.scientificFormat) + "," + scState.getPosition().y().ToString(Program.scientificFormat) + "," + scState.getPosition().z().ToString(Program.scientificFormat) + "] m", myFont, Brushes.White, new PointF(2 * fontSize, 2 * 1.8F * fontSize)); g.DrawString("S/C Orientation Quaternion: [" + rotQuat.v().x().ToString(Program.scientificFormat) + "," + rotQuat.v().y().ToString(Program.scientificFormat) + "," + rotQuat.v().z().ToString(Program.scientificFormat) + "," + rotQuat.r().ToString(Program.scientificFormat) + "]", myFont, Brushes.White, new PointF(2 * fontSize, 3 * 1.8F * fontSize)); g.DrawString("Sun Position: [" + scState.getSunPosition().x().ToString(Program.scientificFormat) + "," + scState.getSunPosition().y().ToString(Program.scientificFormat) + "," + scState.getSunPosition().z().ToString(Program.scientificFormat) + "] m", myFont, Brushes.White, new PointF(2 * fontSize, 4 * 1.8F * fontSize)); g.DrawString("Flight Altitude over MMR: " + (scState.getPosition().norm() - 1.73715E6).ToString(Program.scientificFormat) + " m", myFont, Brushes.White, new PointF(2 * fontSize, 5 * 1.8F * fontSize)); g.DrawString("Surface Mesh Resolution: " + this._res.ToString() + " px/deg", myFont, Brushes.White, new PointF(2 * fontSize, 6 * 1.8F * fontSize)); g.DrawString("FOV: " + this._FOV.ToString() + " deg (hor. & vert.), optics: perspective camera", myFont, Brushes.White, new PointF(2 * fontSize, 7 * 1.8F * fontSize)); g.DrawString("Moon Surface Illumination Simulation Framework (MSISF), v" + Program.VERSION, new Font("Tahoma", fontSize), Brushes.White, new PointF(2 * fontSize, (float)Convert.ToDouble(this._height) - 3 * 1.8F * fontSize)); g.DrawString("B.Eng. René Schwarz (rene-schwarz.com), more Information: http://go.rene-schwarz.com/masters-thesis", new Font("Tahoma", fontSize), Brushes.White, new PointF(2 * fontSize, (float)Convert.ToDouble(this._height) - 2 * 1.8F * fontSize)); myBitmap.Save(filename + ".annotated.png"); myBitmap.Dispose(); } Console.WriteLine(); Console.WriteLine(); this.loopCount++; }