Ana içerik
Bilgisayar Programlama
Konu: Bilgisayar Programlama > Ünite 5
Ders 4: Vektörler- Vektörlere giriş
- Zor görev: Vektör yürüyüşçüsü
- Daha fazla vektör matematiği
- Zor görev: Işın kılıcı
- Vektör büyüklüğü & normalizasyonu
- Zor Görev: Büyüklük görselleştirme
- Vektör hareketi
- Zor görev: Fren yapan araba
- Statik işlevler ve anlık yöntemler
- Zor görev: Statik fonksiyonlar
- Etkileşimli vektör hareketi
- Zor Görev Fare takipçisi
© 2023 Khan AcademyKullanım ŞartlarıGizlilik PolitikasıÇerez Politikası
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.
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.
Konum | Sürat |
---|---|
x ve y | xspeed ve yspeed |
Daha ileri düzeydeki bir programda, daha fazla değişken hayal edebiliriz:
İvme | Hedef konum | Rüzgar | Sürtünme |
---|---|---|---|
xacceleration ve yacceleration | xtarget ve ytarget | xwind ve ywind | xfriction 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:
| (-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.
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.
Hem konum, hem de hız için altta yatan verileri inceleyelim. Örneğin, zıplayan top örneğinde, şu vardı:
Konum | Sürat |
---|---|
x ve y | xspeed 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, with, vector, on top
- Skaler: x
Şöyle iki vektörüm olduğunu varsayalım:
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. Başka bir deyişle:
şöyle yazılabilir:
Sonra
u
ve v
'nin yerine Şekil 1,6'daki değerlerini koyduğumuzda, şunu elde ederiz:bunun anlamı:
Son olarak, bunu bir vektör olarak yazarız:
Ş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.