Основно съдържание
Курс: Програмиране > Раздел 5
Урок 4: Вектори- Въведение във вектори
- Предизвикателство: Пешеходец по вектор
- Повече векторна математика
- Предизвикателство: Лазерен меч
- Големина на вектора и нормализация
- Предизвикателство: Визуализация на големина
- Движение на вектор
- Предизвикателство: Спиране на кола
- Статични функции срещу методи
- Предизвикателство: Статични функции
- Интерактивно движение на вектор
- Предизвикателство: Следене на мишката
- Проект: Изчислителни същества
© 2024 Khan AcademyУсловия за ползванеДекларация за поверителностПолитика за Бисквитки
Интерактивно движение на вектор
За да завършим този раздел, нека опитаме нещо малко по-сложно и много по-полезно. Динамично ще изчислим ускорението на един обект съгласно правило, посочено в алгоритъм #3 – обектът се ускорява към мишката.
Всеки път, когато искаме да изчислим вектор на базата на правило или формула, трябва да изчислим две неща: големина и посока. Да започнем с посоката. Знаем, че векторът на ускорението трябва да сочи от позицията на обекта към позицията на мишката. Нека кажем, че обектът се намира в точка
(x, y)
и мишката е в (mouseX, mouseY)
.На чертежа виждаме, че можем да получим вектора
(dx,dy)
, като извадим позицията на обекта от позицията на мишката:dx = mouseX - x
dy = mouseY - y
Нека пренапишем това горе с
PVector
синтаксис. Ако приемем, че сме в границите на дефиницията на обекта Mover
и имаме достъп до позицията на обекта PVector
, тогава имаме:var mouse = new PVector(mouseX, mouseY);
// Виж! Използваме статичния метод sub(), защото искаме напълно нов PVector
var dir = PVector.sub(mouse, position);
Сега имаме
PVector
, който започва от позицията на Mover и сочи към позицията на мишката. Ако обектът бъде ускорен по този вектор, мигновено би се появил на позицията на мишката. Разбира се, от това няма да се получи хубава анимация, така че трябва да решим колко бързо този обект да се ускори към мишката.За да определим големината (каквато и стойност да има тя) на нашето ускорение, трябва първо да ___ този насочен вектор. Точно така, позна: нормализираме. Ако можем да свием вектора си до единичен вектор (с дължина едно), тогава имаме един вектор, който ни показва посоката и който може лесно да бъде скалиран до каквато и да е стойност. Едно умножено по нищо е равно на нищо.
var anything = ??;
dir.normalize();
dir.mult(anything);
За да обобщим, предприемаме следните стъпки:
- Изчисляваме вектор, който сочи от обекта към целевата позиция (мишката)
- Нормализираме вектора (и понижаваме дължината му до 1)
- Скалираме вектора до подходяща стойност (като го умножим по някакво число)
- Присвояваме вектора към ускорението acceleration.
Ето как изглежда програмата, в която са имплементирани всички тези стъпки:
Може би се чудиш защо кръгът не спира, когато стигне целта. Важно е да отбележим, че движещият се обект не знае, че трябва да спре на някаквa крайна точка; знае само къде е тази точка и се опитва да стигне до нея възможно най-бързо. Като се движи възможно най-бързо, непременно ще премине отвъд тази позиция и ще трябва да обърне обратно, като отново набере скорост и задмине позицията, което означава повторно обръщане и задминаване до безкрай. Остани с нас; в по-следващите раздели ще научим как да програмираме един обект, така че да може да пристигне на някаква позиция (да забави ход, когато наближи).
Този пример е много близък до понятието за всеобщо привличане (обектът е привлечен от позицията на мишката). Гравитационното привличане ще разгледаме в детайли в следващия раздел. Едно нещо, което липсва тук е, че силата на гравитацията (големината на ускорението) е обратно пропорционална на разстоянието. Това значи, че колкото по-близко е обектът до мишката, толкова по-бързо се ускорява.
Нека да видим как изглежда този пример с масив от няколко Mover обекта (вместо само един).
Курсът "Компютърни симулации на физични явления" е производeн на "Природата на кода" от Даниел Шифман, използвана от Creative Commons Attribution-NonCommercial 3,0 Unported License.
Искаш ли да се присъединиш към разговора?
Все още няма публикации.