Ana içerik
Bilgisayar Programlama
Konu: Bilgisayar Programlama > Ünite 5
Ders 5: Kuvvetler- Newton'un Hareket Yasaları
- Zor görev: Havada süzülen balon
- Çok sayıda nesnenin hareketi
- Bilgi Ölçme Yarışması: Duvar topları
- Yerçekimi ve sürtünmeyi modelleme
- Bilgi Ölçme Yarışması: Hız tümsekleri
- Hava ve sıvı direnci
- Bilgi Ölçme Yarışması: Batan kütükler
- Yerçekimsel çekim
- Zor görev: Sanat jeneratörü
- Karşılıklı çekim
- Bilgi Ölçme Yarışması: Karşılıklı itme
© 2023 Khan AcademyKullanım ŞartlarıGizlilik PolitikasıÇerez Politikası
Karşılıklı çekim
Umarım, basit bir senaryoyla başlamayı—bir nesnenin başka bir nesneyi çekmesi—ve bir nesnenin birçok nesneyi çekmesi ne geçmeyi faydalı bulmuşsunuzdur. Ancak, kendinizi biraz daha zor bir durumda bulmanız olasıdır: birçok nesnenin birbirini çekmesi. Başka bir deyişle, belirli bir sistemdeki her nesne o sistemde (kendi hariç) her nesneyi çeker.
Bunu gerektirdiklerinin neredeyse hepsini yaptık.
Mover
nesnelerinden oluşan bir dizi içeren bir programa bakalım:var movers = [];
for (var i = 0; i < movers.length; 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()
fonksiyonunda biraz sihir yapmamız gerekir. Şu anda, dediğimiz şu: “her i hareketlisi için, kendini güncelle ve göster.” Şimdi söylememiz gereken ise: “her i hareketlisi için, başka her j hareketlisi sizi çeksin, ve kendinizi güncelleyin ve gösterin.”for (var i = 0; i < movers.length; i++) {
// Her Mover için, her Mover'ı kontrol et!
for (var j = 0; j < movers.length; j++) {
var force = movers[j].calculateAttraction(movers[i]);
movers[i].applyForce(force);
}
movers[i].update();
movers[i].display();
}
Önceki örnekte, bir
Attractor
nesnesi ve adına calculateAttraction()
denen bir yöntemi vardı. Artık, hareketliler hareketlileri çektiği için, yapmamız gereken tek şey, bu yöntemi Mover
nesnesine kopyalamaktır.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;
};
Elbette, küçük bir sorunumuz vardır. Her i hareketlisi ve her j hareketlisine bakarken, i'nin j'ye eşit olduğu durumlar bizim için uygun mudur? Örneğin, hareketli #3, hareketli #3'ü çekmeli midir? Cevap, tabii ki, hayır. Beş nesne varsa, hareketli #3'ün, kendisini atlayıp, 0, 1, 2, ve 4'ü çekmesini istiyoruz. Ancak, hem hareketli #3'ten hareketli #1'e, hem de hareketli #1'den hareketli #3'e kuvveti hesaplamak ve uygulamak istiyoruz. Hesaplanan kuvvetler ikili için aynı olacaktır, ama sonuçtaki ivme, her hareketlinin kütlesine göre, farklı olacaktır. Çekim tablomuz şöyle olmalıdır:
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
Ve böylece, içteki döngüyü hareketlilerin kendilerini çekmelerini önleyecek şekilde değiştirerek bu örneği bitiririz:
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);
}
}
movers[i].update();
movers[i].display();
}
Şimdi hepsini bir arada görelim:
Bu "Doğal Simülasyonlar" dersi, Daniel Shiffman'ın"Kodun Doğası"'nın bir türevidir ve Creative Commons Yüklemesi-Ticari Olmayan 3,0 Dağıtıma Açık Lisansla kullanılmaktadır.
Tartışmaya katılmak ister misiniz?
Henüz gönderi yok.