Моделювання руху об’єкта
ПРАКТИЧНА РОБОТА 19
Завдання: камінь кинуто горизонтально зі 100-метрової вежі зі швидкістю [latex]\upsilon[/latex] м/с.
Скласти математичну модель польоту каменя.
Написати програму, яка буде обчислювати і друкувати значення відстані від вежі по горизонталі і висоту над землею кожні 0,2 секунди польоту каменя.
Обладнання: комп’ютер із середовищем програмування мовою Python.
Хід роботи
Під час роботи за комп’ютером дотримуйтеся правил безпеки.
2. У Python IDLE виконайте команду File → New File.
3. Підготуйте зображення вежі.
Для цього у графічному редакторі встановіть розмір малюнка 400 × 450 пікселів.
Створіть папку Pract18 і збережіть у ній графічний файл і файл програми вежа.ру.
4. Завантажте модулі tkinter, time.
Створіть вікно програми із заголовком Камінь падає з вежі (див. рисунок).
5. Додайте у вікно програми константи, потрібні для подальших розрахунків і побудов:
h0 = 100 # Висота вежі
scale = 4 # Масштаб малюнка (в пікселях на 1 м)
dk = 20 # Діаметр круга, який зображає камінь
x0, y0 = 100, 20 # Початкові координати круга на полотні
6. Додайте у вікно програми віджети класу Label і класу Entry згідно з рисунком.
Label(text = 'V = ', font = 'Arial 14').grid(row = 1, column = 0)
en = Entry(width = 8, font = 'Arial 14')
en.grid(row = 1, column = 1)
Label(text = ' s\th', font = 'Arial 14').grid(row = 2, column = 0, columnspan = 2, sticky = W)
7. Додайте у вікно програми віджет txt класу Text для виведення координат каменя під час падіння.
txt = Text(width = 20, height = 22, font = 'Arial 12') # Створюємо об’єкт класу Text
txt.grid(row = 3, column = 0, columnspan = 2)
8. Створіть віджет btn класу Button із написом Обчислити.
9. Додайте об’єкт cnv класу Сanvas розміром 400 × 450. Додайте на полотно малюнок із зображенням вежі.
cnv = Canvas(width = 400, height = 450) cnv.grid(row = 1, column = 2, rowspan = 4)
im = PhotoImage(file = '1.gif')
cnv.create_image(0, 0, anchor = NW, image = im)
10. Створіть обробник події для кнопки Обчислити. Обчислення тривають доти, поки dh<h (поки камінь не впав на землю).
x, y = x0, y0 # Поточні координати круга на полотні
ov = cnv.create_oval(x, y, x+dk, y+dk, fill = 'red') # Створення круга
v = int(en.get()) # Введена початкова швидкість
dh = 0 # Вертикальне зміщення каменя (0 – на вершині)
t = 0 # Початок відліку часу
txt.delete(1.0, END)
while dh<h0: # Поки камінь не впав
t += 0.2 # Обчислюємо поточний час
dh = 9.8*t**2/2 # Нове вертикальне зміщення каменя
if dh<h0: # Якщо камінь не впав
dl = v*t # Нове горизонтальне зміщення каменя
# Обчислення нових координат круга на полотні
# з урахуванням початкового положення й зміщень
x1 = x0+scale*dl
y1 = y0+scale*dh
cnv.move(ov, x1–x, y1–y) # Пересуваємо круг
x, y = x1, y1 # Оновлюємо поточні координати
# Формуємо рядок
s = str(round(dl, 2))+'\t'+ str(round(h0–dh, 2))+'\n'
txt.insert(END, s) # Додаємо рядок у текстове поле
root.update() # Оновлення полотна
sleep(0.1) # Затримка на 0.1 с
11. Додайте до програмного коду малювання відрізків, що відображають траєкторію руху каменя.
cnv.create_line(x1, y1, x, y)
12. Збережіть файл і виконайте програму для v = 20.
Поекспериментуйте з різними значеннями швидкості руху.
Зробіть висновок: як змоделювати рух об’єкта в програмі з графічним інтерфейсом.