Траектория тела, брошенного под углом к горизонту
Рассмотрим движение материальной точки, брошенной под углом к горизонту в поле силы тяжести. Сопротивление воздуха не учитывается. Уравнение движения рассматриваемой системы и начальные условия имеют вид:
где
и — масса и радиус-вектор материальной точки, — сила тяжести, — начальная скорость, — время, точкой обозначена производная по времени, векторы выделены жирным шрифтом. Интегрирование уравнения движения по времени с учетом начальных условий даетПроецируя полученное векторное уравнение на горизонтальную и вертикальную оси
и получимгде
— угол между направлением начальной скорости и горизонтальным направлением (угол броска). После исключения времени из этих уравнений получим уравнение траекторииТаким образом, траектория является параболой, отображенной на интерактивном графике ниже. Сравнивается траектория, соответствующая
и оптимальная траектория, реализующаяся при и обеспечивающая максимальную дальность броска. Перемещение слайдера позволяет наблюдать влияние угла броска на форму траектории (модуль начальной скорости при этом остается неизменным).
function MainMG(canvas) {
// Предварительные установки
var deg = Math.PI / 180; // Угловой градус (degree)
var X_max = canvas.width;
var Y_max = canvas.height;
// Размерные параметры
var g = 1.; // ускорение свободного падения var v0 = 1.; // начальная скорость
// Расчет констант
var h = v0 * v0 / 2 / g;
// Задание начальных значений параметров
var al = 60 * deg;
// Область построения графика
var x_min = 0; var x_max = 2 * h; var y_min = 0; var y_max = h;
var N = X_max; // число точек по оси x
var dx = x_max / N; // шаг по оси x var sx = X_max / x_max; // масштаб по оси x
var sy; // масштаб по оси y var Y0; // положение 0 оси y в экранных координатах var context; // на context происходит рисование
// настройка слайдеров и текстовых полей
Text_01.value = Math.round(al / deg);
Slider_01.min = 0;
Slider_01.max = 90; Slider_01.step = 1; Slider_01.value = Text_01.value;
draw();
// функция, запускающаяся при перемещении слайдера this.set_01 = function(input) { al = input * deg; draw(); }
// Функции, запускающиеся при изменении элементов управления
this.setCheckbox_01 = function(bool) { draw(); }
this.setCheckbox_02 = function(bool) { draw(); }
// Отображение
function draw() { // Расчет параметров графики
sy = Y_max / (y_max - y_min); // масштаб по оси y Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах
context = canvas.getContext("2d"); // на context происходит рисование context.clearRect(0, 0, X_max, Y_max); // очистить экран
// Графики
Graph(F0, checkbox_02.checked, 'lightgrey'); Graph(F1, checkbox_01.checked, 'black');
// Надписи context.fillStyle = 'black'; context.font = "italic 20px Times"; context.fillText("x", x_max * sx - 15, Y0 - 7); context.fillText("y", 5, 15); context.fillText("0", 10, Y0 - 3);
}
// Построение графика функции
function Graph(F, flag, color) { if (!flag) return;
context.strokeStyle = color; context.beginPath(); for (var x = x_min; x < x_max; x += dx) { var y = F(x); var X = x * sx; var Y = Y0 - y * sy; context.lineTo(X, Y); } context.stroke(); }
// Траектории // al = 45 * deg;
function F0(x)
{
var y = x - g / (v0 * v0) * x * x; return y;
}
// Произвольное al
function F1(x)
{
var t = x / v0 / Math.cos(al) var y = v0 * Math.sin(al) * t - g * t * t / 2; return y;
}
} </syntaxhighligh> Файл "mg.html" <syntaxhighlight lang="html" line start="1" enclose="div"> <!DOCTYPE html> <html> <head>
<meta charset="UTF-8" /> <title>mg</title> <script src="mg.js"></script>
</head> <body>
<canvas id="canvasGraph" width="400" height="200" style="border:1px solid #000000;"></canvas>
Траектория: —
<input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>актуальная, — <input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>оптимальная (α = 45˚)
Угол броска:
α = <input id="Text_01" style="width: 2.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
// если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false if (!this.checkValidity()) return; app.set_01(this.value); document.getElementById('Slider_01').value = this.value; ">˚
<input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
<script type="text/javascript">var app = new MainMG( document.getElementById('canvasGraph') );</script>
</body> </html> </syntaxhighligh> </toggledisplay>