Fő tartalom
Tantárgy/kurzus: Programozás > 5. témakör
5. lecke: Erők- Newton mozgástörvényei
- Feladat: Lebegő léggömb
- Sok tárgy mozgása
- Feladat: Fallabdák
- A gravitáció és a súrlódás modellezése
- Feladat: Fekvőrendőrök
- A levegő és a folyadék közegellenállása
- Feladat: Süllyedő rönkök
- A gravitációs vonzás
- Feladat: Műalkotás generáló
- Kölcsönös vonzás
- Feladat: Kölcsönös taszítás
- Feladat: Lények jóléte és lelkek morajlása
© 2024 Khan AcademyFelhasználási feltételekAdatkezelési tájékoztatóSüti figyelmeztetés
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
Mover
ek 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
Mover
hez 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
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.