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

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

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

კომპიუტერული პროგრამირება

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

ამ სექციის დასასრულს ვცადოთ რაღაც ცოტა უფრო რთული და ბევრად უფრო გამოყენებადი. ჩვენ დინამიკურად გამოვთვლით ობიექტის აჩქარებას ალგორითმ #3-ში გამოთქმული წესის მიხედვით - ობიექტი ჩქარდება მაუსისკენ.
მაუსის აჩქარების ვექტორის დიაგრამა
ყოველთვის, როცა წესის ან ფორმულის მიხედვით გვსურს ვექტორის გამოთვლა, უნდა გამოვიანგარიშოთ ორი რამ: სიდიდე და მიმართულება. დავიწყოთ მიმართულებით. ვიცით, რომ აჩქარების ვექტორი უნდა იყოს მიმართული ობიექტის მდებარეობიდან მაუსის მდებარეობისკენ. ვთქვათ, ობიექტი მდებარეობს (x,y) წერტილზე და მაუსი მდებარეობს (mouseX,mouseY)-ზე.
dx, dy-ის დიაგრამა
ამ დიაგრამაში ვხედავთ, რომ შეგვიძლია, მივიღოთ ვექტორი (dx,dy) ობიექტის ადგილმდებარეობის გამოკლებით მაუსის ადგილმდებარეობიდან.:
  • dx = mouseX - x
  • dy = mouseY - y
გადავწეროთ ზემოთ მოცემული კოდი PVector-ის სინტაქსით. დავუშვათ, ვართ Mover ობიექტის განსაზღვრებაში და, შესაბამისად, გვაქვს წვდომა ობიექტის PVector მდებარეობაზე, მაშინ გვაქვს:
var mouse = new PVector(mouseX, mouseY);
// ნახეთ! ვიყენებთ სტატიკურ sub()-ს, რადგან გვინდა სრულიად ახალი PVector-ი
var dir = PVector.sub(mouse, position);
ჩვენ ახლა გვაქვს PVector, რომელიც მიმართულია მოხეტიალის მდებარეობიდან მაუსის მდებარეობისკენ. თუ ობიექტი მართლა აჩქარდებოდა ამ ვექტორის გამოყენებით, ის მაშინვე გაჩნდებოდა მაუსის მდებარეობაზე. რა თქმა უნდა, ეს კარგ ანიმაციას ვერ შექმნის. ახლა უნდა მოვიფიქროთ, რამდენად სწრაფად გვინდა, ეს ობიექტი აჩქარდეს მაუსის მიმართულებით.
ჩვენი აჩქარების PVector-ის სიდიდის დასაყენებლად (რაც არ უნდა იყოს ის) ჯერ ___ უნდა გავუკეთოთ ამ მიმართულების ვექტორს. სწორად გამოიცანით. ნორმალიზაცია. თუ შეგვიძლია, რომ ვექტორი დავაპატარავოთ მის ერთეულოვან ვექტორამდე (1 სიგრძის), მაშინ გვაქვს ვექტორი, რომელიც გვეუბნება მიმართულებას და მარტივია მისი სკალირება ნებისმიერ მნიშვნელობაზე. ერთი, გამრავლებული ნებისმიერ რიცხვზე, უდრის ამ რიცხვს.
var anything = ??;
dir.normalize();
dir.mult(anything);
შევაჯამოთ, ვიყენებთ შემდეგ ნაბიჯებს:
  1. გამოვთვლით ვექტორს, რომელიც მიმართულია მოცემული ობიექტიდან სამიზნის ადგილმდებარეობამდე (მაუსამდე)
  2. ნორმალიზაციას ვუკეთებთ ამ ვექტორს (ვამცირებთ მის სიგრძეს 1-მდე)
  3. სკალირებას ვუკეთებთ ამ ვექტორს ადეკვატურ მნიშვნელობამდე (მის რაიმე რიცხვზე გამრავლებით)
  4. აჩქარებას ვანიჭებთ ამ ვექტორს
აი, როგორ გამოიყურება დიაგრამა, როდესაც ეს ნაბიჯები სრულადაა გავლილი:
შეიძლება, გაინტერესებთ, რატომ არ ჩერდება წრე, როდესაც ის სამიზნეს მიაღწევს. მნიშვნელოვანია, აღვნიშნოთ, რომ მოხეტიალე ობიექტს არ აქვს არანაირი ცოდნა მიზნის მიღწევისას შეჩერების მცდელობაზე; მან მხოლოდ ის იცის, სად არის ეს დანიშნულების ადგილი, და ცდილობს, რაც შეიძლება სწრაფად მივიდეს იქ. „რაც შეიძლება სწრაფად წასვლა“ ნიშნავს, რომ ის აუცილებლად გასცდება ამ ადგილს და მოუწევს უკან მობრუნება, ისევ წავა სამიზნისკენ რაც შეიძლება სწრაფად და, შესაბამისად, ისევ გასცდება მას, და ა.შ. დარჩით ჩვენთან; მომდევნო სექციებში ვისწავლით, როგორ უნდა დავაპროგრამოთ ობიექტი ისე, რომ ზუსტად მივიდეს კონკრეტულ მდებარეობაში (შენელების მიდგომა).
ეს მაგალითი განსაკუთრებით ახლოსაა გრავიტაციული მიზიდვის კონცეფციასთან (რომელშიც ობიექტს იზიდავს მაუსის მდებარეობა). გრავიტაციულ მიზიდვას დავფარავთ შემდეგ სექციაში. მიუხედავად ამისა, ერთი რამ, რაც აქ გვაკლია, არის ის, რომ გრავიტაციის სიდიდე (აჩქარების სიდიდე) გარდაუვლად არის მანძილის პროპორციული. ეს ნიშნავს, რომ რაც უფრო ახლოს არის ობიექტი მაუსთან, მით უფრო სწრაფად ჩქარდება ის.
ვნახოთ, როგორ გამოიყურება ეს მაგალითი მოძრავების (mover-ების) მასივით (მხოლოდ ერთის ნაცვლად).

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

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

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