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

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

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

Փոխադարձ ձգողություն

Հույս ունենք, որ ձգողականությունը հասկանալու հարցում քեզ օգնեց այն, որ սկսեցինք պարզ դեպքից՝ մեկ օբյեկտը ձգում է մյուսին, ու անցանք մի փոքր ավելի բարդին՝ մեկ օբյեկտը ձգում է շատերին։ Այնուամենայնիվ, հավանական է, որ ավելի բարդ իրավիճակ էլ կարող է ստեղծվել՝ բազմաթիվ օբյեկտներ ձգում են իրար։ Այլ կերպ ասած՝ համակարգում ցանկացած օբյեկտ ձգում է բոլոր մյուս օբյեկտներին՝ բացի իրենից։
Իրականում աշխատանքը համարյա վերջացրել ենք։ Դիտարկենք Mover օբյեկտների զանգված պարունակող մեր ծրագիրը.
var movers = [];

for (var i = 0; i < 5; i++) {
    movers[i] = new Mover(
        random(0{,}1, 2),
        random(width),
        random(height));
}

draw = function() {
    background(255, 255, 255);
    for (var i = 0; i < movers.length; i++) {
        movers[i].update();
        movers[i].display();
    }
};
Հիմնական փոփոխությունները պետք է կատարենք draw() ֆունկցիայում։ Այս պահի դրությամբ ծրագիրը յուրաքանչյուր i-երորդ շարժվող մասնիկի դեպքում թարմացնում է իր տվյալները և պատկերում այն։ Փոփոխության արդյունքում պետք է յուրաքանչյուր i-երորդ շարժվող մասնիկ ձգի մնացած j-երորդ շարժվող մասնիկներին, թարմացվի և պատկերվի։
for (var i = 0; i < movers.length; i++) {
    // Յուրաքանչյուր Mover-ի համար ստուգել մնացած բոլոր Mover-ները։
    for (var j = 0; j < movers.length; j++) {
        var force = movers[j].calculateAttraction(movers[i]);
        movers[i].applyForce(force);
    }
}

for (var i = 0; i < movers.length; i++) {
    movers[i].update();
    movers[i].display();
}
Ուշադրություն դարձրու, որ թարմացնելու և պատկերելու համար լիովին նոր for ցիկլ ենք գրել։ Դրա պատճառն այն է, որ ցանկանում ենք յուրաքանչյուր շարժվող մասնիկ թարմացնելուց առաջ բոլոր ձգողական ուժերը հաշվել։ Եթե հանկարծ շարժվող մասնիկներն առաջին for ցիկլում թարմացնենք, կազդենք հետագա ձգողական ուժերի հաշվարկի վրա և սխալ արդյունք կստանանք։
Մեր կոդն առայժմ չի աշխատի, քանի որ Mover-ները չունեն calculateAttraction() մեթոդ։ Նախորդ օրինակում Attractor օբյեկտներն ունեին calculateAttraction() կոչվող մեթոդ։ Որպեսզի Mover-ներն իրար ձգեն, կարող ենք այդ մեթոդը պատճենել ու դնել այդ օբյեկտում.
Mover.prototype.calculateAttraction = function(m) {
  var force = PVector.sub(this.position, m.position);
  var distance = force.mag();
  distance = constrain(distance, 5,0, 25,0);                        
  force.normalize();

  var strength = (G * this.mass * m.mass) / (distance * distance);
  force.mult(strength);
  return force;
};
Մի խնդիր ունենք։ Յուրաքանչյուր i-երորդ և j-երորդ շարժվող մասնիկները դիտարկելիս ի՞նչ ենք անում, երբ i-ն հավասար է j-ին։ Օրինակ՝ արդյո՞ք պետք է երրորդ շարժվող մասնիկն ինքն իրեն ձգի. ոչ։ Եթե ունենք հինգ շարժվող մասնիկ, երրորդ մասնիկը պետք է ձգի 0-երորդ, առաջին, երկրորդ ու չորրորդ մասնիկներին, բայց ոչ ինքն իրեն։ Այնուամենայնիվ, կարևոր է, որ հաշվենք և՛ առաջին մասնիկի ձգողությունը երրորդի վրա, և՛ երրորդինը՝ առաջինի վրա. այդ դեպքում, չնայած նույն զույգի համար ենք հաշվել, ուժերը տարբեր կլինեն՝ կախված յուրաքանչյուր շարժվող մասնիկի զանգվածից։ Ձգողության աղյուսակը հետևյալն է.
0 ⇢ 1, 2, 3, 4
1 ⇢ 0, 2, 3, 4
2 ⇢ 0, 1, 3, 4
3 ⇢ 0, 1, 2, 4
Օրինակն ավարտելու համար մեր ցիկլն այնպես փոխենք, որ ներքին ցիկլում շարժվող մասնիկներն իրենք իրենց չձգեն.
for (var i = 0; i < movers.length; i++) {
    for (var j = 0; j < movers.length; j++) {
       if (i !== j) {
         var force = movers[j].calculateAttraction(movers[i]);
         movers[i].applyForce(force);
       }
    }
}
Այժմ կարող ենք տեսնել ամբողջական ծրագիրը.

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

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

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