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.
Jawaban:
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
Poin mewakili parameter-parameter tersebut, bahkan jika mereka menggunakan vektor kelas untuk melakukannya.
sumber
typedef Vector Point
tempat di header yang mendefinisikan poin. Dengan cara itu terlihat dan terasa sepertiPoint
, tidak ada yang menggaruk-garuk kepala ketika menggunakannya mengapa itu disebutVector
tetapi di sisi internal itu hanya satu basis kode.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).
sumber
w
komponen, yang sangat penting.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.
sumber
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.
sumber
Ya, tidak masalah menggunakan
Vector
kelas tunggal untuk mendefinisikan titik dan vektor, selama Anda memastikan bahwaw
komponen 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
w
komponen dari 2 atau 3 dimensiVector
kelas adalah apa yang memungkinkan komponen terjemahan dari matriks transformasi untuk efek take. Jikaw
ini1
, maka terjemahan dan rotasi akan diterapkan; jika memang0
, maka hanya rotasi yang akan diterapkan.Tidak memiliki
w
komponen dari set vektor0
dapat kembali menggigit Anda; itu mengarah ke bug yang agak sulit dilacak. Untuk amannya, Anda dapat membuatPoint
kelas yang mewarisi dariVector
kelas dan eksplisit menetapkanw
untuk1
, di manaVector
default kelasw
untuk0
.sumber
w
komponen harus ada, jika tidak ada cara untuk menentukan bagaimana objek harus digunakan.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
Vector2
kelas 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
: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:
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
Vector
kelas, bukanPoint
kelas. Ini hanyalah salah satu cara berpikir tentang situasi ini yang dapat membuatnya lebih mudah untuk memutuskan bagaimana menerapkan ide-ide itu.sumber
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.
sumber