Моделювання руху об’єкта

ПРАКТИЧНА РОБОТА 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.

Поекспериментуйте з різними значеннями швидкості руху.


Зробіть висновок: як змоделювати рух об’єкта в програмі з графічним інтерфейсом.