← На главную

Попробуй hershey в Decker: векторная графика на Lil

22.06.2026 21:05 · hackernews

Модуль hershey для экосистемы Decker использует одни из первых цифровых шрифтов, разработанных доктором Алленом Винсентом Херши. Шрифты описаны простыми последовательностями отрезков прямых. Всё это работает на языке Lil, который напоминает APL. В статье разбирается работа с двумерной векторной графикой на Lil.

Основные структуры: точка (point) — пара чисел (x,y) в виде списка длины 2. Штрих (stroke) — список точек, соединяющий их отрезками: из N точек получается N-1 линия. Путь (path) — список штрихов, то есть вложенный список списков. Функция hershey.textpath[] собирает сложный путь из строки Lil, используя глифы шрифта, например hf_futura "ABC". Нарисовать путь можно функцией canvas.line[], передав ей каждый штрих. Decker поощряет коллективные операции: можно применить canvas.line ко всему пути сразу оператором @.

Преобразования. Конкатенация путей — оператор ,. Равномерное масштабирование — просто умножение числа на вложенный список. Неравномерное масштабирование сложнее: нужно завернуть пару (scaleX, scaleY) в два list, чтобы умножение «продавилось» до каждой точки. Сдвиг делается аналогично через +. Отразить по оси — домножить на отрицательный коэффициент.

Сдвиг по осям (shear) использует примитивы last и first для извлечения Y- или X-координат всех точек. Например, горизонтальный сдвиг: p + (last @ @ p) * list list (shearX,0). Транспонирование — rev @ @ p (меняет x и y местами). Комбинация отражения и транспонирования даёт поворот на 90 градусов.

Более общий поворот требует полярных координат: mag вычисляет расстояние от начала координат для каждой точки, heading — угол в радианах. unit преобразует углы обратно в точки на единичной окружности. Поворот на угол: (mag p) * unit (angle + heading p). С помощью unit легко строить правильные многоугольники и дуги.

Сложные эффекты: перспективное искажение — масштабирование каждой точки на её mag. «Кипение линии» — добавление случайного смещения (random) к каждому штриху. Синусоидальные волны (как флаг на ветру) — отдельно смещать X и Y через first @ @ p и last @ @ p, умножая на синусы от времени (sys.frame). Чем больше синусоид, тем хаотичнее эффект.

Статья заканчивается призывом попробовать самому в интерактивной документации модуля hershey.

Читать оригинал →