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

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

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

Амплитуда и период на трептене

Изуми ли се вече? В раздела за ъглово движение видяхме доста интересни начини на употреба на тангенса (наример за намиране на ъгъла на вектор) и на синуса и косинуса (за превръщане от полярни в декартови координати). Можем да спрем дотук и да се чувстваме доволни. Но няма да го направим. Това е само началото. Това, което могат да направят за нас синусът и косинусът, надминава математическите формули и правоъгълните триъгълници.
Да разгледаме графиката на функцията синус, където y = sin(x)
Ще забележиш, че изходът на функцията синус е гладка крива, която се изменя между –1 и 1. Това поведение е познато като осцилация, периодично движение между две точки. Трептене на струна, люлеене на махало, подскачане на пого стик – всички тези са примери за осцилиращи движения.
И така, щастливи сме да разберем, че можем да симулираме осцилация в една ProcessingJS програма, като зададем изхода от функцията синус на позицията на един обект. Забележи, че това ще следва същата методология, която използвахме за шума на Пърлин в раздела за шума.
Да започнем със съвсем базов сценарий. Искаме да имаме кръг, който осцилира от ляво надясно по нашето платно.
Това движение е познато като просто хармонично движение (или, за да използваме по-засукани думи, "периодична синусиодална осцилация на обект”). Програмата ще бъде лесна за писане, но преди да пристъпим към кода, нека се запознаем с терминологията на осцилацията (и вълните).
Простото хармонично движение може да бъде изразено от коя да е позиция (в нашия случай позицията x) като функция на времето със следните два елемента:
  • Амплитуда: Разстоянието от центъра на движението към един от екстремумите
  • Период: Количеството време, което е необоходимо за пълно кръгово движение
Ако разгледаме графиката на функцията синус, която е дадена по-горе, можем да видим, че амплитудата е 1, а периодът е TWO_PI; изходът на синуса никога не надвишава 1 и не пада под -1; и на всеки TWO_PI радиана (или 360 градуса) моделът на вълната се повтаря.
Добре, какво е амплитуда и какво е период в света на ProcessingJS, в който живеем? Амплитудата може да бъде измерена доста лесно в пиксели. В случая с прозорец с широчина 200 пиксела можем да осцилираме от центъра 100 пиксела надясно и 100 пиксела наляво. Следователно:
// Нашата амплитуда, измерена в пиксели
var amplitude = 100;
Период е времето, необходимо за описване на пълен цикъл, но какво е времето в нашия сват на ProcessingJS? Можем да пожелаем кръгът да осцилира на всеки три секунди. В нашата програма можем да следим изминалите милисекунди (като изпозлваме millis()) и да получим сложен алгоритъм за осцилация на обект в реално време.
Имаме и друга възможност: можем да използваме факта, че ProcessingJS програмите разбират от "кадри" и че по подразбиране една програма изпълнява 30 "кадъра в секунда". ProcessingJS ни дава променливата frameCount, за да знаем в кой кадър се намираме в момента, и функцията frameRate(), за да променяме предпочитаните кадри в секунда. 30 FPS е скоростта на програмата по подразбиране, тъй като тази скорост е подходяща за изпълнение на гладка анимация, която да излъже човешкия мозък, но понякога може да е полезно да намалим тази скорост, например когато дебъгваме.
Така можем да решим да базираме нашия период на изминалите кадри, тъй като видяхме, че те са тясно свързани с времето в реалния свят – можем да кажем, че осцилиращото движение трябва да се повтаря на всеки 30 кадъра, или 50 кадъра, или 1000 кадъра и т.н.
// Нашият период е измерен в кадри (единицата за време за нашата анимация)
var period = 120;
След като имаме амплитудата и периода е време да запишем формула, за да изчислим x като функция на времето, за което ще заместим настоящата бройна рамка.
var x = amplitude * sin(TWO_PI * frameCount / period);
Да разгледаме формулата подробно и да се опитаме да разберем всеки компонент. Първата част вероятно е най-лесна. Това, което получаваме от функцията синус, се умножава по амплитудата. Знаем, че синусът осцилира между 1 и -1.. Ако вземем тази стойност и я умножим по амлитудата, ще получим желания резултат: стойност, която осцилира между -амплитудата и +амплитудата. (Забележка: това е място, на което ще ни бъде полезна ProcessingJS функцията map(), за да свържем изхода на функцията синус с даден обхват.)
Сега да разгледаме какво има във функцията синус:
TWO_PI * frameCount / period
Какво става тук? Да започнем с това, което знаем. Знаем, че синусът се повтаря на всеки 2*PI радиана – тоест ще започне при 0 и ще се повтори при 2*PI, 4*PI, 6*PI, т.н. Ако периодът е 120 рамки, тогава искаме трептящото звижение да се повтори, когато броят на рамките е при 120 рамки, 240 рамки, 360 рамки, т.н. Броят ра рамките е единствената променлива; започва при 0 и продължава нагоре. Нека разгледаме какво ще даде формулата с тези стойности.
Брой на рамкаБрой на рамка / периодTWO_PI * брой на рамка / period
000
600,5PI
1201TWO_PI
24022 * TWO_PI (или 4 * PI)
т.н.  
frameCount, разделена на периода, ни казва колко цикъла сме завършили – дали сме в средата на първия цикъл? Дали сме завършили 2 цикъла? Като умножим това число по TWO_PI, получаваме резултата, който искаме, тъй като TWO_PI е броят радиани, от които синусът се нуждае, за да завърши един цикъл.
Като цяло, това е програмата, която трепти x позицията на кръг с амплитуда от 100 пиксела и период от 120 рамки.
Заслужава си да споменем и термина честота: броят цикли за единица време. Честотата е равна на 1, разделено на периода. Ако периодът е 120 кадъра, то само 1/120 от цикъла е завършена в един кадър и така честотата е равна на 1/120 цикъла/в кадър. В горния пример просто избрахме да дефинираме скоростта на осцилацията по отношение на периода и следователно не се нуждаехме от променлива за честотата.
Забележи, че направихме всичко това с помощта на функцията синус (sin() в ProcessingJS), но същите идеи се прилагат и за функцията косинус. Периодът е един и същ и за двете функции, а основната разлика е само в това дали амплитудата започва от 1 или от 0.

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

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

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