If you're seeing this message, it means we're having trouble loading external resources on our website.

Ако си зад уеб филтър, моля, увери се, че домейните *. kastatic.org и *. kasandbox.org са разрешени.

Основно съдържание

Интерактивно движение на вектор

За да завършим този раздел, нека опитаме нещо малко по-сложно и много по-полезно. Динамично ще изчислим ускорението на един обект съгласно правило, посочено в алгоритъм #3 – обектът се ускорява към мишката.
Диаграма на мишката ускорение на вектор
Всеки път, когато искаме да изчислим вектор на базата на правило или формула, трябва да изчислим две неща: големина и посока. Да започнем с посоката. Знаем, че векторът на ускорението трябва да сочи от позицията на обекта към позицията на мишката. Нека кажем, че обектът се намира в точка (x, y) и мишката е в (mouseX, mouseY).
Диаграма на dx, dy
На чертежа виждаме, че можем да получим вектора (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. Изчисляваме вектор, който сочи от обекта към целевата позиция (мишката)
  2. Нормализираме вектора (и понижаваме дължината му до 1)
  3. Скалираме вектора до подходяща стойност (като го умножим по някакво число)
  4. Присвояваме вектора към ускорението acceleration.
Ето как изглежда програмата, в която са имплементирани всички тези стъпки:
Може би се чудиш защо кръгът не спира, когато стигне целта. Важно е да отбележим, че движещият се обект не знае, че трябва да спре на някаквa крайна точка; знае само къде е тази точка и се опитва да стигне до нея възможно най-бързо. Като се движи възможно най-бързо, непременно ще премине отвъд тази позиция и ще трябва да обърне обратно, като отново набере скорост и задмине позицията, което означава повторно обръщане и задминаване до безкрай. Остани с нас; в по-следващите раздели ще научим как да програмираме един обект, така че да може да пристигне на някаква позиция (да забави ход, когато наближи).
Този пример е много близък до понятието за всеобщо привличане (обектът е привлечен от позицията на мишката). Гравитационното привличане ще разгледаме в детайли в следващия раздел. Едно нещо, което липсва тук е, че силата на гравитацията (големината на ускорението) е обратно пропорционална на разстоянието. Това значи, че колкото по-близко е обектът до мишката, толкова по-бързо се ускорява.
Нека да видим как изглежда този пример с масив от няколко Mover обекта (вместо само един).

Курсът "Компютърни симулации на физични явления" е производeн на "Природата на кода" от Даниел Шифман, използвана от Creative Commons Attribution-NonCommercial 3,0 Unported License.

Искаш ли да се присъединиш към разговора?

Все още няма публикации.
Разбираш ли английски? Натисни тук, за да видиш още дискусии в английския сайт на Кан Академия.