/// <summary> /// Отрисовка траектории движения частицы /// </summary> /// <param name="args">Параметры модели</param> /// <returns>Путь к html-файлу с графиком движения частицы</returns> public static string BuildPlot(TrajectoryCalculatorArgs args) { var points = TrajectoryCalculator.Calculate(args); var plot = new Plot ( Plot.traces ( Traces.scatter3d ( Scatter3d.x(GetCoordinates(points, point => point.X)), Scatter3d.y(GetCoordinates(points, point => point.Y)), Scatter3d.z(GetCoordinates(points, point => point.Z)), Scatter3d.mode(Scatter3d.Mode.lines()) ) ), Plot.layout ( Layout.autosize(true), Layout.margin ( Margin.l(0), Margin.t(0), Margin.r(0), Margin.b(0) ), Layout.scene ( Scene.Aspectmode.data() ) ) ); var plotFileName = "plot.html"; File.WriteAllText ( plotFileName, plot .Render() .ToString() .Replace("<body>", "<body style=\"overflow: hidden\">") .Replace("height: 100%", "height: 100vh;") .Replace("https://cdn.plot.ly/plotly-latest.min.js", "plotly.js") ); return(plotFileName); }
/// <summary> /// Расчет траектории движения заряженной частицы в магнитном поле /// </summary> /// <param name="args">Параметры модели</param> /// <returns>Траектория движения частицы</returns> public static List <Vector3D> Calculate(TrajectoryCalculatorArgs args) { Requires.NotNull(args, nameof(args), "Не заданы параметры движения частицы"); var dt = args.T / args.N; Vector3D a; var v = args.V0; var r = args.R0; var trajectory = new List <Vector3D>(); trajectory.Add(args.R0); for (var i = 0; i < args.N; i++) { a = args.Q / args.M * v.Cross(args.B); r = r + v * dt + a * dt * dt / 2; v = v + a * dt; trajectory.Add(r); } return(trajectory); }