/// <summary> /// Extension method for parsing trajectory. /// </summary> /// <param name="trajectoryNode">Node with trajectory</param> /// <returns>Trajectory from xml.</returns> public static Trajectory ParseTrajectory(this XmlNode trajectoryNode) { Direction direction; if (trajectoryNode.FirstChild.Attributes["direction"] == null) { direction = Direction.CLOCKWISE; } else { string directionString = trajectoryNode.FirstChild.Attributes["direction"].Value; if (directionString.Equals("clockwise")) { direction = Direction.CLOCKWISE; } else { direction = Direction.COUNTERCLOCKWISE; } } Trajectory trajectory = null; switch (trajectoryNode.FirstChild.Name.ToLowerInvariant()) { case "stacionary": int x = trajectoryNode.FirstChild.Attributes["x"].IntValue(); int y = trajectoryNode.FirstChild.Attributes["y"].IntValue(); trajectory = new Stacionary(x, y); break; case "circularorbit": { int radius = trajectoryNode.FirstChild.Attributes["radius"].IntValue(); double initialAngle = trajectoryNode.FirstChild.Attributes["initialAngle"].DoubleValue(); int period = trajectoryNode.FirstChild.Attributes["period"].IntValue(); trajectory = new CircularOrbit(radius, period, direction, initialAngle); } break; case "ellipticorbit": { int a = trajectoryNode.FirstChild.Attributes["a"].IntValue(); int b = trajectoryNode.FirstChild.Attributes["b"].IntValue(); double rotationAngle = trajectoryNode.FirstChild.Attributes["angle"].DoubleValue(); double initialAngle = trajectoryNode.FirstChild.Attributes["initialAngle"].DoubleValue(); int period = trajectoryNode.FirstChild.Attributes["period"].IntValue(); trajectory = new EllipticOrbit(new Point2d(0.0, 0.0), a, b, rotationAngle, period, direction, initialAngle); } break; default: throw new XmlException("Unexpected trajectory."); } return(trajectory); }
private void AssertEqualsCircularOrbit(CircularOrbit expected, object actual) { Assert.IsNotNull(actual); Assert.IsInstanceOfType(actual, typeof(CircularOrbit)); CircularOrbit circularOrbit = (CircularOrbit)actual; Assert.AreEqual(expected.PeriodInSec, circularOrbit.PeriodInSec); Assert.AreEqual(expected.Direction, circularOrbit.Direction, "Invalid orbit direction"); Assert.AreEqual(expected.Radius, circularOrbit.Radius); Assert.AreEqual(expected.InitialAngleRad, circularOrbit.InitialAngleRad); }
public void ParseTrajectoryTest_Circular() { //string[] trajectoryParams = {"velocity", "5", "direction", "clockwise" }; string[] circleParams = { "velocity", "5", "direction", "clockwise", "x", "10", "y", "20", "radius", "30", "initialAngle", "90", "period", "5" }; CircularOrbit expectedOrbit = new CircularOrbit(30, 5, Direction.CLOCKWISE, 90); XmlNode trajectoryNode = this.GenerateTrajectoryNode("circularOrbit", circleParams); Debug.Assert(trajectoryNode != null, "Trajectory node is null"); Trajectory trajectory = trajectoryNode.ParseTrajectory(); AssertEqualsCircularOrbit(expectedOrbit, trajectory); }
/// <summary> /// Metoda nastavujici excentricitu orbity, je zde potreba velke mnozstvi matematiky, protoze pri zmene excentricity muze dojit ke zmene typu objektu /// </summary> /// <param name="newEccentricity">Nova excentricita</param> public void SetOrbitalEccentricity(double newEccentricity) { //TODO: Improve this math if (newEccentricity < 0 || newEccentricity >= 1) { throw new ArgumentOutOfRangeException("Kruh ma excentricitu 1, elipsa ma excentricitu v intervalu (0,1)"); } TryToSet(); //Nasledujici metody nejsou moc presne jelikoz transformace kruhu na ellipsu neni trivialni zalezitost if (LoadedObject is EllipticOrbit) { int newB = (int)Math.Round(Math.Sqrt(((EllipticOrbit)LoadedObject).A * ((EllipticOrbit)LoadedObject).A - newEccentricity * newEccentricity)); if (newB == 0) { CircularOrbit newOrbit = new CircularOrbit(0, 0, Direction.CLOCKWISE, 0); newOrbit.PeriodInSec = (int)((EllipticOrbit)LoadedObject).PeriodInSec; newOrbit.Radius = ((EllipticOrbit)LoadedObject).A; newOrbit.Direction = ((EllipticOrbit)LoadedObject).Direction; newOrbit.InitialAngleRad = ((EllipticOrbit)LoadedObject).InitialAngleRad; LoadedObject = newOrbit; } else { ((EllipticOrbit)LoadedObject).OrbitalEccentricity = newEccentricity; ((EllipticOrbit)LoadedObject).B = newB; } } if (LoadedObject is CircularOrbit) { if (newEccentricity > 0 && newEccentricity < 1) { EllipticOrbit newOrbit = new EllipticOrbit(new Point2d(0, 0), 0, 0, 0, 0, Direction.CLOCKWISE, 0); newOrbit.Barycenter = new Point2d(0, 0); newOrbit.A = ((CircularOrbit)LoadedObject).Radius; newOrbit.B = (int)Math.Round(Math.Sqrt(newOrbit.A * newOrbit.A - newEccentricity * newEccentricity)); //TODO: Correct transformation from circle to ellipse and backwards newOrbit.RotationAngleInRad = 0; newOrbit.PeriodInSec = ((CircularOrbit)LoadedObject).PeriodInSec; newOrbit.Direction = ((CircularOrbit)LoadedObject).Direction; newOrbit.InitialAngleRad = ((CircularOrbit)LoadedObject).InitialAngleRad; } } }
public void CircularOrbit2Test() { int period = 150; bool check = false; int accuracy = 5; String testOrbitDefinition = "Circular CCW orbit"; CircularOrbit testOrbit = new CircularOrbit(50, period, Direction.COUNTERCLOCKWISE, 0); Point2d orbitIn0 = this.RoundCoords(testOrbit.CalculatePosition(0), accuracy); Point2d orbitInT = this.RoundCoords(testOrbit.CalculatePosition(period), accuracy); Point2d orbitIn2T = this.RoundCoords(testOrbit.CalculatePosition(2 * period), accuracy); Point2d orbitIn5T = this.RoundCoords(testOrbit.CalculatePosition(5 * period), accuracy); Point2d orbitIn10T = this.RoundCoords(testOrbit.CalculatePosition(10 * period), accuracy); check = Debug.Equals(orbitIn0, orbitInT); Debug.Assert(check, testOrbitDefinition + " calculated position isn't same in 0 and T"); check = Debug.Equals(orbitIn0, orbitIn2T); Debug.Assert(check, testOrbitDefinition + " calculated position isn't same in 0 and 2*T"); check = Debug.Equals(orbitIn0, orbitIn5T); Debug.Assert(check, testOrbitDefinition + " calculated position isn't same in 0 and 5*T"); check = Debug.Equals(orbitIn0, orbitIn10T); Debug.Assert(check, testOrbitDefinition + " calculated position isn't same in 0 and 10*T"); }
/// <summary> /// Metoda pro vytvoreni elementu z trajektorie /// </summary> /// <param name="trajectory">Trajektorie pro zpracovani</param> /// <returns>Element s trajektorii</returns> private static XElement TrajectoryToElement(Trajectory trajectory) { XElement trajectoryElement = new XElement("trajectory"); XElement trajectoryShapeElement = null; if (trajectory is CircularOrbit) { CircularOrbit circOrbit = (CircularOrbit)trajectory; trajectoryShapeElement = new XElement("circularOrbit"); trajectoryShapeElement.Add(new XAttribute("direction", circOrbit.Direction.ToString().ToLower())); trajectoryShapeElement.Add(new XAttribute("period", circOrbit.PeriodInSec)); String initialAngle = Math.Round(MathUtil.RadianToDegree(circOrbit.InitialAngleRad)).ToString("0.0", CultureInfo.InvariantCulture); trajectoryShapeElement.Add(new XAttribute("initialAngle", initialAngle)); trajectoryShapeElement.Add(new XAttribute("radius", circOrbit.Radius)); } else if (trajectory is EllipticOrbit) { EllipticOrbit elliOrbit = (EllipticOrbit)trajectory; trajectoryShapeElement = new XElement("ellipticOrbit"); trajectoryShapeElement.Add(new XAttribute("direction", elliOrbit.Direction.ToString().ToLower())); trajectoryShapeElement.Add(new XAttribute("period", elliOrbit.PeriodInSec)); trajectoryShapeElement.Add(new XAttribute("a", elliOrbit.A)); trajectoryShapeElement.Add(new XAttribute("b", elliOrbit.B)); String angle = Math.Round(MathUtil.RadianToDegree(elliOrbit.RotationAngleInRad)).ToString("0.0", CultureInfo.InvariantCulture); trajectoryShapeElement.Add(new XAttribute("angle", angle)); String initialAngle = Math.Round(MathUtil.RadianToDegree(elliOrbit.InitialAngleRad)).ToString("0.0", CultureInfo.InvariantCulture); trajectoryShapeElement.Add(new XAttribute("initialAngle", initialAngle)); } else if (trajectory is Stacionary) { Stacionary stacOrbit = (Stacionary)trajectory; trajectoryShapeElement = new XElement("stacionary"); trajectoryShapeElement.Add(new XAttribute("x", stacOrbit.X)); trajectoryShapeElement.Add(new XAttribute("y", stacOrbit.Y)); } trajectoryElement.Add(trajectoryShapeElement); return(trajectoryElement); }
/// <summary> /// Metoda vracejici grafiku pro vykresleni /// </summary> /// <returns>Grafiky pro vykresleni</returns> public override Ellipse GetShape() { Brush brush = Brushes.White; Ellipse ellipse = new Ellipse(); double a = 0; double b = 0; double rotationAngle = 0; double xPos = Editor.dataPresenter.DrawingAreaSize; double yPos = Editor.dataPresenter.DrawingAreaSize; if (Trajectory is CircularOrbit) { CircularOrbit orbit = (CircularOrbit)Trajectory; a = orbit.Radius * Editor.dataPresenter.ObjectSizeRatio; b = a; //Point2d point = orbit.CalculatePosition(0); xPos -= a; yPos -= b; ellipse.Width = 2 * a; ellipse.Height = 2 * b; } else if (Trajectory is EllipticOrbit) { //EllipticOrbit orbit1 = this.startNavPoint.Location.Trajectory as EllipticOrbit; EllipticOrbit orbit = (EllipticOrbit)Trajectory; double cx = orbit.Cx * Editor.dataPresenter.ObjectSizeRatio; double cy = orbit.Cy * Editor.dataPresenter.ObjectSizeRatio; //setting ellipse ellipse.Width = 2 * orbit.A * Editor.dataPresenter.ObjectSizeRatio; ellipse.Height = 2 * orbit.B * Editor.dataPresenter.ObjectSizeRatio; //transformation prepare TransformGroup transformations = new TransformGroup(); //translation TranslateTransform translate = new TranslateTransform(cx, cy); transformations.Children.Add(translate); //rotation rotationAngle = MathUtil.RadianToDegree(orbit.RotationAngleInRad); RotateTransform rotateTransform = new RotateTransform(-rotationAngle); rotateTransform.CenterX = (orbit.A - orbit.OrbitalEccentricity) * Editor.dataPresenter.ObjectSizeRatio; rotateTransform.CenterY = (orbit.B) * Editor.dataPresenter.ObjectSizeRatio; transformations.Children.Add(rotateTransform); //finishing transformation ellipse.RenderTransform = transformations; brush = Brushes.Wheat; //setting drawing position xPos -= orbit.A * Editor.dataPresenter.ObjectSizeRatio; yPos -= orbit.B * Editor.dataPresenter.ObjectSizeRatio; #region junk //gr.RotateTransform((float)MathUtil.RadianToDegree(orbit.RotationAngleInRad)); //gr.TranslateTransform(cx, 0); //vycentrování elipsy //this.DrawEllipse(gr, orbitPen, 0, 0, orbit.A, orbit.B); //gr.TranslateTransform(-cx, 0); //vrácení zpět //gr.RotateTransform(-(float)MathUtil.RadianToDegree(orbit.RotationAngleInRad)); //a = orbit.Cx; //b = orbit.Cy; #endregion } else { throw new ArgumentException("Invalid trajectory"); } //a = (int)(a * Editor.dataPresenter.ObjectSizeRatio); //b = (int)(b * Editor.dataPresenter.ObjectSizeRatio); //a,b = semi-axis //placement logic //Editor.Log("size: " + Editor.dataPresenter.DrawingAreaSize + ", a:" + a); //Editor.Log("Trajectory: " + xPos + ":" + yPos); ellipse.Stroke = brush; ellipse.StrokeThickness = 1; Point2d drawingPoint = new Point2d(xPos, yPos); this.Position = drawingPoint; return(ellipse); }