Введение
Современный уровень развития и распространения компьютерных технологий дает возможность, а также, в свою очередь, определяет способ представления информации в графическом виде как наиболее оптимальной для восприятия и анализа [1,2]. Также особо следует выделить образование и сферы научного исследования, где моделирование различных процессов является эффективным и широко используемым инструментом. В связи с этим была сформулирована задача визуализации криволинейных процессов. В качестве средства реализации был выбран популярный сегодня языка Python, возможности которого позволяют реализовать поставленные задачи [8].
Целью работы было разработать на языке программирования Python графическое приложение для моделирования стрельбы из пушки на плоскости. Сопротивление воздуха не учитывать. Пушка должна обладать прицелом, отображающем расчетную точку попадания снаряда.
Математическая модель
В качестве модели, описывающей движение снаряда, была выбрана простейшая модель, отвечающая заданным в постановке задачи условиям, описывающая положение снаряда на момент времени согласно следующим уравнениям:
Где и координаты снаряда по осям и в момент времени соответственно, – угол наклона выстрела к горизонту, – начальная скорость снаряда, – время полета снаряда, – ускорение свободного падения, взято равным 9,8 м/c2.
Для управления наклоном ствола абстрактной пушки была составлена система уравнений, полученной из:
1. общей формулы прямой между двумя точками, использующейся при создании алгоритма Брезенхэма рисования прямой линии на ЭВМ [4],
2. формулы расстояния между двумя точками (в случае задачи это основание ствола пушки и конца пушки).
Учитывая, что в рамках данной задачи можно ограничиться решением для первой координатной четверти, т.к. мы всегда можем выполнять преобразования систем координат по типу аффинных, если нам потребуется, например, масштабирование одной системы координат в другой или их поворот и перемещения. А также очевидно, что в рамках данной системы по смыслу , , и . Таким образом, система
может быть упрощена до
где – длина отрезка между точкой начала координат, совпадающей с точкой начала ствола и курсором мыши, а и – координаты этого курсора.
Анимация
Задача анимации заключается в комфортном для зрителя восприятии отображаемых процессов. Для плавной анимации полета снаряда будет производиться рендеринг при помощи смены некоторого числа кадров. Был исследован вопрос об оптимальном числе кадром. Если сделать их число фиксированным, то при стрельбе по длинной траектории, снаряд будет лететь намного быстрее, чем при стрельбе по короткой. Таким образом, количество кадров при стрельбе должно зависеть от длины траектории полета снаряда.
Однако, снаряд летит по параболе, а вычисление её длинны довольно ресурсоемкая процедура, требующая численных методов интегрирования, что не оптимально с точки зрения производительности задачи программного рендеринга. Поскольку человеческий глаз и восприятие не идеальны и обладают естественными для людей особенностями [3, 7], то на практике для расчета числа кадров оказалось достаточным аппроксимировать параболу простой ломаной линией с одной единственной точкой излома в самой верхней её точке, тогда экспериментальным путем было подобрано количество кадров порядка 30 в секунду.
Разработка алгоритма программы
После получения минимально необходимой математической модели был разработан алгоритм для приложения. В общих чертах его логику можно описать следующим образом:
1. Создание необходимых объектов для отрисовки и переменных, описывающих начальные параметры модели, таких как начальную скорость снаряда и ускорение свободного падения
2. Код для отрисовки начального положения пушки и прицела, а также поверхности по которой проводится стрельба
3. Реализация поворота пушки, согласно наведению прицела при помощи курсора мыши с помощью функции rotate_cannon, которая наводит ствол пушки на одну прямую с курсором мыши, а также отмечает расчетное место попадания снаряда на поверхности
4. Для стрельбы была разработана функция shoot_ball, которая отрисовывает анимацию полета снаряда по траектории, описываемой моделью [5,6].
Таким образом, было получено всё необходимое для разработки кода нашей программы, который приведен ниже в полном объеме с поясняющими комментариями на языке Python:
# -*- coding: utf-8 -*-
import math
import time
from tkinter import *
scene_width = 640
scene_height = 480
c = Canvas(width=scene_width, height=scene_height, bg='grey80')
c.pack()
cannon_length = 70
v = 70
g = 9.8
def rotate_cannon(x_i, y_i):
mn = y_i/x_i
y = (mn * cannon_length) / (math.sqrt(mn * mn + 1))
x = math.sqrt(cannon_length * cannon_length - y * y)
c.coords(cn, 0, scene_height-10, int(x), scene_height-10-int(y))
angle = math.atan2(x_i, y_i) # угол наклона ствола пушки
t = 2*v*math.sin(1.5707963267948966-angle)/g
x_t = v*t*math.cos(1.5707963267948966-angle) # координата прицела
c.coords(cursor, int(x_t-5), scene_height-15, int(x_t+5), scene_height-5)
return
def motion(event):
if event.x > 0 and event.y < scene_height-10:
rotate_cannon(float(event.x), float(470-event.y))
return
def shoot_ball(event):
ball = c.create_oval(-5, scene_height-15, 5, scene_height-5, fill='yellow')
angle = math.atan2(float(event.x), float(470-event.y)) # угол выстрела
delta_t = 2*v*math.sin(1.5707963267948966-angle)/g # время полета снаряда
x_t = v*delta_t*math.cos(1.5707963267948966-angle)/10 # расстояние приземления снаряда
y_max = v*delta_t/2*math.sin(1.5707963267948966-angle)-g*delta_t*delta_t/8 # максимальная высота полета снаряда
"""Теперь, чтобы не проводить вычисления без лишней необходимости, длину кривой по которой летит снаряд для увеличения зависимости количества кадров от параметров выстрела, мы будем аппроксимировать ломаной кривой из 2-ух отрезков, точка начала полета снаряда, точка максимума по y и точка приземления снаряда.
Это позволит нам сделать более реалистичной анимацию полета снаряда, что будет комфортно для пользователя.
"""
length = 2*math.sqrt(x_t*x_t/4+y_max*y_max) # грубая оценка длины траектории
num_frames = int(length/delta_t) # количество кадров для отрисовки
delta_t = delta_t / num_frames
for i in range(num_frames): # цикл отрисовки
x_ball = v*(i+1)*delta_t*math.cos(1.5707963267948966-angle)
y_ball = v*(i+1)*delta_t*math.sin(1.5707963267948966-angle)-g*(i+1)*delta_t*(i+1)*delta_t/2
c.coords(ball, int(x_ball-5), scene_height-y_ball-15, int(x_ball+5), scene_height-y_ball-5)
c.update()
time.sleep(0.02)
c.coords(ball, int(x_ball - 5), scene_height - y_ball - 15, int(x_ball + 5), scene_height - y_ball - 5)
return
c.bind('<Motion>', motion)
c.bind('<Button 1>', shoot_ball)
c.create_oval(-25, 445, 25, 495, fill='#141414')
c.create_rectangle(25, scene_height-10, 0, scene_height, fill='#141414')
cn = c.create_line(0, scene_height-10, cannon_length, scene_height-10, width=10, fill='#141414')
c.create_line(0, scene_height-10, scene_width, scene_height-10, width=1, fill='black')
cursor=c.create_oval(cannon_length, scene_height-15, cannon_length+10, scene_height-5, fill='red')
mainloop()
Конечно, данный код можно оптимизировать, например, вынеся расчеты часто проводимых фрагментов функций в отдельные переменные, но это усложнит простоту понимания примера, а скорость работы кода достаточна для плавной анимации на ЭВМ, предоставленных для данной работы.
Скриншоты работы программы приведены ниже. На рисунке 1 показаны пушка, прицел и указатель мыши для настройки параметров задачи в начальный момент времени. На рисунке 2 – пушка и снаряд в конечный момент времени.
Рис. 1 Пушка и прицел
Рис. 2 Пушка после выстрела
Выводы
В результате данной работы была выработана математическая модель, адаптированная к процессу визуализации на компьютере. Исследован процесс анимации и его особенности с моделированием криволинейных процессов. Разработана программа на Python с программной библиотекой tkinter.
В ходе выполнения задачи было разработано приложение, отвечающее требованиям поставленной задачи. Данное приложение можно рассматривать как базовое для дальнейшей реализации процесса визуализации как с дополнительными параметрами этой модели, так и для других задач этого класса.
Библиографическая ссылка
Черников А.С., Горбунова Т.Н. ВИЗУАЛИЗАЦИЯ МОДЕЛИРОВАНИЯ ФИЗИЧЕСКИХ ЗАКОНОВ // Международный студенческий научный вестник. – 2018. – № 1. ;URL: https://eduherald.ru/ru/article/view?id=18047 (дата обращения: 07.12.2024).