Ich arbeite an einer Vektorlogik und frage daher: Kann ich Prozessorzeit sparen, indem ich diese Ungleichung vereinfache?
distance(vector1, vector2) < distance(vector1, vector3)
Ich sehe, dass vector1
sich das in beiden Fällen wiederholt.
Ich arbeite an einer Vektorlogik und frage daher: Kann ich Prozessorzeit sparen, indem ich diese Ungleichung vereinfache?
distance(vector1, vector2) < distance(vector1, vector3)
Ich sehe, dass vector1
sich das in beiden Fällen wiederholt.
Antworten:
Ja , Sie können dies vereinfachen. Nennen Sie sie nicht länger Vektoren. Das sind Punkte. Nennen wir sie A
, B
und C
.
Also, du willst das:
dist(A, B) < dist(A, C)
Ersetzen Sie Entfernungen durch Entfernungen im Quadrat und dann durch Punktprodukte (aus der Definition der euklidischen Länge) . Ersetzen Sie AC
durch AB + BC
(jetzt sind dies echte Vektoren). Erweitern, vereinfachen, Faktor:
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)
Da bist du ja:
dot(AB + AC, BC) > 0
Mit Ihrer Vektornotation:
dot(v2 - v1 + v3 - v1, v3 - v2) > 0
Das sind ein paar Ergänzungen und ein Skalarprodukt anstelle der beiden vorherigen Skalarprodukte.
dist(A, B)²
es dasselbe ist wie dot(AB, AB)
, ergibt sie sich aus der Definition der euklidischen Länge .
Ja. Angenommen, Ihre distance
Funktion verwendet eine Quadratwurzel. Sie können dies vereinfachen, indem Sie die Quadratwurzel entfernen.
Beim Versuch, den größeren (oder kleineren) Abstand zu finden, gilt x^2 > y^2
immer noch für x > y
.
Weitere Versuche, die Gleichung mathematisch zu vereinfachen, sind jedoch wahrscheinlich sinnlos. Der Abstand zwischen vector1
und vector2
ist nicht der gleiche wie der Abstand zwischen vector1
und vector3
. Während die Gleichung mathematisch vereinfacht werden kann, wie Sams Antwort zeigt, ist die Form, in der sie gegenwärtig vorliegt, wahrscheinlich so einfach, wie Sie es aus Sicht der Prozessornutzung sehen werden.
Ein bisschen Mathe könnte helfen.
Was Sie versuchen zu tun, ist:
<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
Woraus Sie wiederholte Variablen entfernen und einige andere gruppieren können. Die Operation, die Sie überprüfen müssen, ist:
y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0
Ich hoffe es hilft.
Die eigentliche Frage scheint zu sein, wie die Berechnung zur Bestimmung des nächsten Objekts reduziert werden kann.
Die Optimierung wird oft in Spielen durchgeführt, obwohl sie bei allen Optimierungen profilgesteuert sein sollte und die Dinge oft nicht vereinfacht .
Um unnötige Entfernungsberechnungen zu vermeiden, um das nächste Objekt oder alle Objekte innerhalb eines bestimmten Bereichs zu bestimmen, verwenden Sie einen räumlichen Index, z . B. einen Octree .
Dies zahlt sich nur bei einer großen Anzahl von Objekten aus. Bei nur drei Objekten ist es unwahrscheinlich, dass sie sich auszahlen, und vereinfacht den Code mit Sicherheit nicht .
es hängt davon ab, wie hoch die Ausgabe der Distanz (v1, v2) ist
Wenn es sich um eine Dezimalzahl (Float oder Double) über einem Vektor handelt, ist es wahrscheinlich, dass das Entfernungsquadrat viel schneller ist
float
mit irgendetwas zu tun hat.