Sto lavorando su una logica vettoriale, quindi chiedo: posso risparmiare tempo del processore semplificando questa disuguaglianza:
distance(vector1, vector2) < distance(vector1, vector3)
Vedo che vector1
si ripete in entrambi i casi.
Sto lavorando su una logica vettoriale, quindi chiedo: posso risparmiare tempo del processore semplificando questa disuguaglianza:
distance(vector1, vector2) < distance(vector1, vector3)
Vedo che vector1
si ripete in entrambi i casi.
Risposte:
Sì , puoi semplificarlo. Per prima cosa, smetti di chiamarli vettori. Sono punti. Chiamiamoli così A
, B
e C
.
Quindi, vuoi questo:
dist(A, B) < dist(A, C)
Sostituisci le distanze con le distanze al quadrato, quindi con i punti (dalla definizione della lunghezza euclidea . Sostituisci AC
con AB + BC
(ora questi sono vettori reali). Espandi, semplifica, fattore:
dist(A, B)² < dist(A, C)²
dot(AB, AB) < dot(AC, AC)
dot(AB, AB) < dot(AB + BC, AB + BC)
dot(AB, AB) < dot(AB, AB) + dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC + 2 AB, BC)
Eccoti:
dot(AB + AC, BC) > 0
Con la tua notazione vettoriale:
dot(v2 - v1 + v3 - v1, v3 - v2) > 0
Sono alcune aggiunte e un prodotto punto invece dei precedenti due prodotti punto.
dist(A, B)²
è la stessa dot(AB, AB)
, viene dalla definizione stessa della lunghezza euclidea .
Sì. Supponendo che la tua distance
funzione usi una radice quadrata, puoi semplificarla rimuovendo la radice quadrata.
Quando si cerca di trovare la distanza maggiore (o minore), x^2 > y^2
vale ancora per x > y
.
Tuttavia, ulteriori tentativi di semplificare matematicamente l'equazione sono probabilmente inutili. La distanza tra vector1
e vector2
non è uguale alla distanza tra vector1
e vector3
. Mentre l'equazione può essere semplificata matematicamente come mostra la risposta di Sam , la forma in cui si trova attualmente è probabilmente tanto semplice quanto otterrai dalla prospettiva di utilizzo del processore.
Alcuni calcoli potrebbero aiutare.
Quello che stai cercando di fare è:
<v1, v2> < <v1, v3> =>
sqrt((y2-y1)^2+(x2-x1)^2) < sqrt((y3-y1)^2+(x3-x1)^2) =>
y2^2 - 2*y2y1 + y1^2 + x2^2 - 2*x2x1 + x1^2 < y3^2 - 2*y3y1 + y1^2 + x3^2 - 2*x3x1 + x1^2
Da ciò che è possibile rimuovere variabili ripetute e raggrupparne altre. L'operazione che devi controllare è:
y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0
Spero che sia d'aiuto.
La vera domanda sembra essere come ridurre il calcolo per determinare l'oggetto più vicino?
Ottimizzazione questo viene spesso eseguita nei giochi, sebbene con tutte le ottimizzazioni dovrebbe essere guidata dal profilo e, spesso, non semplifica le cose.
Il modo per evitare calcoli di distanza non necessari per determinare la cosa più vicina - o tutte le cose entro un certo intervallo - è utilizzare un indice spaziale ad es. Un octree .
Questo paga solo se ci sono molti oggetti. Per soli tre oggetti, è improbabile che ripaghi e certamente non semplifica il codice.
dipende da quale sia l'uscita della distanza (v1, v2)
se è un decimale (float o double) su un vettore, è probabile che le distanze al quadrato siano molto più veloci
float
abbia a che fare con qualcosa.