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

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

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

ბევრი ობიექტის მოძრაობა

რეალურ სამყაროში, რომელიც ჩვენი შთაგონების წყაროა, გვაქვს ერთზე მეტი მოძრავი ობიექტი - ჩვენ გარშემო ბევრი ობიექტია სხვადასხვა მასითა და ადგილმდებარეობით. ვნახოთ, როგორ შეგვიძლია, ჩვენს Mover-ს გავაკეთებინოთ რეალური სამყაროს ამ ასპექტის უკეთესი სიმულაცია.
ამის გასაკეთებლად დაგვჭირდება ობიექტზე ორიენტირებული პროგრამირების სწრაფი მიმოხილვა. ჩვენ აქ არ დავფარავთ ოოპ-ის საფუძვლებს მთლიანად. მიუხედავად ამისა, ვინაიდან ობიექტებით სავსე სამყაროს შექმნის იდეა საკმაოდ ფუნდამენტურია ამ კურსის ყველა მაგალითისთვის, ღირს, რომ გავიაროთ ერთი ობიექტიდან ბევრზე გადასვლის ნაბიჯები.
შეგახსენებთ, ასე გამოიყურება ჩვენი მიმდინარე Mover. ის იგივენაირია, როგორიც Mover ობიექტი, რომელიც ვექტორებზე გაცნობისას შევქმენით, მაგრამ აქვს ორი დამატება — mass (მასა) და ახალი applyForce() (ძალის გამოყენების) მეთოდი:
ახლა, როცა ჩვენი ობიექტი მზადაა, შეგვიძლია, შევქმნათ, მაგალითად, 20 Mover ნიმუში მასივით, მათი ინიციალიზაცია კი ციკლში მოხდება
var movers = [];

for (var i = 0; i < 20; i++) {
    movers[i] = new Mover();
}
მაგრამ ახლა გვაქვს მცირე პრობლემა. თუ ისევ მივმართავთ Mover ობიექტის კონსტრუქტორს…
var Mover = function() {
    this.mass = 1;
    this.position = new PVector(30, 30);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
…ვაცნობიერებთ, რომ ყოველი Mover ობიექტი კეთდება ერთნაირად. ჩვენ გვინდა სხვადასხვა მასის მქონე Mover ობიექტები რომლებსაც სხვადასხვა საწყისი ადგილმდებარეობები აქვთ. აი, აქ უნდა დავამატოთ არგუმენტები ჩვენს კონსტრუქტორს.
var Mover = function(m, x, y) {
    this.mass = m;
    this.position = new PVector(x, y);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
აღვნიშნოთ, რომ მასა და მდებარეობა ხელით ჩაწერილი (ინგლ. hardcoded) რიცხვები აღარ არის, ისინი ახლა ინიციალიზებულია კონსტრუქტორში გადაცემული არგუმენტებით. ეს ნიშნავს, რომ შეგვიძლია, შევქმნათ სხვადასხვანაირი Mover ობიექტი: დიდები, პატარები, ისეთები, რომლებიც ეკრანის მარცხენა მხარეს იწყება, ისეთებიც, რომლებიც მარჯვენა მხარეს იწყება, და ა.შ.
// დიდი Mover (მოძრავი) ფანჯრის მარცხენა მხარეს
var m1 = new Mover(10, 0, height/2);
// პატარა Mover ფანჯრის მარჯვენა მხარეს
var m2 = new Mover(0{,}1, width, height/2);
მიუხედავად ამისა, მასივის შემთხვევაში ყველა ობიექტის ინიციალიზაცია ციკლით გვინდა.
for (var i = 0; i < 20; i++) {
    movers[i] = new Mover(random(0{,}1, 5), 0, 0);
}
თითოეული შექმნილი მოძრავისთვის მასა 0,1-იდან 5-მდე შემთხვევითად შერჩეულ რიცხვზე ყენდება, საწყისი x მდებარეობა ყენდება 0-ზე და საწყისი y მდებარეობა ყენდება 0-ზე. ცხადია, არსებობს ობიექტების ინიციალიზაციის უამრავი გზა; ეს არის მხოლოდ ერთ-ერთი ვარიანტის დემონსტრაცია.
როგორც კი ობიექტების მასივი გამოცხადდება, შეიქმნება და ინიციალიზდება, კოდის დანარჩენი ნაწილი მარტივია. გადავუყვებით ყოველ ობიექტს, თითოეულს ვაწვდით ძალებს გარემოში და ვტკბებით სანახაობით.
draw = function() {
  background(50, 50, 50);

  for (var i = 0; i < movers.length; i++) {
    var wind = new PVector(0{,}01, 0);
    var gravity = new PVector(0, 0{,}1);
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);
    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
  }
};
აი, როგორ გამოიყურება საბოლოო პროგრამა. დააკვირდით, რომ პროგრამაში პატარა წრეები ფანჯრის მარჯვენა მხარეს უფრო სწრაფად აღწევენ, ვიდრე დიდები. ეს ჩვენი ფორმულის გამოა: აჩქარება = ძალა გაყოფილი მასაზე. რაც უფრო დიდია მასა, მით უფრო ნაკლებია აჩქარება.

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

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

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