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

Bağlandığınız bilgisayar bir web filtresi kullanıyorsa, *.kastatic.org ve *.kasandbox.org adreslerinin engellerini kaldırmayı unutmayın.

Ana içerik

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
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.
İngilizce biliyor musunuz? Khan Academy'nin İngilizce sitesinde neler olduğunu görmek için buraya tıklayın.