Birden Fazla Kuvvet Nasıl Çalışır? (Force Accumulation)

Gerçek dünyada bir nesneye aynı anda birden fazla kuvvet etki eder. Bir yaprak düşerken hem yerçekimi aşağı çeker, hem rüzgar yana iter, hem de hava direnci yavaşlatır.

Peki birden fazla kuvveti nasıl hesaplarız? Cevap basit: TOPLAMA!

F⃗net = F⃗₁ + F⃗₂ + F⃗₃ + ...
Net Kuvvet = Tüm kuvvetlerin vektörel toplamı

Vektör Toplama (Vector Addition) Nasıl Çalışır?

Vektörler ok gibidir: yönleri ve uzunlukları (büyüklükleri) vardır. İki vektörü toplamak için birinin ucuna diğerini koyarız:

O A⃗ = (3, 0) B⃗ = (0, 2) A⃗ + B⃗ = (3, 2) A⃗ vektörünü çiz (sağa) A⃗'nın ucundan B⃗'yi çiz (aşağı) Başlangıçtan sona = Toplam vektör!

Sayısal Örnek

// Yerçekimi: sadece aşağı (y pozitif = aşağı)
let gravity = createVector(0, 0.1);

// Rüzgar: sadece sağa (x pozitif = sağ)
let wind = createVector(0.05, 0);

// Net kuvvet = yerçekimi + rüzgar
// x: 0 + 0.05 = 0.05
// y: 0.1 + 0 = 0.1
// Sonuç: (0.05, 0.1) → sağ-aşağı yönde

💡 Neden Toplama?

Fizikteki süperpozisyon ilkesi der ki: Birden fazla kuvvet bir cisme etki ederse, sanki tek bir kuvvet (toplam kuvvet) etki ediyormuş gibi davranır.

applyForce() Fonksiyonu Detaylı

Önceki bölümde gördüğümüz applyForce() fonksiyonu kuvvet biriktirmenin anahtarıdır:

applyForce(force) {
  // Kuvveti ivmeye EKLE (üzerine yazma!)
  this.acceleration.add(force);
}

Neden add() Kullanıyoruz?

Eğer this.acceleration = force yazsaydık, her yeni kuvvet öncekinin üzerine yazardı. Ama add() kullanarak kuvvetleri biriktiriyoruz.

// Her frame'de:
mover.applyForce(gravity);  // ivme = (0, 0.1)
mover.applyForce(wind);     // ivme = (0, 0.1) + (0.05, 0) = (0.05, 0.1)
mover.applyForce(friction); // ivme = (0.05, 0.1) + sürtünme

// update() sonunda:
this.acceleration.mult(0);  // ivme sıfırlanır, bir sonraki frame için hazır

⚠️ Sıfırlama Çok Önemli!

Her frame sonunda ivmeyi sıfırlamayı unutmayın! Aksi halde kuvvetler sürekli birikir ve nesne kontrolden çıkar.

Mantık: İvme "şu anki kuvvetlerin etkisi"dir. Her frame'de kuvvetler yeniden hesaplanır, bu yüzden ivme de sıfırdan başlar.

Örnek: Yerçekimi + Rüzgar

Şimdi iki kuvveti bir arada görelim. Top hem aşağı düşecek (yerçekimi) hem de yatay hareket edecek (rüzgar).

Önemli Noktalar:

Satır 11-12
İki farklı kuvvet oluşturuyoruz: yerçekimi aşağı, rüzgar sağa.
Satır 14-15
Her iki kuvveti de uyguluyoruz. applyForce() onları toplar.

🔬 Deneyin:

  1. Satır 12: Rüzgarı createVector(-0.1, 0) yapın. Beklenti: Top sola doğru itilir
  2. Satır 11: Yerçekimini createVector(0, -0.1) yapın. Beklenti: Top yukarı "düşer"! (ters yerçekimi)
  3. Yeni kuvvet: let push = createVector(0, -0.3); ekleyin ve uygulayın. Beklenti: Top havada kalır veya yükselir (yukarı itme)

Örnek: Mouse ile Rüzgar Kontrolü

Etkileşimli bir örnek yapalım: mouse'a basıldığında rüzgar essin!

Yeni Kavramlar:

mouseIsPressed
p5.js'in özel değişkeni. Mouse'a basılıysa true, değilse false.
if koşulu
Rüzgar sadece mouse'a basıldığında uygulanır. Bu sayede interaktif kontrol elde ederiz.

🔬 Deneyin:

  1. Canvas'a tıklayıp basılı tutun. Rüzgar etkisini görün.
  2. Rüzgar yönünü mouse konumuna göre değiştirin:
    let wind = createVector((mouseX - width/2) * 0.001, 0);
    Beklenti: Mouse sağdaysa sağa, soldaysa sola rüzgar

Birden Fazla Nesne

Mover sınıfımızın güzelliği burada ortaya çıkıyor: dizi (array) kullanarak istediğimiz kadar nesne oluşturabiliriz!

Dizi Kullanımı:

movers = []
Boş bir dizi oluşturuyoruz. Tüm Mover'ları burada tutacağız.
for döngüsü (setup)
5 tane Mover oluşturuyoruz. Her biri rastgele konumda başlıyor.
for...of döngüsü (draw)
Her Mover için aynı kuvvetleri uyguluyoruz. Her biri bağımsız hareket eder.

🔬 Deneyin:

  1. Satır 6: i < 20 yaparak 20 top oluşturun.
  2. Her topa farklı kütle verin (sonraki konumuzun habercisi!):
    new Mover(random(width), random(height/2), random(0.5, 3))

📝 Bu Bölümün Özeti