Bir Noktaya ve Vektör nesnesine ihtiyacım var mı? Ya da sadece bir noktayı temsil etmek için bir Vector nesnesi kullanmak tamam mı?


18

Bir arkadaşımla birlikte geliştirdiğim bir motorun bileşenlerini yapılandırırken (öğrenme amaçları), bu şüphe duydum.

Başlangıçta aşağıdaki gibi bir Point yapıcımız vardı:

var Point = function( x, y ) {
    this.x = x;
    this.y = y;
};

Ama onlara bazı Vector matematiği eklemeye başladık ve Vector2d olarak yeniden adlandırmaya karar verdiler.

Ancak şimdi, bir çizgi yapmak için kullanılan aşağıdaki gibi bazı yöntemler biraz kafa karıştırıcı (en azından benim görüşüme göre):

//before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint
Geometry.Line = function( startingVector, endingVector ) {
    //...
};

Point nesnesi için belirli bir yapıcı yapmalıyım, yoksa bir noktayı bir vektör olarak tanımlamakta sorun yok mu?

Bir vektörün büyüklüğü ve yönü olduğunu biliyorum, ama çok fazla insanın bir nesnenin konumunu temsil etmek için bir vektör kullandığını görüyorum.


1
Konum sadece (0,0 {, 0}) 'dan bir vektör olduğundan, bir vektörün kullanılması iyidir.

Yanıtlar:


8

Tanımların açıklanması ve noktaların vektör olarak ele alınması ile ilgili herhangi bir sorun olması muhtemel değildir - ancak biraz dikkatli olun, çünkü bazı API'lerin kullanmanız gerekebilecek bir 'Nokta' sınıfı vardır (örneğin, çokgen köşelerini temsil etmek için) ve eğer kendi sınıfınızı tanımlarsanız, onları ileri geri taşıyabileceksiniz.

Ne olur ne olsa da, kodunuzda eşit onları tedavi olduğu; vektörü ve noktayı dönüşümlü olarak kullanırsanız, Line () işlevine ilişkin bildiriminizin 'startupVector' ve 'endingVector' hakkında konuşmasının bir nedeni yoktur. Şuraya geri dönmenizi şiddetle tavsiye ederim

Geometry.Line = function( Vector startingPoint, Vector endingPoint ) {
    //...
};

Noktalar, bunu yapmak için Vector sınıfını kullanıyor olsalar bile, bu parametrelerin temsil ettiği değerlerdir.


Bir adım daha ileri gider ve typedef Vector Pointbir başlıkta noktaları tanımlayan bir yere sahip olurdum . Bu şekilde a ve böyle görünüyor Point, neden kullanıldığını kullanırken kimse kafalarını kaşıyor Vectorama iç tarafta sadece bir kod tabanı var.
tpg2114

4

Vector nesnesini kullanmanız yeterlidir. Bunun geçmişte yanlış kullanıldığını / yanlış kullanıldığını hissetseniz bile, insanların beklediği şey budur. Ayrıca, bir vektörü nokta olarak kullanmak her zaman yanlış değildir. Ve her iki veri yapısı da aynı ilkel tipler gerektirdiğinden tartışma dışında yapılması zor olacaktır. Tek fark üye işlevleri olacaktır ve bunları aynı sınıfa koymak yeterince kolaydır, çünkü ikisi arasında çelişkili yöntemlerin çok fazla yolu yoktur.

Öğrenmeye başladığınız için, insanların beklediği şeyleri yapmanın genellikle bir şeyler yapmanın en iyi yolu olduğunu öğrenmek iyidir (sunulan gibi önemsiz seçimler için).


Nokta ve vektörler arasındaki tek fark üye fonksiyonları değildir; so wkritik bileşeni.
kevintodisco

3

Noktalar uzayda konumlardır. Bir koordinat sisteminiz olduğunda, bu noktaları başlangıç ​​noktasından bir mesafe ve yön olarak tanımlayabilirsiniz (bir vektör). Bu nedenle, bir çizginin başlangıç ​​ve bitiş noktalarını tanımlamak için vektörlerin kullanılması son derece mantıklıdır.

Tüm noktaların bir vektör olarak temsil edilebileceğini unutmayın, ancak vektörler nokta değildir. Çoğu vektör, örneğin hız, normal vb. Herhangi bir konum hissine sahip değildir.

Rüzgarı düşünün, yönü ve gücü hakkında konuşabilirsiniz, ancak konumu veya konumu hakkında konuşamazsınız. Uzaydaki noktaları tanımlamak için KULLANILMADIĞINDA vektörleri bu şekilde düşünmelisiniz.


2

Bir noktayı tanımlamak için yalnızca bir vektöre ihtiyacınız vardır. Bir çizgi tanımlamak için iki tane gerekir. Tipik olarak, çizgi üzerinde yatan iki noktanız veya çizgi üzerinde yatan bir noktayı temsil eden bir vektörünüz ve çizginin yönünü temsil eden diğer vektörünüz vardır.

Bir noktayı bir vektör olarak tanımlamakta sorun yoktur, çünkü bir nokta koordinatlarına eşit ve 0,0'a olan mesafesine eşit büyüklükte bir vektördür.

Bir Noktayı ve "Vector2d" yi temsil etmek için iki ayrı sınıfa ihtiyacınız yoktur, ancak bir Nokta muhtemelen çiziminiz veya işlemenizle doğrudan ilişkili farklı üye işlevlerine sahip Vector2d'nin bir alt sınıfı olabilir, Vector2d ise sadece katı vektör matematik işlevleri yapabilir nokta ürünler.


2

Evet, vektörün bileşeninin doğru olduğundan emin olduğunuz süreceVector , hem noktaları hem de vektörleri tanımlamak için tek bir sınıf kullanmakta sorun yokturw0 .

Anahtar bir nokta ve bir vektör arasındaki fark, bir vektör, bir temsil ederken, bir nokta kaynaklı kaydırılmış boşlukta fiziksel bir yer temsil eder, ki yön . Bir nokta tercüme edilebilir, bir vektör olamaz . w2 ya da 3 boyutlu bileşen Vectorsınıfı alma etkisi için bir dönüşüm matrisinin çevirme bileşeni sağlayan şeydir. Öyleyse w, 1çeviri ve döndürme uygulanır; Eğer öyleyse0 , yalnızca döndürme uygulanır.

wBir vektör setinin bileşeninin olmaması 0sizi ısırmaya geri dönebilir; izlemesi oldukça zor olan hatalara yol açar. Güvenli olması için, bir yapabilirsiniz Pointdevralır o sınıfı Vectoraçıkça sınıf ve ayarlar wiçin 1nerede, Vectorsınıf varsayılan wiçin 0.


2
Birçok vektör sınıfı w bileşenini açıkça kullanmaz; çok azı bunu örtük bir öğe olarak ele alır ya da onu uygulayan bir 'ProjectiveVector' sınıfına ne kadar sahip olursa olsun, ancak bir motor kodunun (oluşturma dışında her şey) esasen aw bileşenini taşıyan 'klasik' 3 vektörü kullanır tamamen gereksizdir. Bu bir uygulama detayıdır, vektörlerin veya noktaların önemli bir parçası değildir .
Steven Stadnicki

@StevenStadnicki Bu doğrudur, ancak bir sınıfın hem bir noktayı hem de bir vektörü temsil wetmesi için bileşen mevcut olmalıdır, aksi takdirde nesnenin nasıl kullanılması gerektiğini belirlemenin bir yolu yoktur.
kevintodisco

1
@ktodisco Bence nasıl kullanılması gerektiğini belirlemenin yolu, hangi bağlamda kullanıldığına bakmak.
JCM

1
Yorumu düzenlemek için zamanımız doldu :(. Sınıfı kullanan motorun bölümleri, kullanılacak içeriği tanımlarsa, o zaman işe
yarayacağını söyleyecekti

2

Noktalar ve vektörler aynı şey olarak düşünülebilir. Size mantıklı geliyorsa, konumu bu şekilde temsil eden vektörleri düşünebilirsiniz ve sonra birVector2 başka bir şekildePoint .

Matematikte, vektörler bazen pozisyonu temsil etmek için kullanılır. Bu anlamda kullanıldığında, vektör, bir varlığın başlangıç ​​noktasına göre bulunduğu yeri temsil eder. Örneğin, bir sh'mup yaptığınızı ve oyuncunun gemisinin oyun alanında nerede olduğunu takip etmek istediğinizi varsayalım. Oyun alanının sol alt köşesine (0, 0) olarak davranırsanız, oyuncunun konumunu birVector :

   * Player (3,3)
  /
 /
. (0,0)

Bu durumda vektörün anlamı geminin sağdan 3 birim ve başlangıç ​​noktasından 3 birim yukarıda olmasıdır. (Oyuncunun hızı için bir vektör de kullanabileceğinizi unutmayın, bu durumda oyuncu her saniye veya kare için 3 birim sağa ve 3 birim yukarı hareket eder. Hem konum hem de hız aynı vektör sınıfı ile temsil edilir, ancak vektörleri oyuncunun senaryosunda farklı şekilde işlenmelidir.)

Çizgi örneğinizi kullanmak için, konum vektörü başlangıç ​​"noktasının" ve bitiş "noktasının" başlangıç ​​noktasına göre bulunduğu yeri temsil eder. Başlangıç ​​noktanız oyun alanının merkezi ise, şöyle bir çizgi belirleyebilirsiniz:

             * (8, 2)
             |
     . (0,0) |
             |
             * (8, -2)

Böylece hattın bir ucu 8 birim sağda ve 2 adet oyun alanının ortasının üstünde, diğeri 8 birim sağda ve 2 birim aşağıda.

Açık olmak gerekirse, bu bir Vectorsınıf yerine bir sınıf kullanmanız gerektiği anlamına gelmez Point. Bu, bu fikirlerin nasıl uygulanacağına karar vermeyi kolaylaştırabilecek bu durumu düşünmenin sadece bir yoludur.


Uzayda başka bir noktaya ofset olarak vektör hala göreli koordinatlarda bir nokta olarak düşünülmelidir. Bir oyun motoru söz konusu olduğunda, ona vektör demek yanlıştır.
kevintodisco

0

Bu uygulamaya bağlıdır. Vector2d'de prototipi yerine yöntemlere sahip olmanız gerekiyorsa, bir oyunda ihtiyacınız olan puan miktarı, büyük bir miktar göz önüne alındığında bunun bir maliyeti vardır. JavaScript böyle çalışır. Bu durumda, tüm gereksiz işlevlere sahip olmayan bir Point2d sınıfı oluşturmak daha iyidir.


Yöntemler prototipe ekleniyor, bu yüzden bu bir sorun değil.
JCM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.