Розробка уроку — практичної роботи

Тема: створення моделей рівномірного прямолінійного руху об’єкта, руху об’єкта на площині з перешкодами та з вибором шляху мовою Ruby.

Мета: надати учням приклад створення моделі руху об’єкта на площині з перешкодами мовою Ruby.

Обладнання: комп'ютери зі встановленими ОС, браузером, інтерпретатором мови Ruby, бібліотеками Ruby 2D і Rmagick, (дана) інструкція.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Вивчення нового матеріалу.
  4. Інструктаж з ТБ.
  5. Вироблення практичних навичок.
  6. Підбиття підсумків уроку.
  7. Домашнє завдання.

Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.

2. Актуалізація опорних знань

Дати тлумачення таким вказівкам мовою Ruby з використанням бібліотеки Ruby 2D.

for i in 0...4
end

case i
  when 0
    i=0
  when 1
    i=11
  when 2
    i=222
end

if (b)
  i=0
else
  i=1
end

t=[]
t.push(x)
t.clear

require 'ruby2d'
set title: "obstacles", background: '#008000', width: 800, height: 450
f = Image.new("field.png", x:1, y:2, width: 33, height: 44)

update do # цикл оновлення вікна
end

show

Порівняти з очікуваним.

3. Вивчення нового матеріалу
Створення комп'ютерної моделі рівномірного прямолінійного руху об’єкта на площині з оминанням перешкод

передбачає:

Основою такої програми з втіленням імпортування, зміни й подання зображення може бути такий код.

require 'ruby2d' # Замовлення бібліотеки ruby2d

r=8      # Радіус рухомого круга
s=2      # Крок переміщення круга по горизонталі чи вертикалі 
xmax=800 # Розміри поля по горизонталі
ymax=450 # Розміри поля по вертикалі

set title: "obstacles", background: '#008000', width: xmax, height: ymax
x=r       # абсциса  центра круга
y=ymax/2  # ордината центра круга
f = Image.new(path: "field.png", x:0, y:0, width: xmax, height: ymax)
b = Image.new(path: "ball.png", x: x-r, y: y-r, z:1, width: 2*r, height: 2*r)

t = 0 # лічильник оновлень

update do
  if (x+2*r+s<xmax) && (t == 0)
  # Визначення значень глобальних змінних x, y
  # - координат центра рухомого круга
    x+=s # прямолінійний рух 
    ball.x=x
  end
  t=(t+30)%60
end

show

Для успішної роботи коду — показу руху білого круга зліва направо поверх перешкод жовтого кольору — тека з програмою має містити файли зображень:

При виконанні завдання 2 (див. далі) потрібно доповнити код безпосередньо після коментаря:

# Визначення значень глобальних змінних x, y
# - координат центра рухомого круга

відповідним програмним втіленням алгоритму руху площиною з оминанням перешкод. Таке доповнення обов'язково міститиме визначення інтенсивностей кольорів окремих пікселів.

Засоби попіксельного опрацювання зображень відсутні у бібліотеці Ruby 2D (на момент упорядкування тексту). Але їх містить бібліотека Rmagic (Ruby+ImageMagick), призначена для cтворення, опрацювання й запису файлів графіки з використанням мови Ruby.

Встановлення бібліотеки Rmagic при ОС Linux Mint чи Ubuntu здійснюють такими вказівками Термінала.

sudo apt-get purge graphicsmagick graphicsmagick-dbg imagemagick-common imagemagick imagemagick-6.q16 libmagickcore-6-headers libmagickwand-dev graphicsmagick-libmagick-dev-compat
sudo apt-get autoremove
sudo apt-get install imagemagick libmagickwand-dev
sudo ln -s /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/bin-Q16/Magick-config /usr/bin/Magick-config
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig
sudo gem install rmagick

Найпростіші уявлення про можливості створення й запису файлів графіки дає програма (запозичена з сайту Rmagic) для створення зображення каченяти методами найпростіших геометричних фігур.

Цього достатньо, щоб намалювати перешкоди короткою програмою. Але повноцінне використання бібліотеки вимагає ґрунтовного вивчення її опису.

На цьому уроці з усіх можливостей Rmagic знадобиться лише опрацювання пікселів. Його можна проілюструвати таким кодом.

require 'rmagick'
# include Magick # якщо розкоментувати, то наступну вказівку можна писати так:
#field=         ImageList.new("field.png")
field = Magick::ImageList.new("field.png")

# масив пікселів прямокутника з верхнім лівим кутом (40, 225)
# (всередині жовтого круга), шириною 2 і висотою 3
p = field.get_pixels(40,225,2,3)

print p[0].red.to_s+"\n"+  # дані про піксель (40,225)
      p[0].green.to_s+"\n"+
      p[0].blue.to_s+"\n"+
      p[0].to_s+"\n"

p = field.get_pixels(40,40,1,1)
print p[0].red.to_s+"\n"+  # дані про піксель (40,40)
      p[0].green.to_s+"\n"+
      p[0].blue.to_s+"\n"+
      p[0].to_s+"\n"

Для файлу поля з перешкодами field.png результат виведення має такий вигляд.

65535
65535
0
red=65535, green=65535, blue=0, alpha=65535
0
32896
0
red=0, green=32896, blue=0, alpha=65535

4. Інструктаж з ТБ
5. Вироблення практичних навичок


Завдання 1. Скласти алгоритм руху об’єкта прямокутним полем з оминанням перешкод (наприклад, відрізків прямих ліній) при таких обмеженнях:

Вхідні дані (розташування перешкод і співвідношення між розмірами поля, об'єкта й величиною стрибка) ґарантують істування розв'язку — відповідної траєкторії руху.

Створений за допомогою конкурсу ідей алгоритм проходження лабіринту у темноті без його схеми порівняти з очікуваним.

Алгоритм (діяти до досягнення правої сторони поля)

  1. Вважати:
    • напрям руху → (зліва направо);
    • номер стану гри 0 — об'єкт не дотикається до перешкоди.
  2. Рухатися вперед до досягнення перешкоди.
  3. Змінити номер стану гри на 1 — об'єкт обходить перешкоду.
  4. Запам'ятати розташування об'єкта.
  5. Змінити поточний напрям руху на перший з можливих у послідовності ↑, ←.
  6. Обійти перешкоду, полишаючи її праворуч, і знайти на шляху точку, з якої можна почати рух праворуч або почати обхід іншої перешкоди, розташованої (хоча б частково) правіше від поточної перешкоди. Інакше кажучи, поки не досягнуто правого краю поля або останнього розташування кроку, запам'ятованого на кроці 4, робити таке у кожному розташуванні об'єкта:

    • запам'ятати розташування у порядку обходу перешкоди;

    • якщо розташування — правіше від усіх пройдених, тобто абсциса (центра) об'єкта найбільша з усіх досягнутих, запам'ятати його місце у траекторії;

    • наступне переміщення здійснити у першому з можливих напрямків, заданих такою послідовністю різниць кутових аргументів нового напрямку і попереднього (напрям вимірювання традиційний — проти напрямку руху годинникової стрілки):

      • −90° — повернути праворуч;
      • 0° — зберегти напрям руху, бо праворуч перешкода;
      • +90° — повернути ліворуч, якщо перешкода і праворуч, і прямо;
      • +180° — рушити назад, якщо перешкоди немає лише позаду.
  7. Змінити номер стану гри на 2 — об'єкт рухається у «точку відриву» від перешкоди, тобто у розташування з найбільшою абсцисою при обході останньої перешкоди.

  8. Повернутися у «точку відриву».

  9. Очистити пам'ять, відведену на запам'ятовування траєкторії обходу перешкоди.

  10. Перейти до виконання пункту 1.

Примітка. Горизонтальну межу поля потрібно тлумачити як перешкоду при русі полем. Якщо кілька перешкод дотикаються до горизонтальної межі, то вони разом з цією межею утворюють одну перешкоду з точки зору виконавця алгоритму.

Поради щодо програмного втілення:

Завдання 2. Програмно втілити складений алгоритм руху білого круга прямо­кутним полем темно зеленого кольору з оминанням перешкод (наприклад, відрізків прямих ліній) жовтого кольору.

Вважати, що існує шлях для квадрата з горизонтальними і вертикальними сторонами, описаного навколо круга. Останнє припущення дає можливість спростити код перевірки можливості руху у певному напрямку за рахунок збільшення кількості виконуваних дій.

Вказівки до виконання завдання на основі розглянутого раніше коду показу руху білого круга зліва направо поверх перешкод жовтого кольору:

  1. Підготувати програмне втілення алгоритму зміни координат центра круга:

    • замовити використання бібліотеки rmagick без простору назв Magick;
    • описати змінні (крім лічильників циклів), надати їм початкових значень;
    • завантажити файл field.png для опрацювання засобами rmagick.

    Виробити пропозиції у результаті конкурсу ідей і порівняти з очікуваним кодом, який потрібно вставити, починаючи з другого рядка програми.

    require 'rmagick' # Замовлення бібліотеки rmagick
    
    igame= 0 # стан гри
    idir = 0 # напрям руху
    xb   = 0 # найбільше досягнуте значення абсциси
    jb   = 0 # номер точки траєкторії з найбільшим
             # досягнутим значенням абсциси
    jt   = 0 # поточний номер точки траєкторії при поверненні
             # у точку "відриву" за найменшу кількість кроків
    tr=[]    # траєкторія центрів круга
    incjt=true # зростання поточного номера точки траєкторії
               # при поверненні у "точку відриву від перешкоди"
               # за найменшу кількість кроків
    can=[true,true,true,true] # can[j] - чи можна рухатися у напрямку j
    field = Magick::ImageList.new("field.png")

    Примітка. При використанні простору станів Magick за допомогою вказівки:

    # include Magick

    код, яким користувалися раніше для показу руху білого круга зліва направо поверх перешкод жовтого кольору, стає некоректним — його виконання зупиняється на вказівці:

    field = Image.new(path: "field.png", x:0, y:0, width: xmax, height: ymax)

    Причою цього є використання однієї назви Image для різних класів з різних бібліотек і з різними формами виклику.

  2. Програмно втілити алгоритм зміни координат центра круга. Порівняти з очікуваним.

  3. Перевірити правильність виконання проекту з використанням файлів field.png і newfield.png У разі потреби внести зміни у код програми.

  4. Повідомити вчителя про завершення роботи над проектом.

6. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення оцінок.

7. Домашнє завдання

У разі потреби доробити завдання.

Для охочих: удосконалити програму — дозволити переміщення центра білого круга у точки з цілими координатами, віддаленими від початкового положення на відстань, що не перевищує s за умови, що при зміні однієї з координат кінцевого розташування на 1 можна отримати точку, віддалену від початкового розташування на відстань, що не перевищує s — див. малюнок, на якому:

При одночасному зростанні s і розмірів подання перешкод така дискретна модель (зі скінченою кількістю розташувань круга) є гарним наближенням неперервної моделі, у якій можливим є довільне розташування круга без перетину з перешкодами з довільним напрямком переміщення на певну відстань. Файл для опрацювання (із зображенням перешкод) може місти істотно більше пікселів, ніж його зображення на екрані монітора.

Іншим наближенням такої моделі є модель з довільним розташуванням круга без перетину з перешкодами, але векторами переміщення з такими координатами:

(s · cos(πj/2n), s · sin(πj/2n)) при j = 0, 1, …, n.

Якщо сумістити початки векторів, то їхні кінці будуть вершинами правильного 4n-кутника. Кратність 4 кількості вершин вибрано для того, щоб мати можливість рухатися по горозонталі праворуч і ліворуч та по вертикалі вгору й униз. У цьому випадку:

Для обох моделей алгоритм перевірки можливості руху у певному напрямку вимагає істотного доопрацювання з використанням рівняння прямої на площині.


Текст упорядкував Олександр Рудик.