ძირითადი მასალა
კომპიუტერული პროგრამირება
კურსი: კომპიუტერული პროგრამირება > თემა 5
გაკვეთილი 6: კუთხური მოძრაობა- კუთხეები და ერთეულები
- გამოწვევა: მბრუნავი ჯოხი
- კუთხური სიჩქარე
- გამოწვევა: ეცემა ქვა
- ტრიგონომეტრია
- ტრიგონომეტრიული შეფარდებები მართკუთხა სამკუთხედებში
- მოძრაობის მიმართულებით მითითება
- გამოწვევა: მანქანა, რომელიც უხვევს
- პოლარული კოორდინატები
- გამოწვევა: სპირალების მხაზავი
- პროექტი: ხომალდი თამაშიდან „Asteroids"
© 2023 Khan Academyგამოყენების პირობებიკონფიდენციალურობის პოლიტიკაშენიშვნა ქუქი-ჩანაწერებზე
მოძრაობის მიმართულებით მითითება
დავუბრუნდეთ ჩვენს ერთ-ერთ პირველ მაგალითს, რომელშიც
Mover
ობიექტი ჩქარდება მაუსისკენ.შეიძლება, შეამჩნიეთ, რომ თითქმის ყველა ფიგურა, რომელსაც ვხატავთ, არის წრე. ეს ხელსაყრელია რამდენიმე მიზეზის გამო, რომელთაგან ერთ-ერთი არის კუთხით მობრუნების გამარტივება. წრე მობრუნების შემთხვევაშიც ზუსტად ანალოგიურად გამოიყურება. მიუხედავად ამისა, მოძრაობის ყველა პროგრამისტის ცხოვრებაში დგება დრო, როცა მათ უნდათ ისეთი რამის დახატვა, რომელიც მოძრაობისკენ არის მიმართული. შეიძლება, ხატავთ ჭიანჭველას, მანქანას ან კოსმოსურ ხომალდს. როცა ვამბობთ „მოძრაობისკენ მიმართული“, სინამდვილეში, ვგულისხმობთ„სიჩქარის ვექტორის მიხედვით მობრუნებას“. სიჩქარე არის ვექტორი x და y კომპონენტებით, მაგრამ ProcessingJS-ში მობრუნებისთვის გვჭირდება კუთხე. კიდევ ერთხელ დავხატოთ ჩვენი ტრიგონომეტრიის დიაგრამა ობიექტის სიჩქარის ვექტორით:
კარგი. ჩვენ ვიცით, რა არის ტანგენსის განსაზღვრება:
ზედა მოცემულობაში პრობლემა ისაა, რომ ჩვენ ვიცით სიჩქარე, მაგრამ არ ვიცით კუთხე. უნდა ვიპოვოთ კუთხე. ამ დროს შემოდის სპეციალური ფუნქცია, ტანგენსის შებრუნებული, ზოგჯერ მას არკტანგენსს (ინგლ. arctangent) ან tan-1-ს ვუწოდებთ\ (აგრეთვე არსებობს კოსინუსის შებრუნებული და სინუსის შებრუნებული ფუნქციები).
თუ რაიმე a მნიშვნელობის ტანგენსი უდრის რაიმე b მნიშვნელობას, მაშინ b-ის ტანგენსის შებრუნებული უდრის a-ს. მაგალითად:
თუ | ტ, ა, ნ, გ, ე, ნ, ს, left parenthesis, a, right parenthesis, equals, b |
მაშინ | a, equals, ა, რ, კ, ტ, ა, ნ, გ, ე, ნ, ს, left parenthesis, b, right parenthesis |
ხედავთ, რატომ არის ის შებრუნებული? ზედა მოცემულობა ახლა საშუალებას გვაძლევს, ვიპოვოთ კუთხე:
თუ | ტ, ა, ნ, გ, ე, ნ, ს, left parenthesis, კ, უ, თ, ხ, ე, right parenthesis, equals, ს, ი, ჩ, ქ, ა, რ, ე, start subscript, y, end subscript, slash, ს, ი, ჩ, ქ, ა, რ, ე, start subscript, x, end subscript |
მაშინ | კ, უ, თ, ხ, ე, equals, ა, რ, კ, ტ, ა, ნ, გ, ე, ნ, ს, left parenthesis, ს, ი, ჩ, ქ, ა, რ, ე, start subscript, y, end subscript, slash, ს, ი, ჩ, ქ, ა, რ, ე, start subscript, x, end subscript) |
ახლა, როცა ფორმულა გვაქვს, ვნახოთ, სად უნდა გამოვიყენოთ ის ჩვენი 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 გრადუსი
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.
გსურთ, შეუერთდეთ დისკუსიას?
პოსტები ჯერ არ არის.