Я, конечно, строю догадки, но:
1. В игре возможно нужно не само расстояние, а только "дальше-ближе".
2. Очевидно, что
SQRT(X0^2+Y0^2) > SQRT(X1^2+Y1^2) => (abs(X0)+abs(y0)) > (abs(X1)+abs(y1))
по крайней мере для целых чисел (координаты не дробные ведь).
3. Исходя из (2) для получения (1) достаточно иметь abs(), что и хочет автор топика.
Я не прав?
Не прав. Привожу контрпример. Если x0=1, y0=5, x1=3, y1=4, то имеем:
sqrt(x0^2+y0^2) = sqrt(1+25) = sqrt(26)~=5.099
sqrt(x1^2+y1^2) = sqrt(9+16) = sqrt(25)=5
следовательно sqrt(x0^2+y0^2) > sqrt(x1^2+y1^2)
однако при этом
abs(x0)+abs(y0) = 1+5=6
abs(x1)+abs(y1) = 3+4=7
следовательно abs(x0)+abs(y0) < abs(x1)+abs(y1)
На самом деле, работая с расстояниями, часто можно обойтись без операции извлечения квадратного корня. Достаточно иметь операцию возведения в квадрат. Потому что если sqrt(x0^2+y0^2)>sqrt(x1^2+y1^2) - то x0^2+y0^2 > x1^2+y1^2. Если расстояние, к тому же, сравнивается с константой - то ее квадрат можно вычислить заранее один раз.
Квадраты вычислять легко с помощью таблицы квадратов, если исходные числа 8-битные. Таблица занимает в этом случае всего 512 байт памяти.
---------- Post added at 18:22 ---------- Previous post was at 18:14 ----------
В некоторых случаях работа с квадратами еще более упрощается, если вычисляются квадраты последовательных целых чисел, потому что:
(x+1)^2 = x^2 + 2*x + 1
То есть квадрат следующего числа равен квадрату предыдущего плюс единица плюс удвоенное предыдущее число. Это тождество используется в алгоритме Брезенхама рисования окружности.
Последний раз редактировалось Screw; 15.02.2013 в 21:16.
ATM-Turbo1 512k
ATM-Turbo2 1024k + TSFM
Pentagon 128к
Sinclair ZX-Spectrum 48+ (1шт), 128+ (1шт), +2А (2шт), +3 (3шт)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)