ძირითადი მასალა
კომპიუტერული პროგრამირება
კურსი: კომპიუტერული პროგრამირება > თემა 5
გაკვეთილი 5: ძალები- ნიუტონის მოძრაობის კანონები
- გამოწვევა: საჰაერო ბუშტი
- ბევრი ობიექტის მოძრაობა
- გამოწვევა: კედელთან ბურთის თამაში
- გრავიტაციისა და ხახუნის ილუსტრაცია
- გამოწვევა: სიჩქარის შესამცირებელი ზღუდეები ქუჩაში
- ჰაერისა და სითხის წინაღობა
- გამოწვევა: ჩაძირული მორები
- გრავიტაციული მიზიდულობა
- გამოწვევა: ხელოვნების ნიმუშის შექმნა
- ორმხრივი მიზიდულობა
- გამოწვევა: ორმხრივი განზიდულობა
- პროექტი: არსებების კომფორტი და ცახცახი
© 2023 Khan Academyგამოყენების პირობებიკონფიდენციალურობის პოლიტიკაშენიშვნა ქუქი-ჩანაწერებზე
ბევრი ობიექტის მოძრაობა
რეალურ სამყაროში, რომელიც ჩვენი შთაგონების წყაროა, გვაქვს ერთზე მეტი მოძრავი ობიექტი - ჩვენ გარშემო ბევრი ობიექტია სხვადასხვა მასითა და ადგილმდებარეობით. ვნახოთ, როგორ შეგვიძლია, ჩვენს
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.
გსურთ, შეუერთდეთ დისკუსიას?
პოსტები ჯერ არ არის.