
Практика 2
.docxИзменение графика при изменении угла с 85 градусов до 2 градусов представлены ниже:
Приложение
Части кода, где происходят расчёты траектории или дальности или высоты подчеркнуты, остальное для правильной отрисовки или вывода на экран.
using System.Windows.Forms;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Pr2
{
public partial class Form1 : Form
{
private const double G = 9.8; // Ускорение свободного падения
private const double V0 = 50; // Начальная скорость
private Bitmap bitmap;
public Form1()
{
InitializeComponent();
// Инициализация trackBar
trackBarAngle.Minimum = 0;
trackBarAngle.Maximum = 89;
trackBarAngle.Value = 45;
trackBarAngle.Scroll += TrackBarAngle_Scroll;
bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
}
private void TrackBarAngle_Scroll(object sender, EventArgs e)
{
labelAngleValue.Text = $"Угол: {trackBarAngle.Value}°";
button1_Click(sender, e);
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void DrawTrajectory(double angleRad, double totalTime)
{
int width = pictureBox1.Width;
int height = pictureBox1.Height;
using (Graphics g = Graphics.FromImage(bitmap))
{
g.Clear(Color.White);
Pen pen = new Pen(Color.Red, 2);
Font font = new Font("Arial", 9);
Brush textBrush = Brushes.Black;
const int minMargin = 40;
int margin = (int)Math.Max(minMargin, Math.Min(width / 10, height / 10));
const double maxRangeFixed = 255;
double max_y = (V0 * Math.Sin(angleRad) * totalTime - 0.5 * G * totalTime * totalTime);
if (max_y < 0) max_y = 0;
double scaleX = (width - 2 * margin) / maxRangeFixed;
double scaleY = (height - 2 * margin) / max_y;
if (max_y == 0)
{
scaleY = 1;
}
g.DrawLine(Pens.Gray, margin, height - margin, width - margin, height - margin);
g.DrawLine(Pens.Gray, margin, height - margin, margin, margin);
// подписи по X
for (int i = 0; i <= (int)maxRangeFixed; i += 20)
{
int xGrid = (int)(i * scaleX) + margin;
g.DrawLine(Pens.LightGray, xGrid, height - margin, xGrid, margin);
g.DrawString(i.ToString(), font, textBrush, xGrid - 10, height - margin + 5);
}
// траектория
double dt = 0.05;
double xPrev = 0, yPrev = 0;
for (double t = 0; t <= totalTime; t += dt)
{
double x = V0 * Math.Cos(angleRad) * t;
double y = V0 * Math.Sin(angleRad) * t - 0.5 * G * t * t;
int screenX = (int)(x * scaleX) + margin;
int screenY = height - margin - (int)(y * scaleY);
if (t > 0)
{
g.DrawLine(pen, (int)xPrev, (int)yPrev, screenX, screenY);
}
xPrev = screenX;
yPrev = screenY;
}
// угл
g.DrawString($"Угол: {trackBarAngle.Value}°", font, textBrush, margin, margin / 2);
}
pictureBox1.Image = bitmap;
}
private void button1_Click(object sender, EventArgs e)
{
double angleDeg = trackBarAngle.Value;
if (angleDeg == 15|| angleDeg == 64 || angleDeg == 72)
{
angleDeg = angleDeg - 1;
}
double angleRad = angleDeg * Math.PI / 180;
double vx = V0 * Math.Cos(angleRad);
double vy = V0 * Math.Sin(angleRad);
double timeTotal = (2 * vy) / G;
double maxHeight = (vy * vy) / (2 * G);
double range = (V0 * V0 * Math.Sin(2 * angleRad)) / G;
labelHeight.Text = $"Макс. высота: {maxHeight:F2} м";
labelDistance.Text = $"Дальность: {range:F2} м";
DrawTrajectory(angleRad, timeTotal);
}
private void label2_Click(object sender, EventArgs e)
{
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
}
}