Apakah saya memerlukan Point dan objek Vektor? Atau hanya menggunakan objek Vector untuk mewakili suatu Point is ok?

18

Menyusun komponen-komponen mesin yang saya kembangkan bersama seorang teman (tujuan pembelajaran), saya sampai pada keraguan ini.

Awalnya kami memiliki konstruktor Point, seperti berikut:

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

Tetapi mereka kami mulai menambahkan beberapa matematika Vector ke dalamnya, dan mereka memutuskan untuk mengganti namanya ke Vector2d.

Tetapi sekarang, beberapa metode agak membingungkan (setidaknya menurut saya), seperti yang berikut, yang digunakan untuk membuat garis:

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

Saya harus membuat konstruktor spesifik untuk objek Point, atau tidak ada masalah dalam mendefinisikan titik sebagai vektor?

Saya tahu vektor memiliki besar dan arah, tetapi saya melihat begitu banyak orang menggunakan vektor untuk hanya mewakili posisi suatu objek.

JCM
sumber
1
Karena posisinya hanya vektor dari (0,0 {, 0}), vektor boleh digunakan.

Jawaban:

8

Sepertinya tidak akan ada masalah dengan menggabungkan definisi dan memperlakukan titik sebagai vektor - tetapi berhati-hatilah, karena beberapa API memiliki kelas 'Titik' yang mungkin perlu Anda gunakan (untuk mewakili, misalnya, simpul poligon) dan jika Anda menentukan kelas Anda sendiri, Anda ingin dapat mem-port-nya bolak-balik.

Namun, apa yang akan saya lakukan adalah memperlakukan mereka secara setara dalam kode Anda; jika Anda menggunakan vektor dan titik secara bergantian, maka tidak ada alasan bahwa deklarasi Anda untuk fungsi Line () harus berbicara tentang 'startingVector' dan 'endingVector'. Saya akan sangat menyarankan untuk kembali ke

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

Poin mewakili parameter-parameter tersebut, bahkan jika mereka menggunakan vektor kelas untuk melakukannya.

Steven Stadnicki
sumber
Saya akan melangkah lebih jauh dan memiliki suatu typedef Vector Pointtempat di header yang mendefinisikan poin. Dengan cara itu terlihat dan terasa seperti Point, tidak ada yang menggaruk-garuk kepala ketika menggunakannya mengapa itu disebut Vectortetapi di sisi internal itu hanya satu basis kode.
tpg2114
4

Cukup gunakan objek Vector. Bahkan jika Anda merasa ini adalah / telah digunakan secara salah di masa lalu, itu adalah apa yang orang harapkan. Plus, itu tidak selalu salah untuk menggunakan vektor sebagai titik. Dan akan sulit dilakukan di luar diskusi karena kedua struktur data membutuhkan tipe primitif yang sama. Satu-satunya perbedaan adalah fungsi anggota, dan cukup mudah untuk menempatkan mereka di kelas yang sama, karena tidak ada banyak cara metode yang bertentangan antara keduanya.

Karena Anda sedang belajar, ada baiknya belajar bahwa melakukan apa yang orang harapkan sering kali merupakan cara terbaik untuk melakukan sesuatu (untuk pilihan sepele seperti yang disajikan).

MichaelHouse
sumber
Fungsi anggota bukan satu-satunya perbedaan antara titik dan vektor; begitu juga wkomponen, yang sangat penting.
kevintodisco
3

Poin adalah lokasi di luar angkasa. Setelah Anda memiliki sistem koordinat, Anda dapat menggambarkan titik-titik itu sebagai jarak dan arah dari titik asal (vektor). Jadi sangat masuk akal untuk menggunakan vektor untuk menggambarkan titik awal dan akhir suatu garis.

Perlu diketahui bahwa semua titik dapat direpresentasikan sebagai vektor, tetapi vektor bukan titik. Sebagian besar vektor, misalnya kecepatan, normal dll, tidak memiliki indra lokasi.

Pikirkan angin, Anda dapat berbicara tentang arah dan kekuatannya, tetapi Anda tidak dapat berbicara tentang posisi atau lokasinya. Ini adalah bagaimana Anda harus memikirkan vektor ketika mereka TIDAK digunakan untuk menggambarkan titik-titik dalam ruang.

Ken
sumber
2

Untuk menentukan titik, Anda hanya perlu satu vektor. Untuk menentukan garis, Anda perlu dua. Biasanya, Anda memiliki dua titik yang terletak pada garis atau satu vektor yang mewakili titik yang terletak pada garis dan vektor lainnya mewakili arah garis.

Tidak ada masalah mendefinisikan titik sebagai vektor, karena titik IS vektor dengan arah sama dengan koordinat dan besarnya sama dengan jaraknya dari 0,0.

Jadi Anda tidak perlu dua kelas terpisah untuk mewakili suatu Point dan "Vector2d", meskipun suatu Point mungkin bisa menjadi subclass dari Vector2d dengan fungsi anggota yang berbeda yang berhubungan langsung dengan gambar atau pemrosesan Anda, sementara Vector2d mungkin hanya melakukan fungsi matematika vektor yang ketat seperti produk titik.

Eric B
sumber
2

Ya, tidak masalah menggunakan Vectorkelas tunggal untuk mendefinisikan titik dan vektor, selama Anda memastikan bahwa wkomponen vektornya adalah0 .

Perbedaan utama antara suatu titik dan vektor adalah bahwa suatu titik mewakili lokasi fisik dalam ruang, diimbangi dari titik asalnya, sedangkan vektor mewakili suatu arah . Suatu titik dapat diterjemahkan, suatu vektor tidak dapat . The wkomponen dari 2 atau 3 dimensi Vectorkelas adalah apa yang memungkinkan komponen terjemahan dari matriks transformasi untuk efek take. Jika wini 1, maka terjemahan dan rotasi akan diterapkan; jika memang0 , maka hanya rotasi yang akan diterapkan.

Tidak memiliki wkomponen dari set vektor 0dapat kembali menggigit Anda; itu mengarah ke bug yang agak sulit dilacak. Untuk amannya, Anda dapat membuat Pointkelas yang mewarisi dari Vectorkelas dan eksplisit menetapkan wuntuk 1, di mana Vectordefault kelas wuntuk 0.

kevintodisco
sumber
2
Banyak kelas vektor tidak menggunakan komponen w secara eksplisit; cukup banyak yang memperlakukannya sebagai elemen implisit atau memiliki apa yang setara dengan kelas 'ProjectiveVector' yang mengimplementasikannya, tetapi begitu banyak kode mesin (semuanya di luar render, pada dasarnya) menggunakan 3-vektor 'klasik' yang membawa sekitar komponen aw sepenuhnya berlebihan. Ini adalah detail implementasi, bukan bagian penting dari vektor atau poin.
Steven Stadnicki
@StevenStadnicki Itu benar, tetapi untuk memiliki kelas mewakili titik dan vektor, wkomponen harus ada, jika tidak ada cara untuk menentukan bagaimana objek harus digunakan.
kevintodisco
1
@ ktodisco Saya pikir cara untuk menentukan bagaimana seharusnya digunakan, adalah melihat konteks apa yang sedang digunakan.
JCM
1
Kehabisan waktu untuk mengedit komentar :(. Akan mengatakan bahwa jika bagian-bagian mesin yang menggunakan kelas menentukan konteks di mana ia akan digunakan, maka ia akan bekerja.
kevintodisco
2

Poin dan vektor dapat dianggap sebagai hal yang sama. Jika masuk akal bagi Anda, Anda bisa memikirkan vektor yang mewakili posisi dengan cara ini, dan kemudian logis untuk menggunakan Vector2kelas di mana pun Anda seharusnya menggunakanPoint kelas.

Dalam matematika, vektor kadang-kadang digunakan untuk mewakili posisi. Ketika digunakan dalam pengertian ini, vektor mewakili di mana beberapa entitas berada relatif terhadap titik asal. Sebagai contoh, misalkan Anda membuat sh'mup dan Anda ingin melacak di mana kapal pemain berada di area bermain. Jika Anda memperlakukan sudut kiri bawah area bermain sebagai (0, 0), maka Anda dapat mewakili lokasi pemain dengan Vector:

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

Apa artinya vektor dalam hal ini adalah bahwa kapal adalah 3 unit di sebelah kanan dan 3 unit di atas asal. (Perhatikan bahwa Anda juga dapat menggunakan vektor untuk kecepatan pemain, dalam hal ini pemain akan bergerak 3 unit ke kanan dan 3 unit ke atas setiap detik atau bingkai. Kedua posisi dan kecepatan akan diwakili oleh kelas vektor yang sama, tetapi vektor mereka akan diproses secara berbeda dalam skrip pemain.)

Untuk menggunakan contoh garis Anda, vektor posisi mewakili tempat "titik" awal dan "titik" akhir berada relatif terhadap titik asal. Jika asal Anda adalah pusat dari area bermain, Anda bisa menentukan garis seperti ini:

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

Jadi salah satu ujung garis adalah 8 unit di sebelah kanan dan 2 unit di atas tengah lapangan bermain, dan yang lainnya adalah 8 unit di kanan dan 2 unit di bawah.

Untuk lebih jelasnya, ini bukan untuk mengatakan Anda harus menggunakan Vectorkelas, bukan Pointkelas. Ini hanyalah salah satu cara berpikir tentang situasi ini yang dapat membuatnya lebih mudah untuk memutuskan bagaimana menerapkan ide-ide itu.

Kevin - Pasang kembali Monica
sumber
Vektor sebagai offset ke titik lain dalam ruang masih harus dianggap sebagai titik dalam koordinat relatif. Menyebutnya vektor salah, sejauh menyangkut mesin game.
kevintodisco
0

Tergantung implementasinya. Jika Anda harus memiliki metode pada Vector2d alih-alih prototipe, maka ada biaya untuk itu, mengingat jumlah poin yang Anda butuhkan dalam sebuah game, yang utama. Itu hanya cara kerja JavaScript. Dalam situasi itu lebih baik untuk membuat kelas Point2d yang tidak memiliki semua fungsi yang tidak perlu.

dreta
sumber
Metode sedang ditambahkan ke prototipe, jadi ini bukan masalah.
JCM