Grundsätzlich verwende ich Distance-Squared-Checks für alle meine Distanzprüfungen (Vektor3-Länge), da die Leistung dadurch erhöht wird, dass keine Quadratwurzel entsteht (wie bei einfachen Längenprüfungen).
So wie es aussieht, funktionieren quadratische Distanzprüfungen in jeder Situation einwandfrei:
if x^2 < y^2, then x < y, even when 0 < (x or y) < 1
Ich berücksichtige keine Situationen, in denen x oder y kleiner als 0 ist, da die Entfernung und das Entfernungsquadrat immer positiv sein werden.
Da dies funktioniert, sieht es so aus, als wären nie Abstandskontrollen erforderlich, aber ich habe das quälende Gefühl, dass mir etwas fehlt. Wird dies in genauigkeitskritischen Situationen weiterhin Bestand haben?
quelle
d^2
die schreckliche Leistung beschrieben wurden. In A *|dx| + |dy|
klappt das ganz gut. Ich habe den Link nicht, als ich ungefähr einen Monat zuvor gelesen habe.Wie Bummzack in der Analogie zur Pfadfindung angedeutet hat, MÜSSEN Sie jedes Mal die "normale" Länge verwenden, wenn Sie Entfernungen addieren und ihre Summe vergleichen möchten. (Nur weil die Summe der Längenquadrate sich von der Summe der Längenquadrate unterscheidet).
x ^ 2 + y ^ 2! = (x + y) ^ 2
quelle
Der einzige Nachteil, den ich mir vorstellen kann, ist der Umgang mit großen Zahlen, die beim Quadrieren überlaufen.
Zum Beispiel in Java:
Beachten Sie auch, dass dies passiert, wenn Sie Math.pow () mit genau den gleichen Zahlen verwenden und von dem Double, das von zurückgegeben wird, auf int zurücksetzen
Math.pow()
:Funktioniert es? Nein , es hat nur die richtige Antwort gegeben, weil
y*y
es festgeklemmtInteger.MAX_VALUE
ist undx*x
kleiner alsInteger.MAX_VALUE
. Wennx*x
auch geklemmtInteger.MAX_VALUE
wäre dann bekäme man eine falsche Antwort.Ähnliche Prinzipien gelten auch für Floats & Doubles (außer sie haben offensichtlich eine größere Reichweite, bevor sie überlaufen) und jede andere Sprache, die stillschweigend Überläufe zulässt.
quelle
float
s für Koordinaten, die erst nach etwa10^38
nicht überlaufenint
.Einmal arbeitete ich in quadratischen Abständen und machte den Fehler , quadratische Abstände für eine Kilometerzahl zu addieren.
Natürlich können Sie dies nicht tun, weil mathematisch,
Also habe ich dort ein falsches Ergebnis erzielt. Hoppla!
quelle
sqrt
Operation trotzdem ausführen müssen.Sie könnten Probleme bekommen, wenn Sie einen Algorithmus schreiben, der die Berechnung einer optimierten Position erfordert. Angenommen, Sie hatten eine Reihe von Objekten und haben versucht, die Position mit der geringsten Gesamtentfernung von allen Objekten zu berechnen. Nehmen wir als konkretes Beispiel an, wir versuchen, drei Gebäude mit Strom zu versorgen, und möchten herausfinden, wo das Kraftwerk stehen soll, damit wir es mit der kleinsten Gesamtdrahtlänge an alle Gebäude anschließen können. Bei Verwendung der Distanz-Quadrat-Metrik ergibt sich, dass die x-Koordinate des Kraftwerks der Durchschnitt der x-Koordinaten aller Gebäude ist (und analog für die y-Koordinate). Bei Verwendung der gewöhnlichen Abstandsmetrik wäre die Lösung anders und oft sehr weit von der Lösung im Quadrat der Entfernung entfernt.
quelle
x^2
es einfacher ist, damit zu arbeiten als|x|
.Die Verwendung von Distance Squared ist fast immer in Ordnung und gut für die Leistung. Die folgenden Überlegungen sind wichtig:
Wenn Sie über die Summe mehrerer Entfernungen nachdenken möchten, ist die quadrierte Entfernung ungenau. Zum Beispiel habe ich zwei Entfernungen und ich möchte sicherstellen, dass ihre Summe kleiner als 10 ist. Der folgende Code ist falsch:
Es kann in dem folgenden ungültigen Fall nicht behauptet werden:
a=36
undb=49
. In diesem Fall ist die erste Länge 6 und die zweite 7; Ihre Summe ist größer als 10, aber die Summe der Quadrate ist nicht 100 oder größer.Eine weitere Überlegung: Bei real bewerteten Entfernungen ist das Quadrat der Entfernung immer positiv. Wenn Sie beispielsweise die Verschiebung messen, müssen Sie möglicherweise mit negativen Werten umgehen, und das Quadrieren dieser Werte reicht nicht aus.
quelle