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

Եթե գտնվում ես վեբ զտիչի հետևում, խնդրում ենք համոզվել, որ *.kastatic.org և *.kasandbox.org տիրույթները հանված են արգելափակումից։

Հիմնական նյութ

Անկյունային արագություն

Այս ամենը հիշո՞ւմ ես։
Դիրք = Դիրք + Արագություն
Արագություն = Արագություն + Արագացում
Չէ՞ որ նախորդ երկու բաժինների ընթացքում սա ենք քննարկել։ Նույն տրամաբանությունը կարելի է կիրառել պտտվող մարմնի դեպքում։
Անկյուն = Անկյուն + Անկյունային արագություն
Անկյունային արագություն = Անկյունային արագություն + Անկյունային արագացում
Իրականում պտտման դեպքում ամեն ինչ է՛լ ավելի պարզ է, քանի որ անկյունը սկալյար մեծություն է՝ թիվ, ոչ թե վեկտոր։
Նախորդ մարտահրավերի պատասխանը կիրառենք ու փորձենք ProcessingJS-ում գավազան պտտել՝ ինչ-որ անկյան չափով։ Կոդը մոտավորապես այսպիսին կլինի.
translate(width/2, height/2);
rotate(angle);
line(-50, 0, 50, 0);
ellipse(50, 0, 8, 8);
ellipse(-50, 0, 8, 8);
Շարժման սկզբունքները ծրագրավորելուց հետո կստանանք ստորև ներկայացված ծրագիրը։ Գավազանը սկզբում չի պտտվում, իսկ հետո աստիճանաբար սկսում է ավելի արագ պտտվել.
Կարելի է այս գաղափարը ներառել Mover օբյեկտում։ Օրինակ՝ կարող ենք անկյունային շարժմանը վերաբերող հատկություններն ավելացնել Mover-ի կառուցողում։
var Mover = function(m, x, y) {
    this.position = new PVector(x, y);
    this.mass = m;

    this.angle = 0;
    this.aVelocity = 0;
    this.aAcceleration = 0;

    this.velocity = new PVector(random(-1, 1), random(-1, 1));
    this.acceleration = new PVector(0, 0);
};
update() ֆունկցիայում կարող ենք դիրքն ու անկյունը թարմացնել՝ ըստ նույն ալգորիթմի։
Mover.prototype.update = function () {

    this.velocity.add(this.acceleration);
    this.position.add(this.velocity);

    this.aVelocity += this.aAcceleration;
    this.angle += this.aVelocity;

    this.acceleration.mult(0);
};
Իհարկե, որպեսզի այս ամենն իմաստ ունենա, պետք է օբյեկտը պատկերելիս պտտել։
Mover.prototype.display = function () {
    stroke(0, 0, 0);
    fill(175, 175, 175, 200);
    rectMode(CENTER);

    // pushMatrix and popMatrix are needed so that the shape rotation
    //  doesn't affect the rest of the world
    pushMatrix();
    // Set the origin at the shape's location
    translate(this.location.x, this.location.y);
    // Rotate by the angle
    rotate(this.angle);
    rect(0, 0, this.mass*16, this.mass*16);
    popMatrix();
};
Իրականում, եթե կատարեինք այս կոդը, ոչինչ տեղի չէր ունենա, որովհետև անկյունային արագացումն այս պահի դրությամբ 0 է (this.aAcceleration = 0;)։ Առարկայի պտտվելու համար պետք է դրան արագացում հաղորդել։ Իհարկե, կարող ենք պարզապես այլ թիվ գրել.
this.aAcceleration = 0,01;
Այսպիսի տրամաբանության, արժեքների և կենտրոնական ձգող մարմին ունենալու դեպքում կստանանք հետևյալ ծրագիրը.
Սա լավ սկիզբ է, սակայն եթե անկյունային արագացումը դինամիկ որոշենք՝ ըստ միջավայրի ուժերի, ավելի հետաքրքիր ծրագիր կստանաք. չէ՞ որ առարկաները սովորաբար ինքնանպատակ չեն պտտվում։ Իհարկե, կարող ենք փորձել անկյունային արագության ֆիզիկան նմանակել՝ կիրառելով ուժի մոմենտ և իներցիայի մոմենտ հասկացությունները, սակայն դա մեր դասընթացի համար չափազանց բարդ է։ Մենք ավելի փոքր բարդությամբ ծրագիր կփորձենք գրել։
Առայժմ կարող ենք կարճ ու անհետաքրքիր լուծում տալ։ Կարող ենք պարզապես անկյունային արագացումը ստանալ առարկայի արագացման վեկտորից, օրինակ՝
this.aAcceleration = this.acceleration.x;
Ընդունում ենք՝ սա շատ պատահական մոտեցում է։ Այնուամենայնիվ, ազդեցություն ունենում է ծրագրի վրա։ Եթե մարմինն արագանում է դեպի աջ, անկյունային արագացումն ուղղվում է ժամսլաքի ուղղությամբ, եթե արագանում է դեպի ձախ, արագացումն ուղղվում է ժամսլաքին հակառակ ուղղությամբ։ Իհարկե, այս դեպքում կարևոր է վեկտորների չափերը հաշվի առնել։ Արագացման վեկտորի x բաղադրիչը կարող է շատ մեծ լինել, ինչի պատճառով առարկան կարող է շատ տարօրինակորեն պտտվել։ Հետևաբար, կարելի է x բաղադրիչը բաժանել ինչ-որ թվի վրա կամ պարզապես անկյունային արագության համար միջակայք սահմանել։ Ստորև ներկայացնում ենք այս նրբությունները ներառող update() մեթոդ։
Mover.prototype.update = function () {
    this.velocity.add(this.acceleration);
    this.position.add(this.velocity);

    // Հորիզոնական արագացումից ելնելով՝ հաշվել անկյունային արագացումը
    //  և բաժանել ինչ-որ թվի վրա, որպեսզի շատ ուժեղ չլինի
    this.aAcceleration = this.acceleration.x / 10,0;
    this.aVelocity += this.aAcceleration;

    // Սահմանել միջակայք, որպեսզի արագությունը շատ մեծ չլինի
    this.aVelocity = constrain(this.aVelocity, -0{,}1, 0{,}1);
    this.angle += this.aVelocity;

    this.acceleration.mult(0);
};
Այդ փոփոխությունները կիրառելուց հետո ստանում ենք հետևյալ ծրագիրը.

«Բնական նմանակիչներ» դասընթացը ստեղծվել է Դանիել Շիֆմանի «Կոդի բնույթը» գրքի հիման վրա և կիրառվում է ըստ Creative Commons Attribution-NonCommercial 3,0 Unported License-ի։

Ուզո՞ւմ ես միանալ խոսակցությանը։

Առայժմ հրապարակումներ չկան։
Անգլերեն հասկանո՞ւմ ես: Սեղմիր այստեղ և ավելի շատ քննարկումներ կգտնես «Քան» ակադեմիայի անգլերեն կայքում: