Дисципліна: Засоби програмування комп'ютерної графіки

Тема: Використання математичних функцій у Flash

План

1. Математичні операції.

2. Операції над векторами.

1. Математичні операції.

Об'єкт Math – це вбудований об'єкт Flash, за допомогою якого виконуються математичні дії. Наприклад, можна знайти:

Ці функції є методами об'єкта Math і при зверненні до них треба посилатися на цей об'єкт. Ось приклад обчислення квадратного кореня з x:

z = Math.sqrt (x); Для отримання випадкових чисел можна також використовувати незалежну функцію random, яка викликається з одним параметром. Наприклад, оператор: n = random (10), що записує в змінну n випадкове ціле число в інтервалі від 0 до 9.

Рух на площині більш складно, ніж одномірний, і вимагає деяких математичних знань (рис. 6.1). Нехай машину треба пересунути на відстань L вперед (відповідно до її кутом повороту _rotation, який на схемі нижче позначений грецькою буквою α). По схемою видно, що x-координата машини збільшується на Δx, а y-координата зменшується на Δy (враховуючи, що вісь Y направлена вниз). Ці величини обчислюються за допомогою функція синус і косинус (це методи об'єкта Math). Єдина складність полягає в тому, що для методів Math.sin() і Math.cos() необхідно задати кут в радіанах, а властивість rotation визначає кут в градусах. Для перекладу з градусів в радіани треба помножити величину кута на π (константа Math.PI) і розділити на 180.

2. Операції над векторами.

Якщо потрібно змоделювати відскакування від похилої поверхні, необхідно вирішити два завдання:

Найбільш просте рішення другого завдання виходить за допомогою векторної математики. Вектор задається (на площині) двома числами – своїми координатами по осях X і Y. Введемо одиничні вектори x1 і y1, які паралельні осям координат і мають довжину, рівну 1 (рис.6.2). Тоді можна записати вектор v з координатами (4,3) у вигляді суми:

(1)

Іншими словами, координати вектора (позначені через vx і vy) – це довжини його проекцій на осі обраної системи координат. Координати можуть бути і негативними, це означає, що вектор йде в бік, протилежний даної осі. Сума векторів – це вектор, координати якого дорівнюють сумі відповідних координат доданків. Для векторів v (4,3) і w (2, -1) отримуємо:

(2)

Скалярний добуток двох векторів – це сума добутків відповідних координат (число). Наприклад, скалярний добуток векторів v (4,3) і w (2, -1) дорівнює:

(3)

За допомогою скалярного твори можна, наприклад, визначити, що вектори перпендикулярні – в цьому випадку їх скалярний добуток дорівнює нулю. Наприклад, вектори x1 і y1 мають координати x1 (1,0) і y1 (0,1). Легко перевірити, що їх скалярний добуток дорівнює нулю. Скалярний добуток вектора на себе дорівнює квадрату довжини цього вектора:

.

Отже,

(4)

Скалярний добуток вектора v на який-небудь одиничний вектор z1 дає величину проекції вектора v на вісь, напрямок якої збігається з напрямком вектора z1. Дійсно, для декартової системи маємо:

(5)

Важливо, що таким чином можна отримати проекцію на будь-яку вісь, якщо знати її одиничний вектор. Тепер розглянемо відскакування кульки від похилої площини (рис. 6.3). Спочатку припустимо, що кулька – це матеріальна точка і удар пружний, тобто при ударі енергія не втрачається.

Введемо нові осі координат P (уздовж похилій площині) і N (перпендикулярно площині) і розкладемо вектор швидкості v (синя стрілка на малюнку) на складові, паралельні цим осях:

(6)

Після відскоку складова швидкості, паралельна осі P, не змінюється, а складова по осі N змінюється на протилежну (вектор змінює знак). Вектора, паралельні осі N, називають нормальними (або нормалями), оскільки вони перпендикулярні площині, від якої відскакує кулька. Таким чином, вектор швидкості v' після відскоку (зелена стрілка на малюнку) обчислюється як:

(7)

Визначивши з першої формули vp×p1 і підставивши в другу, отримуємо:

(8)

причому проекція vn може бути знайдена як скалярний твір:

(9)

Таким чином, щоб визначити вектор швидкості після відскоку, потрібно знати одиничний вектор n1, перпендикулярний площині. Якщо взяти дві точки на площині і знайти різницю їх координат dx і dy, то вектор n (-dy, dx) буде перпендикулярний прямій, що проходить через ці точки. Однак цей вектор – не поодинокий, його довжина дорівнює (за теоремою Піфагора):

(10)

Тому для того, щоб отримати вектор одиничної довжини n1, обидві координати вектора n потрібно розділити на його довжину. Таким чином, ми повністю розібрали математику пружного відскоку від похилій поверхні. Зауважимо, що за допомогою цих формул можна визначати, наприклад, напрямок променя світла після відображення від дзеркала. Якщо удар не пружний, то нормальна складова швидкості (тобто складова, паралельна осі N) зменшується по модулю, так що:

, (11)

де μ – коефіцієнт пружності, число в інтервалі від 0 до 1. При відскоку гумового м'ячика від сталевої стінки можна приймати μ = 0,99, а при відскоку яблука від повсті – μ≈0,2. У цьому випадку швидкість після відскоку дорівнює:

(12)

Розглянемо, наприклад кульку, яка буде рухатись усередині кільця (рис.6.4). Сторимо коло на сцені та розмістимо об’єкт «куля» всередині кільця. Виділимо шар, і додамо до нього код, який «рухає» об'єкт по екрану:

Відскакування кульки від поверхні можна розглянути як відскік його центру від деякої окружності, радіус якої менше, ніж внутрішній радіус кола, на величину радіуса кульки. Більш того, відскакування від кола – це те ж саме, що і відскакування від площини, по нормалі n. Тому для вирішення завдання можна безпосередньо використовувати отримані вище формули, засновані на застосуванні векторів. Обчислимо радіус кола, яка обмежує рух центру кульки (позначений через R). Зовнішній радіус кільця дорівнює 150, а його внутрішній радіус – 95% від зовнішнього (див. Властивість Inner radius), тобто 142,5. Крім того, їх цього числа потрібно відняти радіус кульки, який в програмі визначається автоматично і записується в змінну rBall.

Додайте перед функцією fly рядки:

xc = 200;

yc = 200;

R = 142,5 - rBall;

Тепер залишається написати код, який моделює пружне відштовхування кульки від стінок. Ми розташуємо його всередині функції fly, він спрацьовує тоді, коли відстань між центром кола і центром кліпу-кульки стає менше R.

Додайте в кінець функції fly код:

var dx = _x - xc;

var dy = _y - yc;

var dist = Math.sqrt (dx * dx + dy * dy);

if

n1x = dx / dist;

n1y = dy / dist;

vn = vx * n1x + vy * n1y;

vx - = 2 * vn * n1x;

vy - = 2 * vn * n1y;

updateAfterEvent ();

}

Збережіть файл і подивіться, як працює кліп.

Розглянемо код більш докладно. Спочатку визначаються зміщення кульки щодо центру по осях X і Y, а також відстань до центру:

var dx = _x - xc;

var dy = _y - yc;

var dist = Math.sqrt (dx * dx + dy * dy);

Якщо ця відстань менше або дорівнює R, станеться зіткнення. Вектор нормалі (перпендикулярний до площини відскакування) завжди спрямований до центру кола і має координати (dx, dy). Якщо розділити їх на dist, виходить одиничний вектор того ж напрямку з координатами

n1x = dx / dist;

n1y = dy / dist;

Далі обчислюємо скалярний твір вектора швидкості і вектора n1, що дорівнює проекції швидкості на нормаль:

vn = vx * n1x + vy * n1y;

Змінимо також компоненти вектора швидкості відповідно до формули попереднього пункту

vx - = 2 * vn * n1x;

vy - = 2 * vn * n1y;

Коефіцієнт 2 говорить про те, що зіткнення абсолютно пружне.

Виклик функції updateAfterEvent змушує програму відразу ж перемалювати кульку в новому положенні. Якщо уважно придивитися, кулька в момент зіткнення «заходить» на кільце. Дійсно, це випливає з умови . Щоб виправити цей недолік, потрібно «повернути» кульку назад так, щоб його центр знаходився точно на колі. Спробуйте розібратися в наступному коді самостійно.

Додайте в початок тіла умовного оператора (всередині фігурних дужок) код:

var k = (dist - R) / R;

_x - = dx * k;

_y - = dy * k.

Дисципліна: Засоби програмування комп'ютерної графіки

Тема: Основні відомості про Flash