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

თუ ვებფილტრს იყენებთ, დარწმუნდით, რომ *.kastatic.org და *.kasandbox.org დომენები არ არის დაბლოკილი.

ძირითადი მასალა

რყევის (ოსცილაციის) ამპლიტუდა და პერიოდი

უკვე გაოცდით? კუთხური მოძრაობის სექციაში ვნახეთ შემდეგი ფუნქციების პრაქტიკაში გამოყენება: ტანგენსი (ვექტორის კუთხის საპოვნელად), სინუსი და კოსინუსი (პოლარულიდან კარტეზულ კოორდინატებში გადასაყვანად). შეგვიძლია, აქ გაჩერებით დავკმაყოფილდეთ, მაგრამ ასე არ ვიზამთ. ეს მხოლოდ დასაწყისია. სინუსისა და კოსინუსის შესაძლებლობები სცდება მათემატიკურ ფორმულებსა და მართკუთხა სამკუთხედებს.
მოდით, შევხედოთ სინუსის ფუნქციის გრაფიკს, სადაც y = sine(x)
შეამჩნევთ, რომ სინუს ფუნქციის გამომავალი მონაცემი არის მოსწორებული მრუდი, რომელიც -1-სა და 0-ს შორის იცვლება. ამგვარ ქცევას ეწოდება რხევა, პერიოდული მოძრაობა 2 წერტილს შორის. გიტარის სიმის ვიბრაცია, ქანქარის ქანაობა, ბატუტზე ხტუნვა — ეს ყოველივე რხევითი მოძრაობის მაგალითებია.
სასიხარულოა იმის აღმოჩენა, რომ შეგვიძლია, რხევის სიმულაცია ProcessingJS-ის პროგრამაში შევქმნათ ობიექტის ადგილმდებარეობაზე სინუს ფუნქციის გამომავალი მონაცემის მინიჭებით. აღვნიშნოთ, რომ აქ ვიყენებთ იმავენაირ მეთოდოლოგიას, როგორიც გამოვიყენეთ პერლინის ხმაურში ხმაურის სექციაში.
დავიწყოთ ძალიან მარტივი სცენარით. ჩვენ გვინდა, რომ წრე ირხეოდეს სამუშაო სივრცის მარცხენა მხრიდან მარჯვნივ.
ეს ცნობილია, როგორც მარტივი ჰარმონიული მოძრაობა (ან, უფრო ჭკვიანებად რომ გამოვჩნდეთ, „ობიექტის პერიოდული სინუსოიდური რხევა"). ეს იქნება მარტივად დასაწერი პროგრამა, მაგრამ სანამ კოდის წერაზე გადავალთ, გავეცნოთ რხევის (და ტალღების) ტერმინოლოგიას.
მარტივი ჰარმონიული მოძრაობის გამოსახვა შეიძლება ნებისმიერი ადგილმდებარეობით (ჩვენს შემთხვევაში x ადგილმდებარეობით), როგორც დროის ფუნქცია შემდეგი 2 ელემენტით:
  • ამპლიტუდა: მანძილი მოძრაობის ცენტრიდან რომელიმე უკიდურეს წერტილამდე
  • პერიოდი: დრო, რაც მოძრაობის ერთი სრული ციკლის შესრულებას ესაჭიროება
ზემოთ მოცემულ სინუსის გრაფიკზე ვხედავთ, რომ ამპლიტუდა არის 1, ხოლო პერიოდი არის TWO_PI; სინუსის გამომავალი მონაცემი (მნიშვნელობა) ყოველთვის არის -1-სა და 1-ს შორის (ჩაკეტილ შუალედში); ყოველ TWO_PI რადიანში (ანუ 360 გრადუსში) ტალღის კანონზომიერება მეორდება.
Now, in the ProcessingJS world we live in, what is amplitude and what is period? Amplitude can be measured rather easily in pixels. In the case of a window 200 pixels wide, we would oscillate from the center 100 pixels to the right and 100 pixels to the left. შესაბამისად:
// პიქსელებში გაზომილი ჩვენი ამპლიტუდა
var amplitude = 100;
პერიოდი არის დროის ის მონაკვეთი, რომელიც ერთი ციკლის შესრულებას სჭირდება, მაგრამ რა არის დრო ჩვენს ProcessingJS-ის სამყაროში? ნამდვილად შეგვიძლია, ვთქვათ, რომ გვინდა, წრე ირხეოდეს ყოველ 3 წამში. შეგვიძლია, თვალყური ვადევნოთ მილიწამებს ჩვენს პროგრამაში (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
რა ხდება აქ? დავიწყოთ იმით, რაც ვიცით. ვიცით, რომ სინუსი გამეორდება ყოველ 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 გაყოფილი პერიოდზე გვეუბნება, რამდენი ციკლი გვაქვს შესრულებული — პირველი ციკლის შუაში ვართ? 2 ციკლი შევასრულეთ? ამ რიცხვის TWO_PI-ზე გამრავლებით ვიღებთ სასურველ შედეგს, რადგან TWO_PI არის რადიანების რაოდენობა, რომელიც სჭირდება ერთ სინუსს 1 ციკლის შესასრულებლად.
ყველაფრის შეჯამების შემდეგ: აი, პროგრამა, რომელიც წრის x მდებარეობას არხევს, ამპლიტუდით 100 პიქსელი და პერიოდით 120 კადრი.
აგრეთვე უნდა აღვნიშნოთ ტერმინი სიხშირე: ციკლების რაოდენობა დროის ერთეულში. სიხშირე ტოლია 1 გაყოფილი პერიოდზე. თუ პერიოდი არის 120 კადრი, მაშინ ციკლის მხოლოდ 1/120 არის შესრულებული თითო კადრში, ასე რომ, სიხშირე = 1/120 ციკლი/კადრი. ზედა მაგალითში ჩვენ, უბრალოდ, გადავწყვიტეთ, რხევის ტემპი განგვესაზღვრა პერიოდის მიხედვით და, შესაბამისად, არ დაგვჭირდა ცვლადი სიხშირისთვის.
აღვნიშნოთ, რომ ეს ყველაფერი გავაკეთეთ სინუს ფუნქციის გამოყენებით (sin() ProcessingJS-ში), მაგრამ იმავე იდეების განხორციელება შესაძლებელია კოსინუს ფუნქციის გამოყენებითაც. ორივეს ერთნაირი პერიოდი აქვს, მთავარი განსხვავება არის საწყისი ამპლიტუდის დაწყება 1-ზე ან 0-ზე.

ეს „ბუნებრივი სიმულაციების" კურსი ეფუძნება დანიელ შიფმენის წიგნს "კოდის ბუნებას", ის გამოყენებულია ლიცენზიით Creative Commons Attribution-NonCommercial 3,0 Unported License.

გსურთ, შეუერთდეთ დისკუსიას?

პოსტები ჯერ არ არის.
გესმით ინგლისური? დააწკაპუნეთ აქ და გაეცანით განხილვას ხანის აკადემიის ინგლისურენოვან გვერდზე.