Saya sedang mengerjakan beberapa logika vektor, jadi saya bertanya: dapatkah saya menghemat waktu prosesor dengan menyederhanakan ketimpangan ini:
distance(vector1, vector2) < distance(vector1, vector3)
Saya melihat itu vector1
diulang dalam kedua kasus.
Jawaban:
Ya , Anda dapat menyederhanakan ini. Pertama, berhentilah menyebut mereka vektor. Mereka adalah poin. Sebut saja mereka
A
,B
danC
.Jadi, Anda menginginkan ini:
Ganti jarak dengan jarak kuadrat, lalu dengan produk titik (dari definisi panjang Euclidean . Ganti
AC
denganAB + BC
(sekarang ini adalah vektor nyata). Perluas, sederhanakan, faktor:Anda disana:
Dengan notasi vektor Anda:
Itu adalah beberapa tambahan dan satu titik produk daripada dua produk titik sebelumnya.
sumber
dist(A, B)²
samadot(AB, AB)
, pertanyaan itu berasal dari definisi panjang Euclidean .Iya. Dengan asumsi
distance
fungsi Anda menggunakan akar kuadrat, Anda dapat menyederhanakan ini dengan menghapus akar kuadrat.Ketika mencoba menemukan yang lebih besar (atau lebih kecil) dari jarak,
x^2 > y^2
masih berlaku untukx > y
.Namun, upaya lebih lanjut untuk menyederhanakan persamaan secara matematis sepertinya tidak ada gunanya. Jarak antara
vector1
danvector2
tidak sama dengan jarak antaravector1
danvector3
. Sementara persamaan dapat disederhanakan secara matematis seperti yang ditunjukkan oleh jawaban Sam , bentuknya saat ini mungkin sesederhana yang akan Anda dapatkan dari perspektif penggunaan prosesor.sumber
Beberapa matematika bisa membantu.
Apa yang Anda coba lakukan adalah:
Dari apa yang dapat Anda hapus variabel berulang dan kelompok beberapa orang lain. Operasi yang harus Anda periksa adalah:
Semoga ini bisa membantu.
sumber
Pertanyaan sebenarnya adalah bagaimana cara mengurangi perhitungan untuk menentukan objek terdekat?
Mengoptimalkan ini sering dilakukan dalam permainan, meskipun dengan semua optimisasi itu harus dipandu profil dan, seringkali, tidak menyederhanakan banyak hal.
Cara untuk menghindari perhitungan jarak yang tidak perlu untuk menentukan hal yang terdekat - atau semua hal dalam rentang tertentu - adalah dengan menggunakan indeks spasial, misalnya, sebuah octree .
Ini hanya bermanfaat jika ada sejumlah besar objek. Untuk hanya tiga objek, tidak mungkin untuk membayar dan tentu saja tidak menyederhanakan kode.
sumber
itu tergantung pada apa output jarak (v1, v2)
jika itu adalah desimal (float atau double) pada suatu vektor, kemungkinan distancequared akan jauh lebih cepat
sumber
float
hubungannya dengan apa pun.