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

Ha webszűrőt használsz, győződj meg róla, hogy a *.kastatic.org és a *.kasandbox.org nincsenek blokkolva.

Fő tartalom

Kölcsönös vonzás

Remélhetőleg megkönnyíti a továbbiakat, hogy egy egyszerű esettel kezdtünk - egy test vonz egy másikat, – azután továbbléptünk – egy test vonz sok testet. De a valóságban ennél összetettebb a helyzet: sok test vonzza egymást. Más szóval, egy rendszerben minden test vonzza az összes többi testet (kivéve saját magát).
Tulajdonképpen már minden munkát elvégeztünk, ami ehhez kell. Vegyük a Moverek tömbjét tartalmazó programot:
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();
    }
};
A draw() függvényen belül kell varázsolnunk. Jelenleg azt mondjuk: „minden i mozgó objektumnál módosítsd és rajzold meg magad!" Most azt kell mondanunk: „minden i mozgó objektumnál vonzódj minden j mozgó objektumhoz, módosítsd és rajzold meg magad!"
for (var i = 0; i < movers.length; i++) {
    // Minden Mover esetében: ellenőrizz minden Movert!
    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();
}
Figyeld meg, hogy egy új for ciklust készítettünk a módosítás-és-megjelenítés ciklus köré. Ezt azért csináltuk, mert biztosak akartunk lenni abban, hogy minden vonzóerőt kiszámítunk, mielőtt módosítjuk a mozgó objektumokat. Ha véletlenül az első for ciklusban módosítanánk a mozgó objektumokat, az befolyásolná a későbbi vonzóerő számításokat, és így ezek pontatlanná válnának.
Most még nem működik a program, mert még hozzá kell adni a Moverhez egy calculateAttraction() metódust. Az előző példában volt egy Attractor objektumunk, aminek volt egy calculateAttraction() metódusa. Most, mivel mozgó objektumok vonzanak mozgó objektumokat, ezt a metódust bemásoljuk a Mover objektumba:
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;
};
Persze adódik egy kis probléma. Amikor minden i mozgó objektumot párosítunk minden j mozgó objektummal, foglalkoztunk-e vajon azzal az esettel, amikor i megegyezik j-vel? Például kell-e, hogy a 3. mozgó objektum vonzza a 3. mozgó objektumot? Persze, hogy nem. Ha öt testünk van, akkor azt szeretnénk, hogy a 3. mozgó objektum csak a 0., az 1., a 2. és a 4. mozgó objektumot vonzza, saját magát ugorja át. De ki akarjuk számolni és aktiválni akarjuk azt az erőt, amit a 3. mozgó objektum kifejt az 1. mozgó objektumra, és azt az erőt is, amit az 1. mozgó objektum kifejt a 3. mozgó objektumra. A kiszámított erő ugyanaz lesz mindkét esetben, de az eredményül kapott gyorsulás más lesz a mozgó objektumok tömegétől függően. A vonzás táblázatunknak így kell kinéznie:
0 ⇢ 1, 2, 3, 4
1 ⇢ 0, 2, 3, 4
2 ⇢ 0, 1, 3, 4
3 ⇢ 0, 1, 2, 4
A példa befejezéséhez módosítsuk a belső ciklust úgy, hogy a moverek ne vonzzák saját magukat:
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);
       }
    }
}
Lássuk az egészet egyben! (A programsorokban található megjegyzések: 1. sor: Dan Shiffman, natureofcode.com példája alapján; 31. sor: Kiszámoljuk az erő irányát; 33. sor: Tárgyak közötti távolság; 35. sor: Korlátozzuk a távolságot, hogy kiküszöböljük az „extrém": a nagyon közeli vagy nagyon távoli távolságokat; 37. sor: Normalizáljuk a vektort (a távolság itt nem számít, csak az irány érdekes); 39. sor: Kiszámítjuk a gravitációs erő nagyságát; 41. sor: Elkészítjük az erő vektort -- > hossz · irány.)

Ez a „Természetes szimulációk" tananyag a Daniel Shiffman által készített „The Nature of Code” alapján készült, a Creative Commons Attribution-NonCommercial 3.0 Unported License szerint.

Szeretnél részt venni a beszélgetésben?

Még nincs hozzászólás.
Tudsz angolul? Kattints ide, ha meg szeretnéd nézni, milyen beszélgetések folynak a Khan Academy angol nyelvű oldalán.