Korzystam z kwadratowych kontroli odległości w zasadzie do sprawdzania wszystkich odległości (długość wektora3), ze względu na wzrost wydajności wynikający z braku naliczania pierwiastka kwadratowego (jak w przypadku kontroli zwykłej długości).
Wygląda na to, że kwadratowe kontrole odległości działają dobrze w każdej sytuacji:
if x^2 < y^2, then x < y, even when 0 < (x or y) < 1
Nie rozważam sytuacji, w których x lub y jest mniejsze niż 0, ponieważ odległość i kwadrat do odległości zawsze będą dodatnie.
Ponieważ to działa, wygląda na to, że kontrole odległości nigdy nie są potrzebne, ale mam dokuczliwe wrażenie, że czegoś mi brakuje. Czy nadal będzie to miało miejsce w sytuacjach krytycznych dla dokładności?
źródło
d^2
działał okropnie. W A *|dx| + |dy|
działa ładnie. Nie mam linku, gdy czytam mniej więcej miesiąc temu.Jak wskazał bummzack z analogią Odnajdywanie Ścieżek, POTRZEBUJESZ używać „normalnej” długości za każdym razem, gdy sumujesz odległości i chcesz porównać ich sumę. (Tylko dlatego, że sumy kwadratów długości różnią się od kwadratów sum długości).
x ^ 2 + y ^ 2! = (x + y) ^ 2
źródło
Jedyną wadą, o której mogę pomyśleć, jest zajmowanie się dużymi liczbami, które przepełnią się po podniesieniu kwadratu.
Na przykład w Javie:
Warto również zauważyć, że tak się dzieje, gdy używasz Math.pow () z dokładnie tymi samymi liczbami i rzutujesz z powrotem na int z podwójnego zwrotu z
Math.pow()
:Czy to działa? Nie , podała tylko poprawną odpowiedź, ponieważ
y*y
jest ograniczona doInteger.MAX_VALUE
ix*x
jest mniejsza niżInteger.MAX_VALUE
. Gdybyx*x
również był zaciśniętyInteger.MAX_VALUE
, otrzymałeś niepoprawną odpowiedź.Podobne zasady obowiązują również w przypadku liczb zmiennoprzecinkowych i podwójnych (z tym wyjątkiem, że oczywiście mają większy zasięg przed przepełnieniem) oraz w każdym innym języku, który cicho dopuszcza przepełnienia.
źródło
float
s do współrzędnych, które przepełniają się dopiero wtedy, gdy10^38
nieint
.Pewnego razu pracowałem na odległościach kwadratowych i popełniłem błąd, kumulując odległości kwadratowe dla licznika przebiegu.
Oczywiście nie możesz tego zrobić, ponieważ matematycznie
Skończyło się na tym, że otrzymałem niepoprawny wynik. Ups!
źródło
sqrt
operację.Możesz napotkać kłopoty, jeśli piszesz algorytm, który wymaga obliczenia zoptymalizowanej pozycji. Załóżmy na przykład, że masz zestaw obiektów i próbujesz obliczyć pozycję przy najmniejszej całkowitej odległości od wszystkich obiektów. Dla konkretnego przykładu, powiedzmy, że próbujemy zasilić trzy budynki i chcemy dowiedzieć się, gdzie powinna iść elektrownia, abyśmy mogli połączyć ją ze wszystkimi budynkami za pomocą najmniejszej całkowitej długości drutu. Używając metryki odległości do kwadratu, skończyłbyś z współrzędną x elektrowni, która jest średnią współrzędnych x wszystkich budynków (i analogicznie dla współrzędnej y). Używając zwykłej miary odległości, rozwiązanie byłoby inne i często bardzo dalekie od rozwiązania kwadratu odległości.
źródło
x^2
łatwiej jest z nimi pracować niż|x|
.Korzystanie z kwadratu odległości jest prawie zawsze w porządku i dobre dla wydajności. Ważne są następujące uwagi:
Jeśli chcesz pomyśleć o sumie kilku odległości, odległość do kwadratu będzie niedokładna. Na przykład mam dwie odległości i chcę się upewnić, że ich suma jest mniejsza niż 10. Poniższy kod jest niepoprawny:
Nie można stwierdzić w następującym nieprawidłowym przypadku:
a=36
ib=49
. W tym przypadku pierwsza długość wynosi 6, a druga 7; ich suma jest większa niż 10, ale suma kwadratów nie jest równa 100 lub większa.Kolejna uwaga: dla odległości o wartościach rzeczywistych odległość do kwadratu zawsze będzie dodatnia. Jeśli na przykład mierzysz przemieszczenie, być może będziesz musiał poradzić sobie z wartościami ujemnymi, a kwadratowanie ich nie da rady.
źródło