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 կադրը սահուն անիմացիա ստանալու համար լավ թիվ է, սակայն հաճախ կադրերի քանակը փոքրացնելը նպատակահարմար է, օրինակ՝ վրիպազերծելիս։
Քանի որ ցուցադրված կադրերի քանակը իրական աշխարհի ժամանակի հետ կապված է, կարող ենք պարբերությունը ցուցադրված կադրերի քանակով որոշել. կարող ենք տատանվող շարժումը կրկնել ամեն 30, 50, 1000 կամ ցանկացած այլ թվով կադրը մեկ։
// Պարբերությունը հաշվվում է կադրերով՝ անիմացիայի համար ժամանակի միավորով
var period = 120;
Լայնույթն ու պարբերությունն ունենալուց հետո կարող ենք ժամանակից x-ի կախվածությունը հաշվող բանաձև գրել, որտեղ որպես ժամանակ կտեղադրենք կադրի հաշվարկը։
var x = amplitude * sin(TWO_PI * frameCount / period);
Բանաձևը մի փոքր ավելի մանրամասն քննարկենք՝ յուրաքանչյուր բաղադրիչը հասկանալու համար։ Առաջինն ամենահեշտն է։ Սինուս ֆունկցիայի արժեքը պարզապես բազմապատկում ենք լայնույթով։ Արդեն գիտենք, որ սինուսի արժեքները տատանվելու են -1-ից 1 միջակայքում։ Այդ արժեքը լայնույթով բազմապատկելիս կստանանք մեր ուզած արժեքը՝ -լայնույթի և լայնույթի միջև տատանվող արժեք։ Նկատի ունեցիր, որ սինուսի արժեքը այլ միջակայքում արտապատկերելու համար հնարավոր է ProcessingJS-ի map() ֆունկցիան կիրառել։
Այժմ դիտարկենք սինուս ֆունկցիային փոխանցված արժեքը.
TWO_PI * frameCount / period
Ի՞նչ է կատարվում։ Սկսենք նրանից, ինչ գիտենք։ Գիտենք, որ սինուսը կրկնվում է ամեն 2PI ռադիանում, այսինքն՝ սկսում է 0-ում, կրկնվում է 2PI-ում, 4PI-ում, 6PI-ում և այլն։ Եթե պարբերությունը 120 կադր է, ապա տատանվող շարժումը պետք է կրկնվի, երբ frameCount փոփոխականի արժեքը 120 է, 240, 360 և այլն։ Իրականում frameCount-ը միակ փոփոխվող արժեքն է. սկսվում է 0-ից և մեծանում։ Փորձենք տեսնել, թե որ արժեքի համար ինչ է ստացվում բանաձևում։
frameCountframeCount / periodTWO_PI * frameCount / period
000
600,5PI
1201TWO_PI
24022 * TWO_PI (or 4* PI)
etc.  
frameCount-ը պարբերության վրա բաժանելիս ստանում ենք կատարված ցիկլերի քանակը. առաջին ցիկլի կե՞սն ենք կատարել, թե՞, օրինակ, երկու ցիկլ։ Իսկ TWO_PI-ով բազմապատկելու արդյունքում մեր ուզածն ենք ստանում, քանի որ TWO_PI-ն սինուսի ամբողջական ցիկլ կատարելու համար անհրաժեշտ ռադիանների քանակն է։
Ամփոփելով՝ ստորև ներկայացնում ենք շրջանի x դիրքը տատանող, 100 պիքսել լայնույթով և 120 կադր պարբերությամբ ծրագիր։
Արժե նաև հաճախություն տերմինը նշել. դա ժամանակի միավորում կատարված ցիկլերի քանակն է։ Հաճախությունը հավասար է 1 բաժանած պարբերության։ Եթե պարբերությունը 120 կադր է, ապա մեկ կադրում ցիկլի ընդամենը 1/120-ն է կատարվում, հետևաբար հաճախությունը հավասար է 1/120 ցիկլ/կադրի։ Վերին օրինակում տատանումները պարբերությամբ սահմանեցինք, հետևաբար հաճախության համար փոփոխական չկիրառեցինք։
Ուշադրություն դարձրու, որ այս ամենն իրականացրինք սինուս ֆունկցիայով՝ ProcessingJS-ի sin()-ով, սակայն նույն գաղափարը կարելի է կիրառել կոսինուսով։ Երկուսի դեպքում պարբերությունը նույնն է, և հիմնական տարբերությունը լայնույթի սկզբնակետն է՝ 1, թե 0։

«Բնական նմանակիչներ» դասընթացը ստեղծվել է Դանիել Շիֆմանի «Կոդի բնույթը» գրքի հիման վրա և կիրառվում է ըստ Creative Commons Attribution-NonCommercial 3,0 Unported License-ի։

Ուզո՞ւմ ես միանալ խոսակցությանը։

Առայժմ հրապարակումներ չկան։
Անգլերեն հասկանո՞ւմ ես: Սեղմիր այստեղ և ավելի շատ քննարկումներ կգտնես «Քան» ակադեմիայի անգլերեն կայքում: