Saya menggunakan cek kuadrat jarak untuk dasarnya semua jarak saya (panjang vector3) memeriksa, karena peningkatan kinerja dari tidak menimbulkan akar kuadrat (seperti dalam pemeriksaan panjang polos).
Dari tampilannya, pemeriksaan jarak kuadrat berfungsi dengan baik di setiap situasi:
if x^2 < y^2, then x < y, even when 0 < (x or y) < 1
Saya tidak mempertimbangkan situasi di mana x atau y kurang dari 0, karena jarak dan kuadrat-jarak selalu akan menjadi positif.
Karena ini berfungsi, sepertinya pemeriksaan jarak jauh tidak pernah dibutuhkan, tetapi saya merasa ada yang tidak beres. Apakah ini masih bertahan dalam situasi akurasi-kritis?
sumber
d^2
berkinerja mengerikan. Dalam A *|dx| + |dy|
berfungsi dengan baik. Saya tidak memiliki tautan saat saya membaca sekitar sebulan lalu.Seperti bummzack mengisyaratkan dengan analogi Pencarian-jalan, Anda PERLU menggunakan panjang "normal" setiap kali Anda menambahkan jarak bersama dan ingin membandingkan jumlah mereka. (Hanya karena jumlah kuadrat panjang berbeda dengan jumlah kuadrat panjang).
x ^ 2 + y ^ 2! = (x + y) ^ 2
sumber
Satu-satunya kelemahan yang bisa saya pikirkan adalah ketika berhadapan dengan angka besar yang akan meluap ketika kuadrat.
Misalnya, di Jawa:
Juga patut dicatat bahwa itulah yang terjadi ketika Anda menggunakan Math.pow () dengan angka yang sama persis dan melemparkan kembali ke int dari ganda yang dikembalikan dari
Math.pow()
:Apakah ini berhasil? Tidak , itu hanya memberikan jawaban yang benar karena
y*y
dijepitInteger.MAX_VALUE
, danx*x
kurang dariInteger.MAX_VALUE
. Jikax*x
juga dijepitInteger.MAX_VALUE
maka Anda akan mendapatkan jawaban yang salah.Prinsip serupa juga berlaku dengan float & dobel (kecuali mereka jelas memiliki jangkauan lebih besar sebelum meluap) dan bahasa lain apa pun yang secara diam-diam memungkinkan luapan air.
sumber
float
s untuk koordinat, yang hanya meluap setelah sekitar10^38
tidakint
.Suatu kali saya bekerja dalam jarak kuadrat, dan melakukan kesalahan dengan mengumpulkan jarak kuadrat, untuk penghitungan odometer.
Tentu saja, Anda tidak dapat melakukan ini, karena secara matematis,
Jadi, saya berakhir dengan hasil yang salah di sana. Ups!
sumber
sqrt
operasi.Anda dapat mengalami masalah jika Anda menulis algoritma yang mengharuskan Anda menghitung posisi yang dioptimalkan. Sebagai contoh, katakanlah Anda memiliki satu set objek, dan Anda mencoba menghitung posisi dengan jarak total terkecil dari semua objek. Sebagai contoh konkret, katakanlah kita sedang mencoba memberi daya pada tiga bangunan, dan kami ingin mengetahui ke mana pembangkit listrik harus pergi sehingga kami dapat menghubungkannya ke semua bangunan menggunakan total panjang kawat terkecil. Dengan menggunakan metrik kuadrat jarak, Anda akan berakhir dengan koordinat x dari pembangkit listrik menjadi rata-rata koordinat x dari semua bangunan (dan analog dengan koordinat y). Menggunakan metrik jarak biasa, solusinya akan berbeda, dan seringkali sangat jauh dari solusi kuadrat jarak.
sumber
x^2
lebih mudah untuk dikerjakan daripada|x|
.Menggunakan jarak kuadrat hampir selalu baik dan bagus untuk kinerja. Pertimbangan berikut ini penting:
Jika Anda ingin memikirkan jumlah dari sejumlah jarak, jarak kuadrat akan tidak akurat. Misalnya, saya memiliki dua jarak dan saya ingin memastikan jumlah mereka kurang dari 10. Kode berikut ini salah:
Gagal menegaskan dalam kasus tidak valid berikut:
a=36
danb=49
. Dalam hal ini, panjang pertama adalah 6 dan 7 kedua; jumlah mereka lebih besar dari 10, tetapi jumlah kotak tidak 100 atau lebih besar.Pertimbangan lain: untuk jarak bernilai nyata, jarak kuadrat akan selalu positif. Jika Anda mengukur perpindahan misalnya, Anda mungkin harus berurusan dengan nilai negatif, dan mengkuadratkannya tidak akan berhasil.
sumber