Salınım Hareketi (Simple Harmonic Motion / SHM)

Basit harmonik hareket, doğada en sık karşılaşılan hareket türlerinden biridir: salıncak, yay, ses dalgaları, kalp atışı... Bu hareketin özü: sinüs dalgası!

💡 Neden "Harmonik"?

"Harmonik" müzikte uyumlu sesler demek. Bu hareket de aynı şekilde düzenli, öngörülebilir ve "uyumlu" bir salınım üretiyor. Doğadaki birçok periyodik hareketin temelini oluşturur.

Sinüs Dalgası (Sine Wave)

Önceki bölümde öğrendiğimiz sin() fonksiyonu, basit harmonik hareketin anahtarıdır. Sin fonksiyonu -1 ile 1 arasında sürekli salınım yapar.

Sinüs dalgası grafiği
Şekil 3.10: Sinüs dalgası grafiği (y = sin(x)). Açı 0'dan 2π'ye ilerlerken, değer -1 ile 1 arasında salınır.
x = A × sin(ωt + φ)
Basit harmonik hareket formülü
A (Amplitude)
Genlik - Salınımın maksimum uzaklığı. Sin -1 ile 1 arasında, A ile çarpınca -A ile A arasında olur.
ω (Angular Frequency)
Açısal frekans - Salınımın hızı. Büyük ω = hızlı salınım, küçük ω = yavaş salınım.
t (Time)
Zaman - p5.js'te frameCount veya artan bir sayaç.
φ (Phase)
Faz - Başlangıç ofseti. Dalganın nereden başlayacağını belirler.

En Basit Örnek: Yatay Salınım

Sin fonksiyonu -1 ile 1 arasında değer üretir. Bunu genlik (amplitude) ile çarparak istediğimiz aralıkta salınım elde ederiz.

Satır Satır Açıklama:

Satır 1
angle sin fonksiyonuna vereceğimiz açı. Sürekli artarak salınımı sağlar.
Satır 2
angularVelocity açının ne kadar hızlı artacağı. Büyük değer = hızlı salınım.
Satır 3
amplitude salınımın genliği. sin() -1 ile 1 arasında, amplitude ile çarpınca -100 ile 100 arası olur.
Satır 12
Sihir burada! sin(angle) -1 ile 1 arasında, amplitude ile çarpınca x pozisyonu -100 ile 100 arasında salınır.

🔬 Deneyin:

  1. Satır 2: angularVelocity = 0.1 yapın. Beklenti: Daha hızlı salınım
  2. Satır 3: amplitude = 150 yapın. Beklenti: Daha geniş salınım
  3. Satır 12: cos(angle) yapın. Beklenti: Aynı salınım, farklı başlangıç noktası (faz farkı)

Periyot ve Frekans (Period & Frequency)

Salınımı tanımlamanın başka bir yolu: ne kadar sürede bir tam salınım yapıyor?

Periyot (T) = Bir tam salınım süresi (frame)
Frekans (f) = 1/T = Saniyede kaç salınım
// Periyot ile çalışma
let period = 120;  // 120 frame'de bir tam salınım
let amplitude = 100;

function draw() {
  // TWO_PI = tam bir sinüs dalgası
  // frameCount / period → 0'dan 1'e gider (period frame'de)
  // TWO_PI ile çarpınca → 0'dan 2π'ye gider
  let x = amplitude * sin(TWO_PI * frameCount / period);
}

💡 TWO_PI Neden?

Sin fonksiyonu 0'dan 2π'ye giderken tam bir dalga çizer. TWO_PI * frameCount / period ifadesi, period kadar frame'de tam bir dalga oluşturur.

Dalga Çizimi (Drawing Waves)

Sinüs dalgasını görselleştirmenin en iyi yolu: birçok noktayı yan yana çizmek.

Önemli Noktalar:

Satır 10
startAngle dalganın başlangıç açısı. Bunu değiştirerek dalga "kayar".
Satır 14
Her x pozisyonu için farklı bir açı hesaplıyoruz. x arttıkça açı da artıyor → dalga şekli oluşuyor.
Satır 21
startAngle'ı artırarak dalganın hareket etmesini sağlıyoruz.

Oscillator Sınıfı (Oscillator Class)

Birden fazla salınım yapan nesne istiyorsak, bir Oscillator sınıfı oluşturmak mantıklı:

Sınıf Yapısı:

angle
Şu anki açı vektörü. x ve y için ayrı açılar tutuyoruz.
velocity
Açının değişim hızı. Random değerler ile farklı salınım hızları.
amplitude
Salınım genliği. x ve y için canvas boyutunun yarısı kadar.

📝 Bu Bölümün Özeti