Eğer bu mesajı görüyorsanız, web sitemizde dış kaynakları yükleme sorunu yaşıyoruz demektir.

If you're behind a web filter, please make sure that the domains *.kastatic.org and *.kasandbox.org are unblocked.

Ana içerik

Salınım genişliği ve süresi

Yeterince şaşırdınız mı? Açısal hareket bölümünde, tanjant (vektörün açısını bulmak) ve sinüs ve kosinüs (kutupsaldan Kartezyen koordinatlara dönüştürme) için çok güzel kullanımlar gördük. Burada durup memnun kalabiliriz. Ama böyle yapmayacağız. Bu sadece bir başlangıçtır. Sinüs ve kosinüsün sizin için yapacakları, matematiksel formülleri ve dik üçgenleri aşar.
Sinüs fonksiyonunun grafiğine bakalım, y = sine(x)
Sinüs fonksiyonunun sonucunun –1 ile 1 arasında değişen düz bir eğri olduğunu göreceksiniz. Bu tür davranış salınım, iki nokta arasında periyodik bir hareket olarak bilinir. Bir gitar telini çekmek, bir sarkaçı sallamak, bir pogo sopasının üstünde zıplamak—bunların hepsi salınım hareketine örnektir.
Böylece, ProcessingJS programında salınımı, sinüs fonksiyonunun çıktısını bir nesnenin konumunu sinüs fonksiyonunun çıktısına eşitleyerek benzetebiliriz. Bunun, gürültü kısmında Perlin gürültüsüne uyguladığımızla aynı metodolojiyi izlediğine dikkat edin.
Çok basit bir senaryoyla başlayalım. Bir dairenin tuvalin sağ tarafında soldan sağa salınmasını istiyoruz.
Bu, basit harmonik hareket (veya daha da fiyakalısı, “bir nesnenin periyodik sinusoidal salınımı”) olarak bilinir. Bu, yazması kolay bir program olacak, ama kodlamaya girmeden önce, salınımla (ve dalgalarla) ilgili terimlere bakalım.
Basit harmonik hareket, herhangi bir konumu (bizim durumumuzda, x konumu), bu iki ögeyle, zamana göre fonksiyon olarak ifade edebilir:
  • Genlik: Hareketin merkezinden iki aşırı uca uzaklık
  • Periyot: Bir hareket döngüsünü bitirmek için gereken süre
Yukarıda gömülmüş sinüs grafiğine bakarsak, genliğin 1 ve periyodun TWO_PI olduğunu görebiliriz; sinüsün çıktısı, 1'in üstünde veya -1'in altında olamaz; ve her TWO_PI radyanda (veya 360 derecede) bir, dalga örüntüsü tekrar eder.
Şimdi, içinde yaşadığımız ProcessingJS dünyasında, genlik nedir ve periyot nedir? Genlik, piksel cinsinden kolaylıkla ölçülür. 200 piksel enindeki bir ekran durumunda, merkezden 100 piksel sağa ve 100 piksel sola salınırız. Bu nedenle:
// Genliğimizin piksel cinsinden ölçüsü
var amplitude = 100;
Periyot, bir döngü için geçen süredir, ancak ProcessingJS dünyamızda zaman nedir? Yani, çemberin üç saniyede bir salınmasını istediğimizi söyleyebiliriz. Programımızda geçen milisaniyeyi (millis() kullanarak) izleyebiliriz ve bir nesnenin gerçek hayattaki zamanda salınımı için karmaşık bir algoritma bulabiliriz.
Ancak, başka bir seçeneğimiz de vardır: ProcessingJS programlarında "kare" kavramı olduğu, ve ön tanım gereği, bir programın 30 "kare bölü saniye" hızla çalışmayı denediği bilgisini kullanabiliriz. ProcessingJS, hangi karede olduğumuzu bulmak için frameCount değişkenini ve saniye başına tercih edilen kareleri değiştirmek için frameRate() fonksiyonunu verir. 30 FPS ön tanımlı kare hızıdır, çünkü bu insan beynini kandırmak için düz bir animasyon üretecek iyi bir hızdır; ama bazen, örneğin hata ayıklarken, bu kare hızını yavaşlatmak yararlı olabilir.
Böylece, periyodumuzu geçen kare sayısına bağlayabiliriz, zaten gerçek hayattaki zamanla yakın ilişkisini görmüştük - salınım hareketinin 30 karede bir veya 50 karede bir veya 1000 karede bir tekrar etmesi gerektiğini söyleyebiliriz.
// Periyodumuz kare cinsinden ölçülür (animasyon için zaman birimi)
var period = 120;
Genlik ve periyodu bulduktan sonra, x'i, şimdiki kare sayısını koyacağımız, zaman cinsinden bir fonksiyon olarak hesaplayacak formülü yazmanın zamanı gelmiştir.
var x = amplitude * sin(TWO_PI * frameCount / period);
Bu formülü biraz daha inceleyelim ve her parçasını anlamaya çalışalım. Birincisi muhtemelen en kolayıdır. Sinüs fonksiyonundan çıkanı genlikle çarparız. Sinüsün -1'le 1 arasında değişeceğini biliyoruz. Bu değeri alır ve genlikle çarparsak, istenen sonucu elde ederiz: genlikle genlik arasında değişen bir değer. (Not: aynı zamanda, burası ProcessingJS’nin map() fonksiyonunu kullanarak sinüsün çıktısını özel bir görüntü kümesiyle eşleştirmeye uygun bir yerdir.)
Şimdi sinüs fonksiyonunun içindekilere bakalım:
TWO_PI * frameCount / period
Burada neler oluyor? Şimdi bildiğimiz şeyle başlayalım. Sinüsün her 2PI radyanda bir tekrar ettiğini biliyoruz—yani 0'dan başlayacak ve 2PI, 4PI, 6PI, vb. tekrarlayacak. Periyot 120 kareyse, salınım hareketinin frameCount 120 kare, 240 kare, 360 kare, vb. olduğunda tekrar etmesini istiyoruz. frameCount gerçekten tek değişkendir; 0'dan başlar ve yukarı sayılır. Formülün bu değerlerle hangi sonuçları verdiğine bakalım.
frameCountframeCount / periodTWO_PI * frameCount / period
000
600,5PI
1201TWO_PI
24022 * TWO_PI (veya 4* PI)
vb.  
frameCount bölü periyot, tamamladığımız döngü sayısını gösterir—birinci döngünün yarısını geçtik mi? İki döngüyü tamamladık mı? Bu sayıyı TWO_PI ile çarparak, istediğimiz sonucu elde ederiz, çünkü, TWO_PI bir sinüsün bir döngüyü tamamlaması için gereken radyan sayısıdır.
Bunların hepsini toparlarsak, bir çemberin x konumunun 100 piksel genlik ve 120 kare periyotla salınımını veren program şöyle olur.
Frekans teriminden bahsetmek de yerinde olur: zaman birimindeki döngü sayısı. Frekans eşittir 1 bölü periyod. Periyod 120 kareyse, o zaman bir döngünün sadece 1/120'si bir karede tamamlanır, yani frekans = 1/120 döngü/kare. Üstteki örnekte, salınım hızını periyod cinsinden tanımlamayı seçtik ve böylece, frekans için bir değişkene ihtiyacımız olmadı.
Bunların hepsini sinüs fonksiyonunu (ProcessingJS'de sin()) kullanarak yaptığımıza dikkat edin, ancak aynı fikirler kosinüs fonksiyonu için de geçerlidir. İkisinin de periyodu aynıdır ve aralarındaki ana fark, başlangıçtaki genliğin 1'de mi, yoksa 0'da mı başladığıdır.
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.