Hareketin Temeli: Newton Yasaları

Fizik simülasyonları oluşturmanın temeli, Sir Isaac Newton'un 17. yüzyılda keşfettiği hareket yasalarını anlamaktan geçer. Bu yasalar, gerçek dünyada nesnelerin nasıl hareket ettiğini açıklar.

💡 Neden Newton?

p5.js'te bir daire çizip hareket ettirmek kolay. Ama gerçekçi görünmesi için fizik kurallarına ihtiyacımız var. Newton yasaları bize bu kuralları veriyor.

Newton'un 1. Yasası: Eylemsizlik (Inertia)

"Hareketsiz cisim hareketsiz kalır, hareketli cisim hareketine devam eder"
...dış bir kuvvet uygulanmadığı sürece

Bu Ne Demek?

Bir topun masanın üzerinde durduğunu düşünün. Siz itmedikçe top orada duracak. Şimdi topu yuvarladığınızı düşünün - sürtünme ve hava direnci olmasa, top sonsuza kadar yuvarlanmaya devam ederdi!

Koddaki Karşılığı

Eğer bir nesneye hiç kuvvet uygulamazsak (acceleration = 0), hızı (velocity) sabit kalır:

// Kuvvet yoksa ivme sıfır
// İvme sıfırsa hız değişmez
// Hız değişmezse cisim aynı hızda devam eder

update() {
  // acceleration zaten (0, 0) ise:
  this.velocity.add(this.acceleration);  // hız değişmez
  this.position.add(this.velocity);       // aynı hızla hareket
}
Oyuncak fare dengeli kuvvetler
Şekil 2.1: Oyuncak fare hareket etmiyor çünkü tüm kuvvetler birbirini dengeliyor

Newton'un 2. Yasası: F⃗ = m × a⃗ (Force = Mass × Acceleration)

F⃗ = m × a⃗
Kuvvet (vektör) = Kütle (skaler) × İvme (vektör)

Formülü Anlayalım

F (Force)
Kuvvet - Bir cismi iten veya çeken şey. Vektördür: hem yönü hem büyüklüğü var.
m (Mass)
Kütle - Cismin "ağırlığı". Daha ağır cismi hareket ettirmek daha zordur.
a (Acceleration)
İvme - Hızın ne kadar hızlı değiştiği. Vektördür: hem yönü hem büyüklüğü var.

Bizim İçin Önemli Form:

a⃗ = F⃗ / m
İvme (vektör) = Kuvvet (vektör) / Kütle (skaler)

Neden bu form? Çünkü simülasyonlarda kuvveti biliyoruz (yerçekimi, rüzgar vb.) ve ivmeyi hesaplamak istiyoruz. İvmeyi bulunca hareket formüllerimize ekleyebiliriz.

Gerçek Hayat Örneği

Aynı kuvvetle bir ping-pong topu ve bir bowling topu ittiğinizi düşünün:

Newton'un 3. Yasası: Etki-Tepki (Action-Reaction)

"Her etkiye eşit ve zıt bir tepki vardır"
F⃗₁₂ = -F⃗₂₁

Bu Ne Demek?

Duvara yumruk attığınızda, duvar da size aynı kuvvetle yumruk atar! (O yüzden eliniz acır 😅)

Roketler böyle çalışır: roket gazı aşağı iter, gaz da roketi yukarı iter.

Newton'un 3. yasası - paten ile kamyon itme
Şekil 2.2: Patenli birinin kamyonu itmesi - itme kuvveti eşit ve zıt, ama sonuçlar farklı

🎮 Oyunlarda Kullanımı

Bu yasayı her zaman modellemeyeceğiz. Basit simülasyonlarda genellikle sadece bir tarafa etki eden kuvveti düşünürüz. İleri seviyede (çarpışma fiziği gibi) bu yasa önemli olur.

En Basit Örnek: Düşen Top

Newton yasalarını anladık. Şimdi en basit fizik simülasyonunu yapalım: yerçekimi etkisiyle düşen bir top.

Kodun Mantığı

  1. Topun konumu (position) ve hızı (velocity) var
  2. Her frame'de yerçekimi kuvveti uyguluyoruz
  3. Kuvvet → İvme → Hız değişimi → Konum değişimi

Satır Satır Açıklama:

Satır 1-2
position ve velocity vektörleri tanımlıyoruz. Bunlar topun nerede olduğunu ve ne hızla hareket ettiğini tutar.
Satır 5-8
setup() fonksiyonu bir kez çalışır. Canvas oluşturuyoruz ve topun başlangıç değerlerini ayarlıyoruz.
Satır 13
Yerçekimi kuvveti! (0, 0.2) vektörü x=0 (yatay yok), y=0.2 (aşağı doğru) demek.
Satır 16
Newton'un 2. yasası! İvmeyi hıza ekliyoruz. Her frame'de hız biraz daha artar (hızlanma).
Satır 17
Hızı konuma ekliyoruz. Top aşağı doğru hareket eder.
Satır 20-24
Yerden sekme! Top canvas'ın altına ulaşınca hızını tersine çeviriyoruz (*= -0.9). 0.9 çarpanı enerji kaybını simüle eder.

🔬 Deneyin:

  1. Satır 13: Yerçekimini createVector(0, 0.5) yapın. Beklenti: Top daha hızlı düşer (daha güçlü yerçekimi)
  2. Satır 13: createVector(0.1, 0.2) yapın. Beklenti: Top hem aşağı hem sağa hareket eder
  3. Satır 22: -0.9 yerine -1.0 yapın. Beklenti: Top enerji kaybetmeden seçer
  4. Satır 22: -0.5 yapın. Beklenti: Top çok az seçer (yüksek enerji kaybı)

Mover Sınıfı: Daha Düzenli Kod

Yukarıdaki kod çalışıyor ama birden fazla top istesek kod karmaşıklaşır. Object-Oriented Programming (OOP) kullanarak bir Mover sınıfı oluşturalım.

💡 Sınıf (Class) Nedir?

Sınıf, bir "şablon" gibidir. Örneğin Mover sınıfı "hareket eden nesne" şablonudur. Bu şablondan istediğimiz kadar top oluşturabiliriz.

Mover Sınıfı Açıklaması:

constructor()
Yeni Mover oluşturulduğunda çağrılır. Başlangıç değerlerini ayarlar. this "bu nesne" demek.
applyForce()
EN ÖNEMLİ FONKSİYON! Dışarıdan kuvvet alır ve ivmeye ekler. Newton'un 2. yasası burada: a = F/m (şimdilik m=1).
update()
Fizik hesaplamalarını yapar. Sıralama önemli: önce hız güncellenir, sonra konum. Son olarak ivme sıfırlanır (bir sonraki frame için).
show()
Nesneyi ekrana çizer. Fizik ve çizim ayrı tutulur (iyi pratik!).
checkEdges()
Kenar kontrolü. Top canvas dışına çıkmasın diye.

⚠️ İvmeyi Neden Sıfırlıyoruz?

this.acceleration.mult(0) satırı çok önemli! İvme, o anki kuvvetlerin toplamıdır. Her frame sonunda sıfırlamazsak, kuvvetler sürekli birikir ve top kontrolden çıkar.

Düşünün: Yerçekimi her frame'de uygulanıyor. Sıfırlamazsak, her frame'de yerçekimi bir öncekinin üzerine eklenir!

🔬 Deneyin:

  1. sketch.js Satır 8: wind değerini createVector(0.05, 0) yapın. Beklenti: Top sağa doğru rüzgarla itilir
  2. mover.js Satır 26: mult(0) satırını silin veya yorum yapın. Beklenti: Top hızla kontrolden çıkar! (ivme birikiyor)

📝 Bu Bölümün Özeti