Тоже заинтересовался этим вопросом. Нашел вот такой документ (FingerPrinting canvas in HTML5):
Если коротко, то:
The natural way for browsers to implement such feature is to draw on the host operating system and hardware. Using the GPU for 3D graphics (and even for 2D graphics compositing) provides substantial performance improvements, as well as battery savings on mobile devices. And using the operating system's font-rendering code for text means that browsers automatically display text in a way that is optimized for the display and consistent with the user's expectations.
Расстояние между центрами — число с плавающей точкой. Его вычисление вероятно дороже, чем сравнение нескольких пар целых чисел.
К тому же, если в box2d всё считается в целых числах, то и работать проще с целыми.
Мне кажется, минусовать могут за то, что в статье об этом говорится, а ваше высказывание похоже на то, что вы не вчитывались в статью, а сразу стали писать комментарий.
Как известно, андроид основан на ядре Linux и включает в себя набор стандартных библиотек и утилит командной строки, свойственных обычному Linux-дистрибутиву. Однако запуск классического Linux-софта здесь сильно затруднен из-за множества причин, в числе которых несовместимость ABI, отсутствие менеджера пакетов, собственная система безопасности и отсутствие многих компонентов стандартной Linux-системы.
Так, несмотря на наличие в Android стандартной библиотеки libc и других, их реализация в большинстве случаев несовместима с библиотеками от проекта GNU и сильно урезана по функционалу. По этой причине Linux-софт нужно как минимум пересобирать специально под Android и ARM-процессор, а во многих случаях еще и патчить, добавляя функционал, отсутствующий в библиотеках.
Не нужен большому числу рядовых пользователей — не значит не нужен совсем. А иметь возможность выполнить какую-нибудь специфичную задачу для ПК без этого самого ПК(ноутбука, нетбука и тд) бывает полезно.
А красноглазить — это отдельное удовольствие, которое может и не принесет результата, но доставит много удовольствия от решения не самой стандартной задачи.
Да и вообще: некоторые вещи нужно делать только потому, что можешь. :)
Демоны, компиляторы и т.д. не входят в BusyBox. Если функционала BusyBox вполне достаточно, то и заморачиваться не стоит, но если нужно что-то более специфичное — BotBrew и танцев с бубном будет чуть меньше.
Кстати, подобную «фольгу» мы используем в спелеологии для «самоспаса» (позволяет сохранить тепло и избежать переохлаждения в критических ситуациях). И называем её: «Космическое одеяло». :)
#!/usr/bin/runhaskell
data Avltree a = Leaf | Node a (Avltree a) (Avltree a)
depth Leaf = 0
depth (Node _ l r) = (max (depth l) (depth r)) + 1
getl (Node _ l _) = l
getr (Node _ _ r) = r
getv (Node v _ _) = v
balance t1 t2 = (depth t1) - (depth t2)
balanceLL (Node v (Node lv ll lr) r) = (Node lv ll (Node v lr r))
balanceLR (Node v (Node lv ll (Node rlv rll rrr)) r) = (Node rlv (Node lv ll rll) (Node v rrr r))
balanceRL (Node v l (Node rv (Node lrv lrl lrr) rr)) = (Node lrv (Node v l lrl) (Node rv lrr rr))
balanceRR (Node v l (Node rv rl rr)) = (Node rv (Node v l rl) rr)
insert x Leaf = (Node x Leaf Leaf)
insert x t@(Node v l r)
| x == v = t
| x < v && (balance left_i r) == 2 && x < getv l = balanceLL (Node v left_i r)
| x < v && (balance left_i r) == 2 && x > getv l = balanceLR (Node v left_i r)
| x > v && (balance l right_i) == -2 && x < getv r = balanceRL (Node v l right_i)
| x > v && (balance l right_i) == -2 && x > getv r = balanceRR (Node v l right_i)
| x < v = (Node v left_i r)
| x > v = (Node v l right_i)
where
left_i = insert x l
right_i = insert x r
delete x Leaf = Leaf
delete x (Node v Leaf Leaf) = if v == x then Leaf else (Node v Leaf Leaf)
delete x (Node v l Leaf) = if v == x then l else (Node v l Leaf)
delete x (Node v Leaf r) = if v == x then r else (Node v Leaf r)
delete x (Node v l r)
| v == x = (Node min_v l del_m)
| v > x && abs (balance del_l r) < 2 = (Node v del_l r)
| v < x && abs (balance l del_r) < 2 = (Node v l del_r)
| v > x && (balance (getl r) (getr r)) < 0 = balanceRR (Node v del_l r)
| v < x && (balance (getl l) (getr l)) > 0 = balanceLL (Node v l del_r)
| v > x = balanceRL (Node v del_l r)
| v < x = balanceLR (Node v l del_r)
where
del_m = delete min_v r
del_l = delete x l
del_r = delete x l
min_v = get_min (toList r)
get_min ((x,bal):xs) = x
toList Leaf = []
toList (Node x l r) = (toList l) ++ [(x,balance l r)] ++ (toList r)
isBalanced Leaf = True
isBalanced (Node _ l r) = isBalanced l && isBalanced r && abs (balance l r) < 2
main = print$isBalanced(delete 1 (insert 4(insert 5 (insert 3 (insert 9 (insert 1 Leaf))))))
В курсе ФИЛП (функциональное и логическое программирование) было задание написать рекурсивную реализацию АВЛ-деревьев на Haskell. Надо будет дома посмотреть, вдруг найду старые исходники.
Если коротко, то:
cseweb.ucsd.edu/~hovav/dist/canvas.pdf
К тому же, если в box2d всё считается в целых числах, то и работать проще с целыми.
А красноглазить — это отдельное удовольствие, которое может и не принесет результата, но доставит много удовольствия от решения не самой стандартной задачи.
Да и вообще: некоторые вещи нужно делать только потому, что можешь. :)
Сколько времени я в ней провел…
www.old-games.ru/game/749.html
Кстати, где-то там же была более прозрачная реализация.
Практически первое, что нашлось. АВЛ-дерево на Haskell.
В курсе ФИЛП (функциональное и логическое программирование) было задание написать рекурсивную реализацию АВЛ-деревьев на Haskell. Надо будет дома посмотреть, вдруг найду старые исходники.