Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практика 2

.docx
Скачиваний:
0
Добавлен:
02.07.2025
Размер:
104.26 Кб
Скачать

Изменение графика при изменении угла с 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)

{

}

}

}

Соседние файлы в предмете Моделирование сетевых протоколов