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

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

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

მოძრაობის მიმართულებით მითითება

დავუბრუნდეთ ჩვენს ერთ-ერთ პირველ მაგალითს, რომელშიც Mover ობიექტი ჩქარდება მაუსისკენ.
შეიძლება, შეამჩნიეთ, რომ თითქმის ყველა ფიგურა, რომელსაც ვხატავთ, არის წრე. ეს ხელსაყრელია რამდენიმე მიზეზის გამო, რომელთაგან ერთ-ერთი არის კუთხით მობრუნების გამარტივება. წრე მობრუნების შემთხვევაშიც ზუსტად ანალოგიურად გამოიყურება. მიუხედავად ამისა, მოძრაობის ყველა პროგრამისტის ცხოვრებაში დგება დრო, როცა მათ უნდათ ისეთი რამის დახატვა, რომელიც მოძრაობისკენ არის მიმართული. შეიძლება, ხატავთ ჭიანჭველას, მანქანას ან კოსმოსურ ხომალდს. როცა ვამბობთ „მოძრაობისკენ მიმართული“, სინამდვილეში, ვგულისხმობთ„სიჩქარის ვექტორის მიხედვით მობრუნებას“. სიჩქარე არის ვექტორი x და y კომპონენტებით, მაგრამ ProcessingJS-ში მობრუნებისთვის გვჭირდება კუთხე. კიდევ ერთხელ დავხატოთ ჩვენი ტრიგონომეტრიის დიაგრამა ობიექტის სიჩქარის ვექტორით:
კარგი. ჩვენ ვიცით, რა არის ტანგენსის განსაზღვრება:
()=yx
ზედა მოცემულობაში პრობლემა ისაა, რომ ჩვენ ვიცით სიჩქარე, მაგრამ არ ვიცით კუთხე. უნდა ვიპოვოთ კუთხე. ამ დროს შემოდის სპეციალური ფუნქცია, ტანგენსის შებრუნებული, ზოგჯერ მას არკტანგენსს (ინგლ. arctangent) ან tan-1-ს ვუწოდებთ\ (აგრეთვე არსებობს კოსინუსის შებრუნებული და სინუსის შებრუნებული ფუნქციები).
თუ რაიმე a მნიშვნელობის ტანგენსი უდრის რაიმე b მნიშვნელობას, მაშინ b-ის ტანგენსის შებრუნებული უდრის a-ს. მაგალითად:
თუ(a)=b
მაშინa=(b)
ხედავთ, რატომ არის ის შებრუნებული? ზედა მოცემულობა ახლა საშუალებას გვაძლევს, ვიპოვოთ კუთხე:
თუ()=y/x
მაშინ=(y/x)
ახლა, როცა ფორმულა გვაქვს, ვნახოთ, სად უნდა გამოვიყენოთ ის ჩვენი mover-ის display() ფუნქციაში. აღვნიშნოთ, რომ ProcessingJS-ში არკტანგენსის ფუნქციას ჰქვია atan(). JavaScript-ი აგრეთვე გვთავაზობს საკუთარ Math.atan()-ს (აგრეთვე სხვა საბაზისო ტრიგონომეტრიულ ფუნქციებს), მაგრამ ჩვენ გამოვიყენებთ ProcessingJS-ის ფუნქციებს.
Mover.prototype.display = function () {
  var angle = atan(this.velocity.y / this.velocity.x);

  stroke(0, 0, 0);
  fill(127, 127, 127);
  pushMatrix();
  rectMode(CENTER);
  translate(this.position.x, this.position.y);
  rotate(angle);
  rect(0, 0, 30, 10);
  popMatrix();
};
ახლა ჩვენი კოდი საკმაოდ ახლოსაა და თითქმის მუშაობს, მაგრამ ერთი დიდი პრობლემა მაინც გვაქვს. მოდით, განვიხილოთ სიჩქარის ორი ვექტორი, რომლებიც ქვემოთაა გამოსახული.
იმის მიუხედავად, რომ ისინი ზედაპირულად ერთმანეთს ჰგვანან, ეს ორი ვექტორი სრულიად სხვადასხვა მხარესაა მიმართული — ერთმანეთის საპირისპირო მიმართულებით! თუმცა, თუ ჩვენს ფორმულას გამოვიყენებთ კუთხის საპოვნელად თითოეულ ვექტორზე…
V1 ⇒ კუთხე = atan(3/-4) = atan(-0,75) = -0,644 რადიანი = -57 გრადუსი
V2 ⇒ კუთხე = atan(-3/4) = atan(-0,75) = -0,644 რადიანი = -57 გრადუსი
…ორივე ვექტორისთვის ვიღებთ იმავე კუთხეს. ეს სწორი ვერ იქნება ორივე ვექტორისთვის; ისინი საპირისპიროდ არიან მიმართული! ეს საკმაოდ გავრცელებული პრობლემაა კომპიუტერულ გრაფიკაში. დადებითი/უარყოფითი ვარიანტების გასათვალისწინებლად atan()-ისა და რამდენიმე პირობითი დებულების გამოყენების ნაცვლად, ProcessingJS-ს (JavaScript-სა და პროგრამირების სხვა დანარჩენ გარემოებთან ერთად) აქვს მშვენიერი ფუნქცია, სახელად atan2(), რომელიც ამ ყოველივეს თქვენ ნაცვლად გააკეთებს.
Mover.prototype.display = function () {
  var angle = atan2(this.velocity.y, this.velocity.x);

  stroke(0, 0, 0);
  fill(127, 127, 127);
  pushMatrix();
  rectMode(CENTER);
  translate(this.position.x, this.position.y);
  rotate(angle);
  rect(0, 0, 30, 10);
  popMatrix();
};
ამის კიდევ უფრო გასამარტივებლად PVector ობიექტს აქვს ფუნქცია, სახელად heading(), რომელიც თქვენ ნაცვლად იძახებს atan2() ფუნქციას, რათა მიიღოთ 2-განზომილებიანი მიმართულების კუთხე რადიანებში ნებისმიერი PVector-ისთვის.
აი, როგორ გამოიყურება პროგრამა საბოლოოდ. გადაატარეთ თქვენი მაუსი და ნახეთ, როგორ ბრუნავს!

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

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

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