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

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

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

ტალღები

თუ ფიქრობთ, „ჰმ, ეს ყველაფერი კარგია, მაგრამ მინდა, რომ ტალღა დავხატო ეკრანზე“, მაშინ ამის დროც დადგა. 90%-ით მანდ ვართ. როდესაც ერთ ცალ წრეს ზემოთ-ქვემოთ ვარხევთ სინუს ფუნქციის მიხედვით, რეალურად, ერთ წერტილს ვუყურებთ ტალღის კანონზომიერების x ღერძის გასწვრივ. ცოტა სიკოხტავითა და for ციკლით შეგვიძლია, რამდენიმე რხევადი წრე მივადგათ ერთმანეთს გვერდიგვერდ.
ამ ტალღოვანი კანონზომიერების (სტრუქტურის) გამოყენება შეიძლება ქმნილების სხეულის ან ორგანოების დიზაინის შექმნისას. მისი გამოყენება აგრეთვე შესაძლებელია არამყარი ზედაპირის (მაგალითად, წყლის) სიმულირებისასაც.
აქ იმავე კითხვებს გადავეყრებით ამპლიტუდასა (სტრუქტურის სიმაღლე) და პერიოდზე. იმის ნაცვლად, რომ პერიოდი მიუთითებდეს დროზე, რადგან მთელ ტალღას ვუყურებთ, შეგვიძლია, ვილაპარაკოთ პერიოდზე, როგორც მთელი ტალღის ციკლის სიგანეზე (პიქსელებში). და ისევე, როგორც მარტივი რხევის შემთხვევაში, გვაქვს ტალღის სტრუქტურის (კანონზომიერების) გამოთვლის შესაძლებლობა კონკრეტული პერიოდის მიხედვით ან, უბრალოდ, კუთხური სიჩქარის მოდელზე მიყოლით.
მივყვეთ უფრო მარტივ შემთხვევას — კუთხურ სიჩქარეს. ვიცით, რომ უნდა დავიწყოთ კუთხით, კუთხური სიჩქარით და ამპლიტუდით:
var angle = 0;
var angleVel = 0{,}2;
var amplitude = 100;
შემდეგ გადავუყვებით ყველა x მნიშვნელობას, სადაც გვინდა ტალღის წერტილის დახატვა. ჯერჯერობით ვთქვათ, ყოველ 24 პიქსელში. ამ ციკლში 3 რამ უნდა გავაკეთოთ:
  1. გამოვთვალოთ y ადგილმდებარეობა ამპლიტუდისა და კუთხის სინუსის მიხედვით.
  2. დავხატოთ წრე (x,y) მდებარეობაზე.
  3. გავზარდოთ კუთხე კუთხური სიჩქარის მიხედვით.
for (var x = 0; x <= width; x += 24) {
    // გამოვთვალოთ y კოორდინატი ამპლიტუდისა და კუთხის სინუსის მიხედვით
    var y = amplitude * sin(angle);
    // დახატეთ წრე x, y წერტილზე
    ellipse(x, y+height/2, 48, 48);
    // გაზარდეთ კუთხე კუთხური სიჩქარის მიხედვით
    angle += angleVel;
}
მოდით, შევხედოთ შედეგებს angleVel-ის სხვადასხვა მნიშვნელობისათვის:
ხედავთ, იმის მიუხედავად, რომ ტალღის პერიოდს ზუსტად არ ვანგარიშობთ, რაც უფრო მაღალია კუთხური სიჩქარე, მით უფრო მოკლეა პერიოდი. აგრეთვე უნდა აღინიშნოს, რომ პერიოდის შემოკლებასთან ერთად უფრო და უფრო რთულდება თვითონ ტალღის გაკეთება, რადგან ცალკეულ წერტილებს შორის მანძილი იზრდება. ერთი ვარიანტია beginShape()-ისა და endShape()-ის გამოყენება წერტილების ხაზით შესაერთებლად.
ზემოთ მოცემული მაგალითი სტატიკურია. ტალღა არასოდეს იცვლება, არასოდეს ღელავს, სწორედ ამისთვის ვმუშაობდით. ტალღის ანიმირების ეს დამატებითი ნაბიჯი ცოტა რთულია. თქვენმა ინსტინქტმა შეიძლება, გითხრათ: „ჰეი, ეს არაფერია, ჩვენ უბრალოდ კუთხეს გლობალურ ცვლადად გამოვაცხადებთ და გავზრდით მას ერთი ციკლიდან მეორემდე draw()-ში".
ეს კარგი აზრია, მაგრამ არ იმუშავებს. თუ შეხედავთ სტატიკურად დახატულ ტალღას, მარჯვენა კიდე რა ემთხვევა მარცხენას; სადაც draw()-ს ერთ ციკლში მთავრდება, იქ ვერ დაიწყება შემდეგში. ამის ნაცვლად უნდა გვქონდეს ცვლადი, რომელიც თვალყურს ადევნებს, კუთხის რა მნიშვნელობით უნდა დაიწყოს ტალღა. კუთხე (რომელსაც startAngle-ს დავარქმევთ) იზრდება საკუთარი კუთხური სიჩქარით.
აი, რას ვიღებთ საწყისი კუთხის გამოყენების შემდეგ. სცადეთ სხვადასხვა რიცხვის შეცვლა, რათა ნახოთ, რა ემართება რხევად ტალღას.

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

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

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