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

Vektörlere giriş

Bu derste etrafımızdaki dünyaya bakacağız ve bu dünyayı kodla göstermek için zeki yollar araştıracağız. Fiziğin temellerine bakmakla başlayacağız—elma ağaçtan nasıl düşer, sarkaç havada nasıl salınır, dünya güneşin etrafında nasıl döner, vb. Burada tartışacağımız her şey, hareketi programlamadaki en temel yapı taşının kullanımını gerektirir— vektör. Ve işte hikayemize buradan başlıyoruz.
Şimdi, vektör sözcüğünün değişik birçok anlamı olabilir. Vector, 1980'lerin başında Sacramento, CA'da kurulan bir New Wave rock grubunun adıdır. Kellogg’s Kanada tarafından üretilen bir mısır gevreğinin adıdır. Epidemiyoloji alanında, bir vektör, enfeksiyonu bir canlıdan başka bir canlıya ileten organizmayı tanımlamak için kullanılır. C++ programlama dilinde, bir vektör (std::vector), dinamik olarak yeniden boyutlandırılabilir dizi veri yapısının uygulanmasıdır. Bu tanımlar ilginç olsa da, aradığımız şey bu değildir. Bizim istediğimiz bir Öklid vektörüdür (Yunan matematikçi Öklid'in adından alınmıştır ve ayrıca geometrik vektör olarak da bilinir). Bu derste “vektör” terimini gördüğünüzde, hem büyüklük, hem de yönü olan bir varlık şeklinde tanımlanan bir Öklid vektörünün kastedildiğini varsayabilirsiniz.
Bir vektör genellikle bir ok şeklinde çizilir; yön okun işaret ettiği yerle ve büyüklük okun kendisinin uzunluğu olarak belirtilir.
Büyüklük ve yönüyle bir vektör diyagramı
Şekil 1,1: Bir vektörün (ok şeklinde çizilmiş) büyüklüğü (okun uzunluğu) ve yönü (işaret ettiği yön).
Yukarıdaki resimde, vektör A noktasından B noktasına doğru bir ok şeklinde çizilmiştir ve A'dan B'ye nasıl gidildiği hakkında bir yönerge görevi görür.

Neden vektör kullanırız?

Vektörlerle ilgili daha fazla detaya dalmadan önce, her şeyden önce neden vektörlerle ilgilenmemiz gerektiğini gösteren basit bir programa bakalım. Khan Academy'deki JS'ye giriş dersini aldıysanız, belli bir noktada, muhtemelen basit bir zıplayan top programı yazmayı öğrenmişsinizdir.
Yukarıdaki örnekte, çok basit bir dünyamız vardı—üzerinde gezen yuvarlak bir şeklin olduğu (bir “top”) siyah bir tuval. Bu topun, kodda değişkenlerle temsil edilen, bazı özellikleri bulunmaktadır.
KonumSürat
x ve yxspeed ve yspeed
Daha ileri düzeydeki bir programda, daha fazla değişken hayal edebiliriz:
İvmeHedef konumRüzgarSürtünme
xacceleration ve yaccelerationxtarget ve ytargetxwind ve ywindxfriction ve yfriction
Bu dünyadaki her kavram için (rüzgar, konum, ivme, vb.), iki değişkene ihtiyaç duyacağımız gitgide daha açık hale gelmektedir. Ve bu sadece iki boyutlu bir dünyadır. 3 boyutlu bir dünyada, bize gerekenler, x, y, z, xspeed, yspeed, zspeed, ve benzeridir.
Kodumuzu sadeleştirebilsek ve daha az değişken kullanabilsek, güzel olmaz mıydı?
Şunun yerine:
var x = 5;
var y = 10;
var xspeed;
var yspeed;
Sadece iki değişkenimiz olabilirdi, burada her değişken iki boyutlu bilgi içeren bir vektör cinsi nesnedir:
var location;
var speed;
Vektör kullanımındaki bu ilk adımı atmak, yeni bir şey yapmamıza izin vermez. Değişkenleriniz olarak sadece vektör benzeri nesneler kullanmak, programınızın sihirli bir şekilde fizik simülasyonu yapmasını sağlamayacaktır. Ancak, bunlar kodunuzu sadeleştirecektir ve hareketi programlarken tekrar eden yaygın matematiksel işlemler için bir fonksiyon kümesi sağlayacaktır.
Vektörlere giriş olarak, iki boyutta yaşayacağız. Bu örneklerin hepsi kolaylıkla üç boyuta genişletilebilir (ve kullanacağımız nesne—PVector—üç boyuta izin verir.) Ancak, iki boyutla başlamak daha kolaydır.

PVector ile programlama

Vektörü düşünmenin bir yolu da, iki nokta arasındaki fark şeklindedir. Bir noktadan başka bir noktaya yürümek için yönergeyi nasıl sağlayacağınızı düşünün.
Burada bazı vektörler ve olası ötelemeler bulunmaktadır:
Vektörlerin şemaları
Şekil 1,2
| (-15, 3) | Batıya on beş adım at; dön ve kuzeye üç adım yürü. | | (3, 4) | Doğuya üç adım at; dön ve kuzeye dört adım yürü. | | (2, -1) | Doğu yönünde iki adım at; dön ve güney yönde bir adım at. |
Hareketi programladığınızda, muhtemelen bunu daha önce yaptınız. Her animasyon çerçevesi için, (yani ProcessingJS’nin draw() döngüsünde bir seferde), ekrandaki her nesnenin yatay yönde belli bir piksel sayısı ve düşey yönde belli bir piksel sayısı hareket etmesini istiyorsunuz.
Yeni konum bulmak için vektör kullanma şeması
Şekil 1,3
Her çerçeve için:
yeni konum = geçerli konuma uygulanan hız
Hız bir vektörse (iki noktanın arasındaki fark), konum nedir? Bu da bir vektör müdür? Teknik olarak, konumun vektör olmadığını iddia edilebilir, çünkü bir noktadan diğerine hareket etmeyi tanımlamamaktadır—sadece uzayda tekil bir noktayı tanımlamaktadır.
Yine de, bir konumu tanımlamanın başka bir yolu, başlangıç noktasından o konuma giden yoldur. Bu nedenle, bir konum, konumla başlangıç noktası arasındaki farkı temsil eden bir vektör olabilir.
Konumun vektör olarak şeması
Şekil 1,4
Hem konum, hem de hız için altta yatan verileri inceleyelim. Örneğin, zıplayan top örneğinde, şu vardı:
KonumSürat
x ve yxspeed ve yspeed
—İki değişken sayı için birden, aynı verileri sakladığımıza dikkat edin, bir x ve bir y. Kendimiz bir vektör sınıfı yazmaya karar versek, çok temel bir şeyle başlardık:
var Vector = function(x, y) {
this.x = x;
this.y = y;
};
İşin özünde, PVector iki değeri saklamak için uygun bir yoldur (veya 3D örneklerinde göreceğimiz gibi, üç değeri).
Böylece bu …
var x = 100;
var y = 100;
var xspeed = 1;
var yspeed = 3{,}3;
şuna dönüşür …
var location = new PVector(100,100);
var velocity = new PVector(1,3{,}3);
Artık iki vektör nesnemiz olduğuna göre, (konum ve hız), hareket için algoritmamızı uygulamaya hazırız—konum = konum + hız. Örnek 1,1'de, vektörsüz olarak, şu vardı:
x = x + xhız;
y = y + yhız;
İdeal bir dünyada, üsttekini şöyle yazabilirdik:
konum = konum + hız;
Ancak, JavaScript'de, toplama işlemi +, sadece temel değerler (sayılar, stringler) için ayrılmıştır. Bazı programlama dillerinde, işlemcilerde "aşırı yükleme" olabilir, ancak JavaScript'de bu geçerli değildir. Şansımıza,PVector nesnesinde, add() gibi yaygın matematiksel işlemler için yöntemler bulunmaktadır.

Vektörlerle Toplama

PVector nesnesine ve add() yöntemine bakmaya devam etmeden önce, matematik ve fizik ders kitaplarında bulunan notasyonu kullanarak vektörleri toplamayı inceleyelim.
Vektörler, genelde kalın yazı tipi veya üstünde bir okla ifade edilir. Bu derslerde, bir vektörü sayıl dan ayırt etmek için (sayıl bir değeri belirtir, bir tamsayı veya değişen sayı), ok notasyonunu kullanacağız:
  • Vektör: u
  • Skaler: x
Şöyle iki vektörüm olduğunu varsayalım:
2 vektörün şeması
Şekil 1,5
Her vektörün iki bileşeni vardır, x ve y. İki vektörü toplamak için, sadece iki x’i ve iki y’yi toplarız.
Şekil 1,6
Başka bir deyişle:
w=u+v
şöyle yazılabilir:
wx=ux+vxwy=uy+vy
Sonra u ve v'nin yerine Şekil 1,6'daki değerlerini koyduğumuzda, şunu elde ederiz:
wx=5+3wy=2+4
bunun anlamı:
wx=8wy=6
Son olarak, bunu bir vektör olarak yazarız:
w=(8,6)
Şimdi iki vektörü nasıl topladığımızı anladığımıza göre, toplamanın PVector nesnesinin kendinde nasıl uygulandığına bakabiliriz. Adına add() diyeceğimiz bir yöntem yazalım, bu, girdi olarak başka bir PVector nesnesini alır, ve sadece x ve y bileşkelerini toplar.
var Vector = function(x, y) {
    this.x = x;
    this.y = y;
};

Vector.prototype.add = function(v) {
  this.y = this.y + v.y;
  this.x = this.x + v.x;
};
add()'in PVector'ün içinde nazıl yazıldığını artık gördüğümüze göre, konum + hız algoritmalı zıplayan top örneğimize dönebiliriz ve vektör toplamayı uygulayabiliriz:
location.add(velocity);
Artık PVector nesnesini kullanarak zıplayan top örneğini yeniden yazmaya hazırız! Koda bir göz atın ve yukarıdakiyle arasındaki farkları kaydedin.
Yukarıdaki vektörlerle programlamaya geçişin önemli bir özelliğine dikkat etmemiz gerekir. PVector nesnelerini iki değeri tanımlamak için kullansak da, —konumun x ve y'si ve hızın x ve y'si—yine deçoğunlukla her PVector'un x ve y bileşenlerini ayrı ayrı belirtmemiz gerekir. ProcessingJS'de bir nesne çizmeye gittiğimizde, şunu söylemenin yolu yoktur:
ellipse(location, 16, 16);
ellipse() fonksiyonu, PVector'u girdi olarak kabul etmez. Bir ellipse yalnızca iki sayıl değerle çizilebilir, bir x-koordinatı ve bir y-koordinatı. Ve onun için PVector nesnesine dalmamız ve bunun yerine, nesne-odaklı nokta notasyonu kullanarak x ve y bileşenlerini çekmemiz gerekir:
ellipse(location.x, location.y, 16, 16);
Çemberin pencerenin kenarına ulaşıp ulaşmadığını test ederken de aynı sorun ortaya çıkar ve iki vektörün bileşenlerine ayrı ayrı erişmemiz gerekir: konum ve hız.
if ((location.x > width) || (location.x < 0)) {
velocity.x = velocity.x * -1;
}
Şimdi, biraz düş kırıklığı hissedebilirsiniz. Ne de olsa, vektör kullanımındaki bu değişiklik, kodu orijinal versiyondan daha karmaşık hale getirmiş gibi görünebilir. Bu gayet mantıklı ve geçerli bir eleştiri olsa da, henüz vektörlerle programlamanın gücünün tamamının farkına varmadığımızı anlamamız önemlidir. Zıplayan basit bir topa bakmak ve sadece vektörlerle toplamayı uygulamak, yalnızca birinci adımdır. Birden çok nesne ve kuvvetli bir dünyaya (bunu yakında göstereceğiz) doğru ilerlerken, PVector'in faydaları daha belirgin hale gelecektir. Devam edin!

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.