программистское, две ссылки
Mar. 31st, 2010 09:03 pm(интересно будет только программистам)
1. Совершенно замечательное демо трехмерного путешествия по губке Менгера. Смотреть в любом браузере, кроме Эксплорера. Весь код укладывается в 512 байт!
Там используется интересный алгоритм, который называется ray-marching. Должно быть не очень сложным и поучительным упражнением сделать unobfuscation всему этому коду и подробно объяснить, как он работает. Рекомендую; если кто-то сделает это, дайте ссылку и я сюда помещу.
2. Длинная, подробная и интересная запись о том, что неправильно делали разработчики Tcl/Tk, и почему этот язык/среда потеряли в значительной степени свой mindshare к 2010-му году. Трудно подытожить всю эту запись в одном предложении, не буду и пытаться; замечу только, что по мере того, как автор объяснял, что таким-то и таким-то образом у программистов постепенно портилось мнение о Tcl и Tk-программах, я кивал головой: да, именно так я и думал, именно такие - зачастую ложные - впечатления у меня формировались пять и десять лет назад. Все это вместе можно читать как мини-руководство к тому, как не развивать и не поддерживать популярный язык программирования. Комментарии, кое в чем успешно спорящие с автором, тоже интересны.
1. Совершенно замечательное демо трехмерного путешествия по губке Менгера. Смотреть в любом браузере, кроме Эксплорера. Весь код укладывается в 512 байт!
Там используется интересный алгоритм, который называется ray-marching. Должно быть не очень сложным и поучительным упражнением сделать unobfuscation всему этому коду и подробно объяснить, как он работает. Рекомендую; если кто-то сделает это, дайте ссылку и я сюда помещу.
2. Длинная, подробная и интересная запись о том, что неправильно делали разработчики Tcl/Tk, и почему этот язык/среда потеряли в значительной степени свой mindshare к 2010-му году. Трудно подытожить всю эту запись в одном предложении, не буду и пытаться; замечу только, что по мере того, как автор объяснял, что таким-то и таким-то образом у программистов постепенно портилось мнение о Tcl и Tk-программах, я кивал головой: да, именно так я и думал, именно такие - зачастую ложные - впечатления у меня формировались пять и десять лет назад. Все это вместе можно читать как мини-руководство к тому, как не развивать и не поддерживать популярный язык программирования. Комментарии, кое в чем успешно спорящие с автором, тоже интересны.
no subject
Date: 2010-03-31 06:33 pm (UTC)no subject
Date: 2010-03-31 06:36 pm (UTC)Upd: Just to clarify: язык заметки, а не тикль, хотя, конешно, за эти годы его я тоже насмерть позабыл ;-)
no subject
Date: 2010-03-31 09:06 pm (UTC)no subject
Date: 2010-03-31 09:14 pm (UTC)no subject
Date: 2010-03-31 09:49 pm (UTC)Массив sponge в вашей нотации - всего лишь вспомогательный трюк для того, чтобы выделить "среднюю треть" из 128 элементов. Он заполнен единицами с 43-й по 86-й элемент, и нулями во всех остальных местах.
Главный цикл работает вот как. Сначала мы вычисляем наше текущее положение, в трехмерных координатах, внутри мочалки - это X,Y,Z: обратите внимание, что они одинаковы для всех точек битмапа и могут быть вынесены за пределы циклов, они зависят только от time. time помогает нам симулировать наше движение внутри мочалки. Далее, в главном цикле для каждой точки битмапа мы вычисляем направление, в котором должен двигаться "луч зрения", когда мы смотрим под соответствующим углом из нашей точки X,Y,Z; числа u, v, w дают нам сдвиг координат для каждого небольшого шага вдоль луча зрения. Двигаясь этими шажками в третьем вложенном цикле, мы на каждом шагу уменьшаем число света, которое мы хотим нарисовать в точке (x,y) - это число h. Почему уменьшаем число света? - потому что чем дальше препятствие, в которое упрется взгляд, тем светлее мы его делаем. Когда мы прекратим третий цикл, в h будет число от 0 до 127, где 0 - самый белый, 127 - самый черный цвет. Мы умножаем его на два и делаем значением opacity данной точки внутри битмапа, не ставя никаких RGB-значений, одну opacity (для этого i двигается по индексам 3, 7, 11... - это opacity последовательный точек, в то время как 0,1,2 4,5,6 8,9,10 - их RGB-значения).
Мы хотим остановить третий цикл в тот момент, когда наш луч зрения упрется в препятствие. Препятствие для нас - когда мы натыкаемся на первую или третью треть ребра куба, а не на серединную треть, которая вырезана; причем это рекурсивно спускается на вложенные кубики. Этим занимается четвертый цикл. Значение m может меняться так: 1, 3, 9, 27 - и все, если оно еще раз увеличится, то цикл закончится. Каждое из этих значений соответствует уровню рекурсии вложения кубиков. Для каждого из них мы смотрим на 7 последних бит координат X, Y, Z после умножения на m и проверяем с помощью массива sponge, не попали ли мы в "среднюю дырку" по данной координате. Если попали по двум или трем, четвертый цикл заканчивается на маленьком значении m, и третий цикл делает следующий шажок. Если попали всего по одной или нулю, причем для всех уровней m, то мы прекращаем третий цикл и останавливаем луч и записываем, сколько освещения здесь надо, и переходим к следующей точке.
Что мне остается невыясненным, и я бы хотел увидеть подробно расписанным:
- почему условие в четвертом цикле < 2, хотя казалось бы надо < 3
- как именно time интерпретируется в качестве текущего места внутри мочалки, и как получается сдвиг луча зрения ("поворот")
- подробно объяснить преобразования координат и вычисления X,Y,Z, u, v, w.
Update: исправил в этом комментарии неправильные слова насчет смысла X,Y,Z.
no subject
Date: 2010-04-01 12:08 am (UTC)Мне совершенно непонятно что может быть в Tcl привлекательного, ну кроме что Tk. Вообще его существование я могу объяснить только мощным авторитетом Sun на то время, а сейчас он застрял в каких-то замшелых нишах
Непонятное, короче, для меня явление. Типа американских стиральных машин с пропеллером.
no subject
Date: 2010-04-01 12:26 am (UTC)no subject
Date: 2010-04-01 01:29 am (UTC)Вот это такое же непонятное мне явление, как Tcl сосуществующий с Perl и Python.
no subject
Date: 2010-04-01 05:23 am (UTC)no subject
Date: 2010-04-01 06:50 am (UTC)1. Компактностью ядра - для встраивания.
2. Лёгкостью и естественностью метапрограммирования. Не настолько, как в LISP, где вообще программа и данные различаются только содержанием, но очень близко к нему - но при этом сохраняя императивность. Собственно, Tk это плотно использует - биндингам других языков приходится сильно извращаться для достижения того, что на Tcl естественно.
Вместе взятого, этого хватает, чтобы у него были поклонники, ниши и устойчивое развитие.
А ещё у него неплохая библиотека (например, регэкспы мощнее и быстрее перловых)
no subject
Date: 2010-04-01 08:13 am (UTC)no subject
Date: 2010-04-01 05:32 am (UTC)Хотя, конечно, 512 байт -- это круто!
no subject
Date: 2010-04-01 08:00 am (UTC)no subject
Date: 2010-04-10 06:06 pm (UTC)Правда, я понимаю, что такой текст мог бы представлять собой ровно четыре слова, а именно:
CGI и Perl 6.
Hardcore size optimizing JSpongy from 512 bytes to 321 bytes
Date: 2010-04-16 07:51 am (UTC)http://www.p01.org/releases/512b_jspongy/jspongy_hardcore.htm
/!\ this version is heavily optimized for size, not for speed.
Hope you appreciate this as much as the original ;)
Mathieu 'p01' Henri
http://www.p01.org
Re: Hardcore size optimizing JSpongy from 512 bytes to 321 bytes
Date: 2010-04-16 10:07 am (UTC)Re: Hardcore size optimizing JSpongy from 512 bytes to 321 bytes
Date: 2012-01-05 09:35 pm (UTC)