Борт-журнал · что менялось, и ПОЧЕМУ именно так · словарь непонятных слов
Архив хранит каждую версию целиком, но архив отвечает на вопрос «как было», а не «зачем так сделали». Здесь второе. Записи короткие, но причина есть у каждой — через месяц именно её и не хватает.
Решение пользователя. Все страницы названы по одному образцу:
Kubits.html → Zerkalius-kubits.html, grid-module.html →
Zerkalius-grid-module.html, ascii-art.html → Zerkalius-ascii-art.html;fold-layers\fold.html → fold-layers\Zerkalius-layers.html;
fold\fold.html → fold\Zerkalius-fold-1115.html — число в имени отмечает место
заморозки, чтобы не путать с цельным Zerkalius-fold.html;oktaedr\ в корень: он пишется про все страницы, а не про
октаэдр.Служебное — в папки с подчёркиванием: четыре общих модуля (recorder,
hub-link, slider-arrows, banks_data) — в _js\, шрифты
ASCII-арта — в _fonts\. В корне остались только страницы и то, что требует GitHub Pages
(index.html, CNAME, README). Старый Fold v0.957 (fold-v0957\), на
который не вело ни одной ссылки, убран с сайта в локальный archive\_retired\.
ПОЧЕМУ НА СТАРЫХ АДРЕСАХ ОСТАЛИСЬ ФАЙЛЫ
На каждом прежнем имени лежит крошечная страница-переадресация: она сразу уводит на новый адрес,
сохраняя хвост ссылки (?…, #…). GitHub Pages сам переадресовывать не умеет,
а закладки и чужие ссылки на 1001100.online/Kubits.html иначе упёрлись бы в «страница не найдена».
Настройки страниц не теряются: браузер хранит их по сайту, а не по имени файла.
Путь к модулям поменялся у тринадцати страниц, поэтому у всех, у кого есть свой номер, он поднят: Layers v1.539, Fold v1.116, цельный Fold v0.742, Genezis v0.427, WebGL v0.330, GPU v0.194, Кубиты v0.306, Grid v11, Code 35.2, октаэдр v0.018, хаб v0.003.
Сделано на другом компьютере и пришло через GitHub. Новая страница oboi\Zerkalius-oboi.html —
обои «Zerkalius Серпинский» из Lively: three.js, дождь символов, надпись, холм или треугольник
Серпинского. Хаб подключает её фоном через iframe, кнопки разложены заново: флагман,
сетка лаборатории, строка знака (там же кнопка «Обои»). Настройки обоев для хаба — в
_js\nastroyka.js: радуга, застывший дождь, без часов и музыки.
ПОЧЕМУ ПОТОМ ПОПРАВЛЕНО
Папка обоев js\ переименована в _js\ — по стандарту имён сайта служебные
папки начинаются с подчёркивания (обои v0.004). С кнопки «Fold цельный» в хабе снят номер
версии (хаб v0.005): номер на кнопке устаревал при каждом бампе файла — так уже вышло с v0.741,
когда файл стал v0.742. Имя кнопки не должно дублировать то, что и так написано в самом файле.
Обои крутят WebGL всё время, пока открыт хаб. На слабой машине это может ощущаться; лекарство, если понадобится, — пауза, пока вкладка не видна.
Просьба пользователя: у oboi\Zerkalius-oboi.html, открытой самой по себе, не было пути
назад в хаб. Теперь есть — тот же общий hub-link.js, что у всех страниц.
ПОЧЕМУ НЕ ВСЕГДА
Та же страница — живой фон самого хаба (в iframe). Там значок висел бы поверх хаба и
звал в хаб из хаба. Поэтому модуль подключается, только если страница — не внутри другой
(window.top===window). Папка oboi добавлена в список подпапок
hub-link.js, иначе ссылка вела бы на несуществующий oboi/index.html.
Новая страница lively\Zerkalius-lively.html: четыре сцены обоев Lively (Холм, Серпинский,
Радар, Воронка) с панелью настройки, как в «Настройка.html». Добавлено то, что уже есть у остальных
машин: трек с диска (🎵), захват звука ПК (🎤) и запись видео (⏺ / R). Движок — копия
_lively\Zerkalius\js (обои 1.9) в lively\_js\; звук и сведение кадра —
lively\_js\zvuk.js. «Мозаика» сюда не вошла: у неё другой движок — неподвижная картинка
из символов, которая реагирует на мышь, а не на звук.
ПОЧЕМУ ЗВУК ИДЁТ ЧЕРЕЗ livelyAudioListener
Обои уже умеют реагировать на музыку — Lively отдаёт им 32 полосы спектра. Страница раскладывает спектр трека или звука ПК на те же 32 полосы и зовёт ту же функцию, поэтому движок не менялся, а холм, дождь, радар и надпись дышат под звук ровно так же, как на рабочем столе.
ПОЧЕМУ КАДР ДЛЯ ЗАПИСИ СВОДИТ САМА СТРАНИЦА
Общий recorder.js складывает холсты как есть. У обоев их пять, а часы, прозрачность
дождя, контраст и полосы экрана сделаны через CSS — в запись они бы не попали, и дождь вышел бы
на полную яркость. Поэтому страница подменяет у записи только сведение кадра; хранилище кусков,
кнопка и восстановление остаются общими. Кадр WebGL снимается сразу после его отрисовки, пока
буфер ещё не отдан экрану (Lively v0.002). В v0.001 для этого был включён preserveDrawingBuffer,
и страница тормозила даже без записи: отклик на клавишу — больше секунды. Флаг заставляет
видеокарту каждый кадр копировать весь экран вместо простой смены буфера.
ПОЧЕМУ ХОЛМ ТОРМОЗИЛ НА «ПЫЛИ» (Lively v0.003)
«Размер символов» у холма меняет не размер, а густоту сетки: при 2 выходило 500×500 = 250 тысяч
символов, и сетка рисуется дважды — чёрной подложкой и знаками. К тому же каждый шаг ползунка
пересобирал холм, а прежняя сетка оставалась в видеопамяти, так что страница тяжелела на глазах.
Теперь у холма потолок в 120 тысяч символов, старая геометрия освобождается, а пересборка
(холм, плотность радара, ширина и глубина Серпинского) идёт, когда ползунок отпустили. Та же утечка
есть и в самих обоях _lively — туда правка не перенесена.
ПОЧЕМУ ПАНЕЛЬ ПРЯЧЕТСЯ НА P
В «Настройка.html» панель пряталась на H, но на сайте H — значок «в Хаб». С v0.004 панель прячется и колесом мыши над обоями (вниз — спрятать, вверх — показать, нажатие — переключить); над самой панелью колесо по-прежнему листает список.
НАСТРОЙКИ СТРОК РАЗДЕЛЕНЫ (Lively v0.010)
Просьба пользователя: не писать в каждой подписи «строка 1: …». В группе «Надпись и часы» над настройками каждой строки — подзаголовок (Строка 1, 2, 3, 4, Вся надпись, Часы), а подписи короткие: «текст», «размер, %», «шрифт», «интервал». В Lively-файле подписи прежние — меняется только панель.
СТРОКА 4: СВОЁ ПОЛЕ ИЛИ НАЗВАНИЕ ТРЕКА (Lively v0.009)
Решение пользователя: у строки 4 своё текстовое поле. Написано в поле — выводится оно, даже когда трек есть. Поле пустое — выводится название: у файла его имя, у звука ПК — имя вкладки или окна, откуда звук. Имя берётся из видеодорожки захвата, и браузер его отдаёт не всегда: вместо имени бывает служебный код («window:123:0», «web-contents-media-stream://…») — такой не выводится, остаётся поле. Имя снимается один раз при начале захвата: если во вкладке сменилась песня, строка сама не обновится.
МОИ НАБОРЫ (Lively v0.008)
Просьба пользователя: свои пресеты — в кэше и в файле. Первая группа панели: список, «загрузить»,
«сохранить» (то же имя — перезапись с вопросом), «удалить», «в файл» (все наборы одним JSON) и
«из файла» (добавляются к своим, одноимённые заменяются). Набор хранит все настройки, включая сцену,
«А», строку трека и цвет дождя. Лежат под отдельным ключом zerk-lively-presets, а не среди
настроек: кнопка «сбросить» чистит настройки, но наборы не трогает. Браузерное хранилище привязано к
этому браузеру и сайту — поэтому и выгрузка в файл: только так наборы переедут на другую машину.
СВОЙ ЦВЕТ ДОЖДЯ (Lively v0.007)
Просьба пользователя. В группе «Дождь» — галочка «свой цвет дождя» и выбор цвета. Снята — дождь, как раньше, берёт общий цвет или радугу. Только на сайте, в Lively не выгружается.
ЗАПИСЬ ДЛЯ ТЕЛЕФОНА 9:16 (Lively v0.006)
Просьба пользователя: видео для мобильника, рамкой показать, что попадёт в кадр. Вырезать
полосу из широкого кадра нельзя — надпись «Zerkalius» рассчитана на всю ширину экрана и ушла бы
за края. Поэтому в режиме «телефон 9:16» сцена целиком перестраивается под вертикальную рамку по
центру (движок берёт размер из stageW(), а не из окна): надпись, часы, дождь, холм,
воронка укладываются в неё. Рамка — пунктир поверх; вокруг чёрное. Запись пишет холсты, поэтому в
видео попадает ровно рамка — ширина = высота окна × 9/16 (при 1080 по высоте — 608×1080).
Переключать формат во время записи нельзя: размер кадра видео уже задан.
КОМПАКТНАЯ ПАНЕЛЬ, «А» У КАЖДОГО ПОЛЗУНКА, СТРОКА ТРЕКА (Lively v0.005)
Просьба пользователя. Подпись, ползунок, число и галочка «А» стоят в одну строку, группы сворачиваются щелчком по заголовку (страница это помнит). Раньше «авто» было только у 33 ползунков из списка обоев; теперь у всех. Чтобы это не тормозило, тяжёлые шевелятся реже: пересборка сетки (густота холма, плотность радара, ширина и глубина Серпинского) — не чаще раза в секунду, пересчёт надписи, дождя и воронки — раза в четверть секунды, и только когда целое значение сменилось. Надпись и дождь теперь пересчитываются порознь: раньше любая правка надписи стирала дождь, и на «авто» он сбрасывался бы без конца. С маски надписи читается только её полоса, а не весь экран. Строка 4 — название загруженного трека (галочка в группе «Надпись»), своя величина, шрифт и интервал; в Lively она не выгружается — там трека нет.
ПОЧЕМУ ПУСТАЯ НАДПИСЬ ТЕПЕРЬ ПУСТАЯ (Lively v0.004)
Если все три строки стёрты, движок подставлял «Zerkalius». Просьба пользователя: пусто — значит
без надписи. «Zerkalius» остался только невидимой меркой: от него считаются размер и место часов,
чтобы они не прыгали. В обоях _lively поведение прежнее.
Просьба пользователя со скриншотами: Zerkalius-code.html должна открываться сразу в том
виде, что на снимках, и уже идущей. При загрузке теперь включены 🛰️ Радар (круги) и 🔳 рамка, свечение
выключено, Delta — «Серпинский», операция — «Оригинал», галочки Аниматрицы, Ёлки, Цилиндра и
диагоналей сняты, и сразу нажимается Play. 35.4 — по второму снимку, где видна нижняя часть панели:
60 мс на шаг при x1, масштаб 19px, экран 350, интервал 0.7, моноширинный шрифт, «🎨 Цвет как код»
включён, пресет Матрица с яркостью фона 0.8. 35.5 — пока идёт Play, кнопка ⏸ плавно мигает раз в
секунду; на паузе и после Стопа мигание снимается. 35.6 — у круглых кнопок справа от панели
включённое состояние обведено кольцом с отступом: 🎯 и 🔳 — жёлтым, 📌 — красным, 🔃 и 🛰️ —
зелёным. Раньше классы «включено» у 🎯, 📌 и 🔃 ставились, но стиля не имели, и понять, что
кнопка нажата, было нельзя. Туда же, под 🛰️, переехали кнопки выравнивания |< >|< >| и
запись ⏺ из правого верхнего угла холста — теперь все кнопки холста в одном столбце, и он ездит
вместе с панелью. И 🔃 реверс теперь включён сразу при открытии. 35.7 — идущая запись ⏺ тоже
обведена красным кольцом и мигает, но цветом (красный ⇄ тёмный), а не прозрачностью: в Дзене
прозрачность этой кнопки прибита намертво, и мигание прозрачностью там бы пропало.
Просьба пользователя: «эти меню сделай вкладками, так же как в Layers, справа слева расположи». Одна длинная панель разобрана на десять разделов. Сверху по центру — полоса вкладок, каждая прячет и показывает свой раздел. Слева: 📂 Файл, 🔊 Звук, 🔎 Поиск, 🔺 Формы, 🧬 Слои и ▶ Плеер (он внизу панели и не прокручивается). Справа, в новой панели: ↕ Движение, Δ Логика, 👁 Вид, 🎨 Цвет. Панель, у которой все разделы спрятаны, исчезает, ⚙ прячет обе, ⇄ меняет их местами. Какие вкладки закрыты, браузер помнит. Последняя вкладка, «❓ Помощь», открывает окно с описанием машины и инструкцией по каждому разделу, кнопкам холста и клавишам.
Хаб v0.008: большая кнопка «Zerkalius» ведёт теперь на Zerkalius-code.html (раньше она была в
лаборатории как «Genezis Code 0»), а прежний флагман Zerkalius-genezis.html встал в лабораторию
под именем «Genezis». Номер версии хаба получил тёмную плашку: на бегущих цифрах обоев его не было видно.
Хаб v0.009 — кнопки переливаются теми же цветами, что цифры обоев (зелёный, жёлтый, фиолетовый, синий).
Каждая начинает со своей случайной фазы, чтобы они не мигали хором; под мышью перелив снимается,
и кнопка загорается обычным зелёным. Хаб v0.010 — имена наоборот, по уточнению пользователя: большая
кнопка (Zerkalius Code) подписана «Genezis», а Zerkalius-genezis.html в лаборатории — «Zerkalius». Хаб v0.011 — окончательно: большая
кнопка подписана «Code», кнопка Zerkalius-genezis.html в лаборатории — «Genezis». Хаб v0.012 — лаборатория выстроена в порядке
создания: XOR Engine (15.06), Genezis и GPU (17.06), Grid Module (05.07), WebGL (06.07), Кубиты (18.07),
Fold цельный (06.08), Fold · v1.115 (21.08), Fold Layers (01.09), ASCII-арт (19.09), Zazerkalius (23.09).
Даты — первое появление файла в git под любым из прежних имён. Хаб v0.013 — в «Знаке и записях» остались
только Борт-журнал и Обои; Октаэдр (20.09) и Обои Lively (23.09) ушли в лабораторию, каждый на своё место по дате. Хаб v0.014 — «Fold цельный» и «Fold · v1.115»
убраны из лаборатории в новую нижнюю панель «🗄 Архив»: это прежние ветви, работа идёт в Layers. Сами страницы
не тронуты и открываются по-прежнему — замороженный Fold опубликован именно в этом виде. Хаб v0.015 — по слову
пользователя «вообще убери»: панель «Архив» снята, а сами страницы ушли с сайта в корневой
archive\_retired\ — Zerkalius-fold.html (цельная v0.7xx) и вся папка fold\
(замороженный Fold v1.115 с переадресацией fold.html). Ничего не удалено: вернуть — перетащить обратно.
Старые ссылки на эти адреса перестанут открываться. Хаб v0.016 — туда же, по той же просьбе, ушёл
Zerkalius-xor-engine.html (XOR Engine, самая первая страница лаборатории, 15.06).
35.9 — РАЗДЕЛЫ ПЕРЕМЕЩАЮТСЯ, КАК МЕНЮ В LAYERS
Просьба: «все вкладки меню также перемещаемыми, как у остальных». У каждого раздела шапка (⠿, название, ✕). За неё раздел тащат: над панелью он встаёт между разделами там, где курсор, в том числе в соседнюю панель; мимо панелей — висит на холсте плавающим окном. Пока тащишь, пустая (спрятанная) панель проступает, чтобы было куда положить. Окно нельзя увести за край — шапка остаётся в пределах экрана, тот же зажим, что в Layers. Раскладка помнится в браузере, ↺ на полосе вкладок её сбрасывает.
35.10 — РАСКЛАДКА ПО УМОЛЧАНИЮ, СВЕТЛЕЕ, ✥
По снимку пользователя: при первом открытии (и после ↺) открыт только ▶ Плеер — плавающим окном внизу по центру холста, остальные разделы спрятаны и достаются вкладками. Панели и окна осветлены (#101010 → #1c1e24, вложенные группы → #23262e). В шапке раздела вместо блёклого ⠿ — голубой ✥, чтобы было видно, что за неё тащат.
35.11 — РАЗДЕЛЫ В ПАНЕЛИ КАРТОЧКАМИ
«Когда вкладки в боковой панели, не видно их границ»: разделы шли одной лентой. Теперь каждый — карточка с рамкой и своим фоном, под мышью рамка загорается голубым.
35.12 — РАМКА ВЫКЛЮЧЕНА, 🔃 И 🛰️ НА ПЛЕЕРЕ
Рамка прицела при открытии теперь выключена. Пока открыт ▶ Плеер, кнопки 🔃 реверс и 🛰️ радар стоят прямо в его строке, а у холста прячутся; закрыли плеер — вернулись в столбец. На плеере — двойники: щелчок жмёт настоящую кнопку, вид копируется с неё, так что состояние у них одно.
35.13 — ↺ ПЕРЕКЛЮЧАЕТ «ВСЕ РАЗДЕЛЫ ⇄ ТОЛЬКО ПЛЕЕР»
Щелчок по ↺ открывает все разделы, следующий — оставляет один плеер; разделы при этом остаются там, куда их перенесли. Сброс раскладки на исходную ушёл на Shift+↺.
35.14 — 🔃 И 🛰️ ПО БОКАМ ПЛЕЕРА
«Не так, их по бокам плеера»: у плавающего плеера 🔃 висит снаружи слева, 🛰️ — снаружи справа, на середине высоты окна. В боковой панели снаружи места нет — там они по краям строки кнопок.
35.15 — над шапкой раздела курсор «перемещение» (четыре стрелки, как значок ✥) вместо «руки», и тот же курсор держится, пока раздел тащат.
35.16 — «СЕТКА» ВСЕГДА НА ВЕСЬ ЭКРАН
Была 150×100 при любом окне, и на большом экране по краям зияла пустота. Теперь размер считается от холста: столбцов — сколько символов входит в ширину, строк — в высоту (под радаром — в диагональ, чтобы кольца дошли до углов), с запасом и чётно, чтобы 1010 при прокрутке по кругу смыкалось без шва. Пока на холсте сетка, она сама перестраивается при смене окна, масштаба, интервала, шрифта и радара; любая другая загрузка снимает этот признак.
35.17 — «СЕТКА» СТАЛА ОТДЕЛЬНЫМ СЛОЕМ
Уточнение пользователя: «сетка — это вообще отдельное построение, она не зависит от количества строк». Кнопка больше не заменяет загруженные строки шахматкой, а включает и выключает слой-фон: 1010 на весь холст позади строк, с тем же шагом, что у символов, и с той же привязкой — сетка лежит ровно под текстом и едет вместе с перетаскиванием. Цвет — фоновый, приглушённый. Строки и «Экран» не трогаются. Слой рисуется в отдельный холст один раз и дальше только копируется, пока не поменялись размер, кегль, шаг или цвет. Замена строк сеткой (35.16) осталась только у сцены типа vacuum.
35.18 — под радаром сетка сворачивается в кольца: те же радиусы, что у строк радара, символы повёрнуты вдоль окружности тем же поворотом, шаг по дуге — ширина символа. На каждом кольце число символов чётное, соседние кольца сдвинуты по чётности — шахматка, свёрнутая в круг.
35.19 — «сетки нет, не видно». Причина: hexToRgb в этой машине отдаёт не объект, а
строку «r, g, b», а слой обращался к rgb.r — выходил цвет rgba(undefined,…),
браузер его отбрасывал и рисовал чёрным по чёрному. Теперь строка подставляется целиком, как в
остальной отрисовке (RENDERER.rgba).
35.20 — «эти не скрывай, когда они на плеере, просто дубли»: 🔃 и 🛰️ у холста больше не прячутся, когда открыт плеер; на плеере — их дубли с общим состоянием.
35.21 — «эти 2 наверху от плеера надо, а не сбоку»: у плавающего плеера дубли 🔃 и 🛰️ висят теперь над окном — 🔃 над левым углом, 🛰️ над правым. Сбоку они торчали за края и расширяли окно почти на сотню пикселей в каждую сторону. В боковой панели всё по-прежнему, по краям строки кнопок.
35.22 — «сетка пропадает при малом масштабе 1». Слой сам себя выключал, если шаг строк меньше 2 px или символ уже 1 px, а на масштабе 1 так и выходит. Да и символ в пиксель всё равно не прочесть. Теперь при символе меньше 5 px сетка рисуется по пикселям: «1» ярко, «0» тускло, та же шахматка и те же кольца под радаром. Клетка при этом не меньше пикселя, иначе шахматка из долей пикселя слилась бы в серую муть или пошла муаром.
35.23 — «по умолчанию все панели включены». При первом открытии и после Shift+↺ открыты все
разделы, а не только ▶ Плеер; сам плеер по-прежнему висит окном внизу по центру. Ключ памяти вкладок
сменён (zcode_tabs_off_v1 → _v2): иначе у всех, кто уже открывал страницу,
браузер помнил бы «только плеер», и новое умолчание до них не дошло бы. Куда перенесены разделы,
браузер помнит по-прежнему, это отдельный ключ.
35.24 — «это не нужно больше»: голубая кнопка ⇄ под ⚙ (поменять левую и правую панели местами)
убрана вместе со своим обработчиком. Разделы и так переносятся мышью в любую панель, а ↺
не тронут: его «все разделы ⇄ только плеер» — другое дело. Правила CSS для panel-right
остались без кнопки. Они ничего не делают, пока этот класс не поставлен.
35.25 — ПРЕСЕТЫ СТАЛИ ЦЕЛЫМИ СЦЕНАМИ
«Поправь все пресеты, в них какая-то жесть творится». Причина: пресет из «📍 Карты Сокровищ» ставил только
свой десяток галочек (эхо, два слоя, 3D, Ёлка, неон, рамка, радар, тема, скорость). Всё остальное оставалось
от того, что было на экране до него: от стартового вида (интервал 0.7, масштаб 19, «Цвет как код», 🔃 реверс)
или от прошлой сцены (Дыхание, Цилиндр, Аниматрица, множитель скорости, алгоритм сдвига, сдвиг холста мышью).
Выходило, что одна и та же сцена выглядит по-разному в зависимости от того, что выбирали перед ней. Теперь
перед встроенным пресетом все эти настройки возвращаются к значениям из самой разметки страницы (defaultValue,
defaultChecked, defaultSelected — отдельного списка чисел нет, чтобы он не разошёлся
с разметкой). 🔃 🎯 📌 выключаются, холст встаёт в центр, и только потом накладывается сцена.
Свои сцены (★) с этой версии запоминают всё то же самое, плюс «Экран» и 🔃. У ★, сохранённых раньше, этого снимка нет, и они ведут себя как прежде: меняют только то, что хранят.
Попутно найдено: список «Логическая операция» (NOT, XOR со сдвигом, зеркало) не работал вовсе. Строки
читают его через UI.logicalOpSelect, а в объекте UI такого поля не было, поэтому
всегда выходил «Оригинал». Поле добавлено, и смена операции теперь пересчитывает строки.
35.26 — «код матрицы не работает»: вместо кода страницы на холсте была каша из 0 и 1. Сцена «0. Код Матрицы»
подавала код через общий путь implantOrReplace, а там при включённом «Вживлении» (галочка во
«🔺 Формах», по умолчанию включена) новый материал не заменяет строки, а вклеивается в середину прежних.
Фрактальные пресеты на время загрузки эту галочку снимали, а этот — нет. Теперь снимает и он.
35.27 — «это удали»: раздел «🔎 Поиск» (логгер узоров: вводишь, например, 11011, и строки, где узор встретился, копятся в поле ниже) убран целиком: вкладка, поле, сама проверка на каждом шаге плеера и строка в ❓ Помощи. Если раздел был в сохранённой раскладке, она его просто пропускает.
35.28 — «это тоже лишнее»: зелёная кнопка ⚙ в левом верхнем углу холста (прятала обе панели разом) убрана
вместе с обработчиком и строкой в Помощи. Панели и так прячутся: каждый раздел закрывается вкладкой или ✕,
а панель без открытых разделов исчезает сама. Правила CSS для menu-off остались, но без кнопки
этот класс никто не ставит.
35.29 — ВЫРАВНИВАНИЕ |< >|< >| В ПРЕСЕТАХ
«Посмотри, как в пресетах отрабатывает». Нашлось три беды. Первая: строки фракталов дополнены пробелами
до полной ширины, и «влево» / «вправо» двигали треугольник целиком, форма не менялась. Теперь эти два режима
равняют строку по её видимому краю: пробелы по краям не считаются, и Серпинский прижимается к краю
прямоугольным треугольником. «По центру» осталось по всей строке, иначе несимметричные фигуры (R110)
искажались бы. Под Цилиндром край не ищется: пробелы там едут по кругу вместе с символами. Вторая: под
🛰️ радаром выравнивания нет вовсе (строки идут кольцами), а кнопки выглядели рабочими. Теперь они там
гаснут. Третья: пресет не трогал выравнивание, и оно тянулось из прошлой сцены. Теперь пресет ставит
«по центру», а ★ запоминает своё. Заодно >|< больше не переносится на две строки: в 34 px
кнопки три знака не влезали.
35.30 — «больше шрифтов, до 13, и Roboto Mono»: к четырём прежним (системный моноширинный, Courier New,
Impact, Comic Sans) добавлены девять: Roboto Mono, JetBrains Mono, Fira Code, IBM Plex Mono, Source Code Pro,
Space Mono, Share Tech Mono, VT323, Press Start 2P. Они берутся с Google Fonts, а не из _fonts\
сайта: страницу открывают и файлом с диска, а с file:// браузер шрифты из соседней папки не
отдаёт. Холст рисует шрифтом, только когда тот уже скачан, поэтому при выборе шрифт сперва догружается
(document.fonts.load), и лишь потом кадр рисуется заново. Без этого первый кадр вышел бы
запасным шрифтом, а в паузе так бы и остался.
35.31 — «название Зеркалиус Код»: в шапке панели, во вкладке браузера и в приветствии консоли теперь
«Zerkalius Code 35.31» вместо «Binary Drum Machine (Pro …)» и «(Zerkalius …)». Имя файла и адрес страницы
не менялись. Прежнее имя живёт в названии репозитория (Binary-Drum-Machine), трогать его незачем.
35.32 — ШРИФТЫ БЕЗ ИНТЕРНЕТА
«Для локальной версии надо подтянуть». В 35.30 девять новых шрифтов шли с Google Fonts, и без сети вместо них
был обычный моноширинный. Теперь они лежат в самом проекте. Восемь уже были в _fonts\ (их туда
клали для ASCII-арта), Roboto Mono докачан из репозитория google/fonts (ofl/robotomono, лицензия OFL).
Подключить .ttf через @font-face было бы проще, но так не работает: страницу
открывают и файлом с диска, а Chrome на file:// не отдаёт странице шрифт из соседней папки
(считает это чужим источником). Обычный <script src> при этом грузится. Поэтому каждый шрифт
переложен в _fonts\js\<имя>.js: внутри base64 и вызов window.__zerkFont, который
собирает FontFace и добавляет его в document.fonts. Скрипт шрифта подгружается,
только когда шрифт выбран (проверка в начале каждого кадра, так что срабатывает и от пресета, и от ★).
Roboto Mono грузится сразу, им написана вся панель. Строки @import с Google Fonts сняты.
Файлы весят 60–350 КБ.
35.33 — «кнопку: передвижение строк не плавное, а построчное, синхронно с сеткой; прыгает по строкам — и обратно». Новая кнопка ▦ внизу столбца кнопок холста, под ⏺. Пока она включена, перетаскивание мышью сдвигает холст целыми клетками: по вертикали на межстрочный шаг, по горизонтали на ширину символа. Строки и «Сетка» отсчитываются от одного центра, поэтому сдвиг, кратный клетке, оставляет строки ровно на местах сетки. При включении, а также при смене масштаба, интервала или шрифта холст сразу встаёт на ближайшую клетку. Ещё щелчок возвращает плавное движение. Кнопка — настройка перетаскивания, а не часть сцены, поэтому пресеты её не трогают.
35.34 — СТРАНИЦА НЕ ЗАПУСКАЛАСЬ: ТЕГ СКРИПТА В КОММЕНТАРИИ
«Пусто»: после 35.32 страница открывалась без вкладок, со пустым списком сцен и чёрным холстом. Не
выполнялся ни один её скрипт. Виноват комментарий 35.32, где открывающий тег скрипта был написан буквами
(<script src>). Сам по себе он безвреден, но выше, в разборе исходника для «Цвета как код»,
в коде есть строка '<!--'. Для HTML-разборщика внутри тега скрипта эта пара означает
«начался вложенный скрипт». После неё закрывающий тег перестаёт закрывать, весь остаток файла уходит в текст
скрипта, и тот не разбирается. Комментарий переписан без тега. Правило: в коде этой страницы не писать
открывающий тег скрипта буквами нигде, даже в комментариях и строках.
35.35 — «эту надпись внизу холста»: строка состояния («Двойной клик по холсту — Режим Дзен», «Сцена загружена: …» и прочие сообщения) переехала из шапки левой панели вниз холста, по центру, на тёмной подложке. Щелчки проходят сквозь неё к холсту. В Дзене она гаснет вместе с кнопками.
35.36 — «текстовый файл пусть прямо на холст можно кидать»: файл, брошенный на холст, грузится так же, как кнопкой «📂 Текст», и с тем же «Вживлением», если оно включено. Пока файл тащат над холстом, по краю идёт зелёный пунктир. Звуковой файл заодно встаёт треком, как «🎵 Трек». Картинку или другой не текст страница не грузит, а пишет внизу «Не текст». Файл, брошенный мимо холста, браузер больше не открывает вместо страницы: иначе промах на пару пикселей уносил всю работу.
35.37 — «добавь межсимвольный, до 0,5»: во «👁 Виде» под «Интервалом» новый ползунок «Межсимв.» от 0.5 до 3, по умолчанию 1. Это доля ширины символа: при 1 символы стоят вплотную, как задумал шрифт, при 0.5 наезжают друг на друга, при 3 стоят втрое реже. Шаг умножается везде, где считается раскладка строки, чтобы ничего не разъехалось: в самих строках, в «Сетке» (и в её кольцах под радаром, и в пиксельной), в подгонке сетки-сцены под экран и в ▦ шаге по сетке. Строки радара этого не касается: там символы и так раскладываются ровно по всей окружности, каждое кольцо на свою длину. Пресет возвращает 1, ★ помнит своё.
35.38 — СКАЧКИ ⇄ ПЛАВНО В ПЛЕЕРЕ
Уточнение пользователя к 35.33: речь была про движение строк при проигрывании, и «эту кнопку в плеер — скачки и плавно». Кнопка ▦ ушла из столбца у холста в строку ▶ Плеера, после ▶▶, и стала переключателем режима. ▦ «Скачки» (так при открытии): строки прыгают на целую строку за шаг, как было всегда, и стоят ровно на строках «Сетки». Перетаскивание холста в этом режиме тоже идёт по клеткам. 〰 «Плавно»: между шагами строки скользят от строки к строке. Сразу после шага они рисуются там, где стояли до него (со сдвигом на столько строк, сколько прошёл шаг, с учётом множителя, алгоритма и 🔃), и к следующему шагу доезжают на место. Под радаром так же скользят кольца. Перетаскивание в этом режиме плавное.
Чтобы скольжение было видно, в плавном режиме кадр рисуется на каждом экранном кадре, а не только на шаге. Не скользят замороженный слой («Заморозить Слой 1»), «Заморозить Y-скролл» (шаг там нулевой) и прыжки длиннее экрана: протащить через весь экран было бы некрасиво, их честнее показать скачком.
35.39 — «текст, вставка файла не работает». Причин три. Первая: загрузка текста шла через тот же путь, что
генератор форм, и при включённом «Вживлении» (по умолчанию включено) файл не заменял строки, а вклеивался в
середину прежних, обрезаясь по их ширине и высоте. На вид ничего не происходило. Та же беда была у «Кода
Матрицы» в 35.26. Теперь любой текст (кнопкой, броском на холст, кодом страницы) всегда заменяет строки, а
«Вживление» остаётся делом генератора форм. Вторая: повторно выбранный тот же файл браузер не считает
изменением, и загрузка молчала. Теперь поле выбора после чтения очищается. Третья: у файлов из Windows в конце
каждой строки оставался невидимый
, теперь он срезается (и метка BOM в начале тоже). После
загрузки внизу холста пишется имя файла и число строк, пустой файл — отдельным сообщением.
35.40 — «панели крайние прозрачные пусть». У левой и правой панели больше нет ни фона, ни рамки, ни тени, и холст виден сквозь промежутки между разделами. Фон остался у самих карточек разделов, иначе кнопки терялись бы на бегущих цифрах. Полоса прокрутки тоже без подложки. Прозрачность только на вид: пустое место панели по-прежнему её, и щелчок по нему до холста не доходит.
35.41 — «защити от выделения все панели». Ползунки, кнопки и холст тянут мышью, а протяжка для браузера — ещё и выделение текста: подписи и значки плеера заливались синим. Запрет стоит на всей странице разом, как в Октаэдре. Поэтому его получают сами собой и панели, и плавающие окна, и круглые кнопки у холста, и разделы, которые появятся потом. Выделять можно только там, где это нужно: в полях ввода и в окне ❓ Помощь, откуда текст копируют.
35.42 — «почему, когда ставлю галку „⚓ Заморозить слой 1“, строки прыгают в центр, а не остаются, где были».
Ошибка была в отрисовке: замороженный слой всегда показывал строки от нулевой (в коде стоял 0 вместо текущего
номера), поэтому картинка перескакивала к началу текста, и оно вставало в центр экрана. Теперь в момент
постановки галки запоминается текущая строка (frozenIndex), и слой стоит ровно на ней. Когда галку
снимаешь, слой идёт дальше с того же места, а не с того, куда за это время убежал счётчик кадров, так что скачка
нет и в эту сторону. ■ Стоп и загрузка сцены сбрасывают запомненное место.
35.43 — «нужен подсчёт циклов Аниматрицы». Под галкой «Аниматрица» появилась строка: сколько раз волна прошла текст сверху донизу и на какой строке она сейчас. Кроме числа проходов ищется и настоящий цикл. После каждого прохода берётся отпечаток всего текста (хеш FNV-1a по всем строкам) и запоминается вместе с номером прохода. Отпечаток исходного текста — проход 0, поэтому ловится и возврат к самому началу. Как только отпечаток повторится, текст вернулся в состояние, где уже был, и дальше картина ходит по кругу. Тогда пишется «🔁 Цикл: период N» и после какого прохода начался повтор. При загрузке нового текста или сцены счёт начинается заново. Правки текста другими средствами («Вставить 0/1» и т. п.) счёт не сбрасывают, и найденный после них цикл может быть ложным.
35.44 — две просьбы. «Сохранил текущую, а как потом включить — пропала кнопка загрузки». Отдельной кнопки
не было никогда: сцена включалась выбором в списке. Только что сохранённая ★ сразу стоит в нём выбранной, а
выбрать уже выбранное браузер не считает изменением (нет события change), поэтому включить её заново
было нечем. Рядом со списком появилась кнопка ▶: включает выбранную сцену, в том числе ту, что уже
стоит. В помощи дописано, что ★ хранит только настройки, а текст холста в неё не входит. «F5 не должен
сбрасывать, начинать с того же; стартовый вид — только когда кеша ещё нет». Раньше при каждом открытии ставился
стартовый вид (радар, масштаб 19, экран 350, 60 мс, цвет как код…) и затирал всё, что настроили. Теперь при уходе
со страницы (pagehide, beforeunload и скрытие вкладки) состояние целиком ложится в память
браузера. Туда входят текст холста, вид и галочки (тот же снимок, что у ★), скорость, цвета, радар, рамка, выбранная
сцена, кадр плеера и играл ли он. При открытии всё это возвращается. Стартовый вид ставится только при первом заходе,
пока запомненного нет. Если текст не влез в память (очень большой файл), состояние пишется без него, а текст берётся
как раньше.
35.45 — «надо и текст, и сохранять всё вместе, как пресеты». ★-сцена стала полным пресетом. «💾 Сохр.» у списка
кладёт в неё тот же полный снимок, что запоминается для F5 (поле full): текст холста, вид и галочки,
скорость, цвета, радар, рамку и кадр. Выбор ★ в списке или ▶ ставит снимок целиком. Для F5 и для сцены работает
один и тот же код (SESSION.apply), поэтому они не разойдутся. Память браузера у страницы около 5 МБ
на всё, и несколько сцен с большими текстами могут её заполнить. Тогда сцена сохраняется без текста, и об этом
прямо говорит окно, а не молчание. ★, сохранённые до 35.45, помнят только настройки и включаются как раньше.
35.46 — «надо и в файл сохранять, чтобы потом на другой компьютер». Сцены живут в памяти браузера, а она у
каждого компьютера своя. Под списком сцен появились «📤 Сцены в файл» и «📥 Из файла». 📤 выгружает все ★ разом
одним файлом Zerkalius-сцены-ДАТА.json, целиком, с текстами. 📥 добавляет их в список. Свои сцены при
этом не затираются, а сцена, которая уже есть точь-в-точь, второй раз не добавляется. Такой файл можно и просто
бросить на холст: по метке zerkaliusScenes он узнаётся и уходит в список сцен, а не на холст текстом.
Любой другой .json грузится текстом, как раньше.
35.47 — «счётчик Аниматрицы показывать внизу, пусть там все уведомления». Строка счётчика ушла из раздела Логики вниз холста и стоит над строкой состояния, тем же видом и своим цветом, одной строкой: «Аниматрица: пройдено циклов N · волна на строке r из H · повтора пока нет» или «· 🔁 цикл: период P». Свою строку ей дали нарочно. Строка состояния — для разовых сообщений (сцена сохранена, файл загружен), а счётчик меняется на каждом шаге и затирал бы их раньше, чем их успеешь прочесть. Видна, пока Аниматрица включена, в Дзене гаснет вместе со строкой состояния.
35.48 — по скриншоту с открытой боковой панелью Chrome, когда окно стало у́же. Полоса вкладок переносилась: «❓ Помощь» уезжала на вторую строку. Теперь полоса всегда в одну строку: вкладки сжимаются, длинные подписи обрезаются многоточием, полное имя видно во всплывающей подсказке. Место под полосу — всё, что между двумя панелями (было «экран минус 720 px», стало минус 624). Плеер вылезал за правый край: плавающее окно держалось на экране только краем в 60 px, и после сужения окна браузера оставалось обрезанным. Теперь окно при сужении и при открытии страницы возвращается на экран целиком. У плеера сверху оставлен зазор под его дубли 🔃 🛰️, а окно шире экрана прижимается к левому краю. Заодно, при просмотре в Chrome (разовое исключение по слову пользователя): после F5 счётчик Аниматрицы не показывался, пока плеер стоит. Галку ставил снимок, без события, и строка появлялась только с первым шагом волны. Теперь она обновляется сразу после восстановления и после загрузки сцены.
35.49 — «как смотреть это кино будем?» → «журнал в файл». Видео тут плохой свидетель: на масштабе в 4–5 px
мелкий текст волны не разглядеть, а журнал точен до символа. Под галкой «Аниматрица» появились «⏺ Журнал» и
«💾 Журнал в файл». ⏺ записывает весь текст в момент старта, затем после каждого прохода волны и при загрузке
нового текста. Заголовок записи: что это (старт, проход N, новый текст), отпечаток текста (тот же FNV-1a, по
которому ищется цикл), число непробельных символов, сколько символов изменилось с прошлой записи, найденный цикл.
В шапке файла — время, число строк, ширина, сцена и само правило волны словами, чтобы файл читался без страницы.
Полный текст пишется, пока журнал меньше 40 МБ, дальше только заголовки. Иначе большой текст за долгую запись
раздул бы файл на сотни мегабайт. 💾 отдаёт Zerkalius-аниматрица-ДАТА-ВРЕМЯ.txt в любой момент, можно
и во время записи. Пока идёт запись, кнопка красная и показывает число записей, а внизу холста стоит «⏺ журнал».
35.50 — «как вручную, не ловя момент, прокрутить треугольник в начало». ■ Стоп ставит кадр 0, и первая строка встаёт в центр экрана, а над ней виден хвост текста: экран показывает строки по кругу. Попасть ползунком «Кадр» точно в половину «Экрана» мышью трудно. В Плеере рядом с ■ появилась кнопка ⤒, то же делает клавиша Home: пауза, и первая строка текста стоит у верхнего края экрана. Окно строк бывает выше холста, тогда его верх уходит за край. Поэтому строка ставится к первой видимой строке, а не к краю окна, по той же формуле, по которой строки ставит отрисовка. Home в полях ввода остаётся полю.
35.51 — «как переключать сразу циклы?». Цикл здесь — проход волны, тот, что считает «пройдено циклов». Под журналом Аниматрицы появились ⏮ Цикл и ⏭ Цикл, клавиши PageUp и PageDown, и галка «Плеер — целыми циклами». ⏭ сразу гонит волну до конца текущего цикла. Шаги внутри идут без пересчёта строк, пересчёт один раз в конце, иначе это 255 пересчётов всего текста подряд. С галкой ▶ делает целый цикл на каждом шаге. ⏮ возвращает текст: посреди цикла к его началу, с границы к предыдущему. Для этого после каждого цикла текст кладётся в историю, исходный текст — как цикл 0. Всего хранится не больше 30 МБ, старые циклы уходят. При возврате из поиска повтора стираются отпечатки циклов «из будущего»: пройденные заново, они совпали бы сами с собой и дали бы ложный цикл. Галка «Плеер — целыми циклами» запоминается в сцене и после F5.
35.52 — «после F5 показывает 0 циклов, но это не так». Снимок для F5 (35.44) помнил текст и все настройки, а счёт Аниматрицы в него не входил. Текст возвращался уже прокрученным, а загрузка текста обнуляла счёт. Теперь в снимок входят число пройденных циклов, строка волны, найденный повтор и отпечатки прошлых циклов, без которых повтор с циклом до F5 не нашёлся бы. Всё это ставится обратно уже после загрузки текста. То же получают и ★-сцены, они снимают тот же снимок. Историю для ⏮ не храним, она занимает много: назад можно вернуться только до того места, где открыли страницу.
35.53 — «это отдельными гифками собирать бы прямо в коде». После журнала сцены «1» (цикл 128 с 65-го прохода, досчитан в Python и подтверждён самой страницей на 667-м проходе) картинки цикла собирались вне страницы. Теперь у Аниматрицы есть выбор шага (каждый 1-й, 2-й, 4-й, 8-й, 16-й, 64-й проход) и 🎞 GIF. Волна гонится на копии текста тем же правилом, так что холст, счёт и журнал не трогаются. Если волна посреди цикла, копия сперва доходит до его конца. Кадры идут, пока картина не вернётся к первому кадру (круг замкнулся), но не больше 256. Шаг 1 показывает весь цикл и «густо–редко», 8 — родственников через 8, 64 — вложенный треугольник. Кодировщик GIF свой, без библиотек, чтобы страница работала с диска без интернета: палитра на 4 цвета и сжатие LZW по стандарту GIF89a, рост размера кода — как у проверенного omggif. В словарь добавлены «Префиксный XOR», «Теорема Лукаса» и «Период — степень двойки».
35.54 — «ромбическая сетка». Пользователь увидел, что треугольник сцены «1» сложен из ромбов-«кадров», идущих цепочками по диагоналям. Замер на проходе 155 (он же 667-й): при сдвиге по диагонали на (16 строк, ±16 символов) совпадает 89,5% клеток, на 32 — 90%, на 8 и 24 — около 70%, а мимо на один символ — 59%, это уровень случайности. Две причины, обе — степени двойки. Правило 90 ведёт узор ровно на символ за строку, отсюда диагонали под 45°. Треугольник Серпинского сложен из своих копий, сдвинутых по диагонали, отсюда повтор на 16 и 32. В «👁 Виде» появилась ◇ Ромбическая сетка с шагом 8, 16, 32 или 64. Это два семейства прямых через вершину текста (середину первой строки): «столбец − строка» и «столбец + строка» кратны шагу. Сетка рисуется по символам, с учётом выравнивания, только внутри конуса от вершины и рвётся на стыке строк по кругу. Ромб выходит высотой в шаг, соседние сдвинуты на полшага, поэтому решётке сдвигов (16, ±16) соответствует шаг 32. Он и стоит по умолчанию, совпадая с ромбами, которые пользователь обвёл сам. Вне страницы все 21 целый ромб прохода 155 вырезаны и сравнены: с верхним совпадает 83–97%, ромбы на средней вертикали — 97%. Из 545 клеток ромба 64 заняты во всех ромбах сразу, 276 пусты во всех, 205 меняются от ромба к ромбу.
35.55 — «подсвечивать полосы». Дальнейший разбор сцены «1» по всем 128 проходам цикла показал: у каждой строки свой период волны, ближайшая степень двойки больше её номера. Строка 0 стоит, строка 1 повторяется через 2 прохода, строки 2–3 через 4, 4–7 через 8, и так до 64–127 через 128. Это теорема Лукаса по одной строке: строке r нужны только строки выше. Общий период 128 — это период нижней полосы, а треугольник работает как часовой механизм, где каждая полоса вдвое медленнее верхней. Отсюда же: верхний ромб (строки 0–32) повторяется через 64 прохода, в нём 64 разных кадра. Всех ромбов за цикл 2688, разных 1541. Вдоль боковых сторон треугольника чередуются всего два кадра-близнеца, всё разнообразие внутри. В «👁 Виде» появилась галка ▤ Полосы периодов: строки тонируются полосами по степеням двойки, у правого края подпись «строки 16–31 · период 32». Полосы считаются от первой строки текста, рисуются фоном под символами, под радаром не рисуются.
ИССЛЕДОВАНИЕ 2026-09-24: ЦИКЛ АНИМАТРИЦЫ НА СЦЕНЕ «1» — ЧТО НАЙДЕНО
Откуда числа. Журнал Аниматрицы (35.49) со сцены «1» дал один кадр: текст 128 строк × 257 символов из
«1», «0» и пробелов, проход 15, волна на строке 76. Правило волны детерминированное, поэтому дальше всё досчитано
вне страницы (Python, то же правило, что в runAnimatrixGlobal) по всем проходам. Главный вывод
подтвердила сама страница на 667-м проходе: «🔁 цикл: период 128, повтор после 65-го прохода».
1. Разгон и цикл. Нули, которых было 976, гаснут друг о друга и к 65-му проходу вымирают полностью. Дальше идёт чистый цикл: проход 193 равен проходу 65 символ в символ, период 128. Если в том же тексте заменить нули единицами, цикл 128 начинается сразу, без разгона.
2. Почему 128. Без нулей волна — это префиксный XOR: строка i становится XOR всех строк над ней и её самой. Через k проходов строка i собирается из строк выше с коэффициентами C(i−j+k−1, k−1) по модулю 2 (теорема Лукаса). Через 2m проходов, если 2m ≥ числа строк, остаётся только сама строка. Период — ближайшая степень двойки не меньше числа строк: 128 → 128, 100 → 128, 200 → 256.
3. Любой кадр — XOR сдвинутых копий. Состояние через k проходов после 65-го равно XOR копий 65-го, сдвинутых
вниз на все d, у которых нет общих двоичных единиц с k−1 (d & (k−1) = 0). Пример: проход 155
(= 667-й), k = 90, k−1 = 1011001, сдвиги 0, 2, 4, 6, 32, 34, 36, 38. Проверено на всём тексте, совпадает
символ в символ. Отсюда и закономерности внутри цикла:
«густо–редко» через проход (на чётных единиц почти вдвое меньше: 65 — 4168, 66 — 2096), «родственники» через 8,
вложенный треугольник через 64.
4. У каждой строки свой период — степень двойки. Строка 0 стоит, строка 1 повторяется через 2 прохода, строки 2–3 через 4, 4–7 через 8, 8–15 через 16, 16–31 через 32, 32–63 через 64, 64–127 через 128. Период строки — ближайшая степень двойки больше её номера, и это Лукас по одной строке: строке r нужны только строки выше. Проверено по всем 128 проходам. Треугольник работает как часовой механизм: каждая полоса вдвое медленнее верхней, общий период — период нижней полосы. Показывает «▤ Полосы периодов» (35.55).
5. Ромбы-«кадры». Картинка почти повторяется при сдвиге по диагонали: на (16 строк, ±16 символов) совпадает 89,5% клеток, на 32 — 90%, на 8 и 24 — около 70%, мимо на один символ — 59%, это уровень случайности. Ромбы 32 строки высотой, соседние сдвинуты на 16. Показывает «◇ Ромбическая сетка» с шагом 32 (35.54). Причин две, обе — степени двойки: Правило 90 ведёт узор ровно на символ за строку (диагонали под 45°), а треугольник Серпинского сложен из своих копий, сдвинутых по диагонали.
6. Размер ромбов — нули в k−1. Каждый нулевой разряд 2j в k−1 добавляет копию со сдвигом 2j
и включает ромбы этого размера. Проход 977 (k = 16, k−1 = 0001111): три размера сразу — 16, 32, 64.
Проход 129 (k = 64, 0111111): только 64, две большие половины. Проход 155 (1011001): 32,
плюс утолщение линий от разрядов 2 и 4. Проход 192 (1111110): крупных нет, только утолщения.
7. Проход 155 изнутри. 21 целый ромб. С верхним совпадает 83–97%, ромбы на средней вертикали — 97%. Из 545 клеток ромба в этом проходе 64 заняты во всех ромбах, 276 пусты во всех, 205 разнятся. За весь цикл общего каркаса нет: меняется каждая клетка.
8. Словарь кадров цикла. Всего ромбов 2688 (21 место × 128 проходов), разных 1541. 1206 встречаются один раз, 130 — по 4, 128 — по 6, два почти пустых (по 6 единиц) — по 20 раз. Верхний ромб (строки 0–32) повторяется через 64 прохода, у него 64 разных кадра.
9. Близнецы. Зеркало: каждый ромб либо симметричен сам (303), либо имеет зеркального близнеца (1238), всегда в том же проходе на зеркальном месте. Вся анимация в каждом кадре симметрична слева направо, новая информация только в половине треугольника. Точные близнецы: то же место через 64 прохода (320 пар, полосы с периодом ≤ 64); тот же проход, на 32 строки ниже по боковой стороне (по 128 пар в каждую сторону; вдоль краёв чередуются всего два кадра); на 64 строки ниже (по 64). Почти близнецы: многие пары отличаются на 1 или 3 клетки, и отличия всегда только на краю ромба, в вершинах, а внутри копия точь-в-точь. Граница принадлежит следующей, более медленной полосе. Пример: верхний ромб на проходах 65 и 97 отличается одной нижней вершиной (строки 0–31 с периодом 32 уже повторились, а строка 32 с периодом 64 — ещё нет). Самая большая семья почти одинаковых (58) — пустые ромбы внизу по центру, та самая тёмная «дыра».
Что здесь классика, а что своё. Классика: Лукас (1878), Глейшер (1899), Серпинский (1915), Вольфрам с соавторами (1983–84, Правило 90 и линейные автоматы). Своё у Zerkalius: три символа и правило «два разных → верхний». Из-за него волна нелинейна, и появляется разгон с вымиранием нулей. В литературе такого варианта не встречалось, но утверждать, что его никто не изучал, нельзя.
Code 35.56 · хаб v0.027 · страница «Исследование» v0.001 — «сетку авто, ось симметрии, картинки — в папку сайта и
в индекс». В ромбической сетке появился шаг «авто — по проходу». Он берёт k — число проходов от начала найденного
цикла, а пока цикла нет, от начала текста — и рисует все размеры ромбов, для которых в k−1 стоит ноль, каждый своим
цветом (8 голубой, 16 зелёный, 32 жёлтый, 64 красный). Справа сверху легенда: k, k−1 в двоичной записи и
включённые размеры. Новая галка ⫼ Ось симметрии рисует вертикаль через вершину текста, а над ней живой процент:
доля непустых пар символов, одинаковых слева и справа от оси, по видимым строкам. На цикле Аниматрицы он должен
показывать 100%. Картинки исследования переехали из временной папки в issledovanie\ на сайте. Там же страница
Zerkalius-issledovanie.html: все девять пунктов с картинками. В хабе, в «Знаке и записях», рядом с
Борт-журналом и Обоями появилась кнопка Research / Исследование. hub-link.js знает новую подпапку,
иначе значок ⌂ вёл бы не туда.
Исследование v0.002 — «что у тебя за квадраты?» На листе из 128 кадров проступали белые квадраты-блоки, которых
в самой картинке нет. У картинок стояло image-rendering: pixelated, то есть без сглаживания. Оно хорошо, когда
мелкую картинку увеличивают, а лист шириной 2128 пикселей браузер ужимает до ширины страницы и без сглаживания
выбрасывает целые ряды пикселей: тонкие линии слипаются в блоки (муар). Сглаживание вернули, на странице картинки
только ужимаются.
Исследование v0.003 — «всё равно чётные темнее». Так и есть, и это не показ, а сама картина. На чётных проходах единиц ровно вдвое меньше: в среднем 2562 против 5075. А главное, в чётных проходах ни одна единица ни разу не стоит прямо над другой: пар «единица над единицей» 0 по всему циклу, в нечётных в среднем 3751. Нечётный кадр состоит из вертикальных штрихов, у 90% единиц над ними тоже единица. Следующий проход складывает строку с соседней сверху, и штрих гасится до точек. Кадры чередуются так: штрихи — точки — штрихи.
Исследование v0.004 — «можно её в нормальном размере, не уменьшенную, видеть?» Щелчок по любой картинке открывает её поверх страницы в полный размер 1:1, с прокруткой, а кнопки ×2 и ×4 увеличивают её. При увеличении сглаживание выключено, там оно и нужно: каждый символ виден чётким квадратом. Закрывается по Esc, ✕ или щелчку по фону.
Исследование v0.005 — «прогони следующий треугольник, 100 или 200». Нули в сцене «1» — от генератора: «Правило 90» пишет внутри треугольника «0» там, где клетка пустая, а «Обрезать фон» гасит в пробелы только то, что снаружи. Ширина — 2·строк+1, у 128 строк это 257, как в журнале. Тем же способом построены треугольники на 50, 64, 100, 128, 200 и 256 строк (сид «1») и прогнаны с нулевого прохода. Период везде по прогнозу: 64, 64, 128, 128, 256, 256, то есть 100 → 128 и 200 → 256. 128 строк дали «цикл 128 с 65-го», как показала страница, значит, расчёт совпадает с Code. Новый закон: разгон — ровно половина периода плюс один проход. Нули вымирают и цикл начинается на проходах 33, 33, 65, 65, 129, 129. Почему ровно половина, пока не доказано.
Исследование v0.006 — «дальше». Сделано 17 прогонов: правила 90, 150, 30, 110 и 18, сиды 1, 11, 101, 1101 и 10011, 64 и 100 строк, с обрезкой фона и без. Период всегда P, ближайшая степень двойки не меньше числа строк, в том числе там, где нули не вымирают. Поправка к v0.005: «разгон = половина периода + 1» — не общий закон, а свойство треугольника Серпинского (правило 90 или 18 из одной точки, с обрезкой). У правила 150 разгон 40 и 80 (5/8 P), у правила 30 — 10 и 11, у 110 — 8, у сида 11 — 18. Без обрезки фона разгон ровно P/2. При сидах 101, 1101, 10011 и без обрезки нули не вымирают совсем и живут внутри цикла.
Исследование v0.007 — «правило 150 с картинками». На странице лист и GIF правила 150 на 100 строк. Исходный треугольник почти весь из нулей: 7348 против 2652 единиц. За 10 проходов нулей остаётся 502, к 40-му — 16, а дальше несколько одиночек держатся до 80-го и тянут разгон до 5/8 периода. С 80-го идёт чистый цикл 128 (проход 208 = проход 80). У цикла свой рисунок: сквозные вертикальные «стволы» и треугольники по бокам.
Исследование v0.008 — «правило 30». Лист и GIF правила 30 на 100 строк. Правило 30 хаотическое: в исходном треугольнике нулей и единиц почти поровну (4804 и 5196). Нули гибнут быстро, к 11-му проходу их нет, это весь разгон. Цикл на вид шумовой, без треугольников Серпинского, но строгий: период ровно 128, проход 139 равен проходу 11 символ в символ. Левый край держит правильные косые полосы, правый — хаос.
Исследование v0.009 — «правило 110». Из одной точки правило 110 растёт только влево, и треугольник выходит половинкой с вертикальным правым краем. Разгон самый короткий из всех, 8 проходов: 2174 нуля в начале, ни одного к 8-му. Дальше цикл ровно 128, проход 136 равен проходу 8. Форма треугольника на период не влияет, его задаёт только число строк. Зеркальной симметрии у половинки нет, так что ось симметрии в Code здесь ничего не покажет.
Исследование v0.010 — «каждый ромб как 1 или 0: у близнецов одинаковый, у симметричного — по соседу через ось». Обоим условиям отвечает чётность ромба, XOR всех его клеток. У зеркальных близнецов единиц поровну, значит бит одинаков. В симметричном ромбе пары через ось гасят друг друга, и бит зависит только от клеток на оси. Из ромбов выходит новый треугольник: при ромбах в 32 строки 21 бит, в 16 строк 105 бит, в 8 строк 465 бит. Он всегда симметричен, и у него свой цикл, тоже ровно 128. При ромбах 16 и 8 все 128 кадров разные, при ромбах 32 разных всего 40. На странице мозаики прохода 155 и GIF цикла.
Исследование v0.011 — «ромбы из ромбов». Треугольник из ромбов-битов лежит в той же геометрии, что и исходный, поэтому
свёртку можно повторять. Лестница с ромбами высотой 4: 128 строк → 62 → 29 → 13 → 5 → 1. Каждая ступень всегда
симметрична и держит период исходной картины, 128, хотя по своему размеру имела бы 64, 32, 16, 8: ступени помнят часы
оригинала. Сама ступень волне не подчиняется: проход волны по ступени не даёт ступень ни одного следующего прохода, так что
свёртка и волна не перестановочны. Верхний бит (весь треугольник в одной клетке) внутри цикла повторяется ровно через 12
проходов блоком 000111101111, но 128 на 12 не делится, и на стыке циклов ритм сбивается. Ритм с тройкой в
картине из степеней двойки неожиданен, пока это наблюдение.
Code 35.57 — «разбитые сеткой ромбы собирать в кино» и «общую картинку со всеми ромбами». Под осью симметрии в «👁 Виде» появились кнопка 🎞 Ромбы в кино и выбор режима. Ромбы те же, что режет ромбическая сетка: вершина решётки в середине первой строки, высота ромба равна шагу сетки (при «авто» — 32). Ромбы кадра подряд — GIF из всех целых ромбов текущего текста, сверху вниз и слева направо. Верхний ромб по проходам — GIF одного ромба: волна гонится на копии, кадр после каждого прохода, пока ромб не вернётся к себе (у сцены «1» через 64) или не наберётся 256 кадров. Все ромбы одной картинкой — PNG: ромбы стоят на своих местах в треугольнике, но раздвинуты с зазорами, как разобранная мозаика. Цвета: пусто внутри ромба — тёмно-серое, «0» — синее, остальное — светлое. Для этого GIF-кодировщик научился палитре на 8 цветов (раньше 4).
Исследование v0.012 — «отзеркалить нижний через центр в верхний и там XOR». На экране строки идут по кругу: снизу треугольник (начало текста), сверху трапеция (конец), касаются в центре. Нижний треугольник отражён вверх (строка i ложится на 127−i) и сложен XOR с верхней половиной. Меняется только середина трапеции. На проходе 128 выходит знак Зеркалиуса: середина трапеции там пуста, трапеция распалась на два треугольника, и отражение ложится в пустоту точным зеркалом, получаются песочные часы вершинами через центр. На проходе 155 верх и отражённый низ совпадают на 49% (уровень случайности), и XOR даёт кашу. После операции волна снова циклична с периодом 128, без разгона.
Исследование v0.013 — «верхние два треугольника по краям отзеркалить вниз, в противоположные стороны, в пустоты». Отражение через центральную точку, поворот на 180°: верхний левый угол ложится в пустоту справа от нижнего треугольника, верхний правый — слева, дальше XOR с нижней половиной. Отдельно сделан вариант «оба сразу»: каждая половина XOR отражённая другая. На проходе 128 боковые треугольники ложатся в пустоты точными копиями, и получаются два целых больших ромба высотой 64. «Оба сразу» превращает картину в решётку больших ромбов с крестом через центр, то есть в ромбическую сетку в масштабе 64, собранную из одного кадра. На проходе 155 контур становится шестиугольником. «Оба сразу» всегда симметричен сверху вниз и удваивает единицы. После любой операции волна циклична с периодом 128.
Code 35.58 · исследование v0.014 — «добавь это в Code кнопкой». В «Δ Логике» под Аниматрицей появились выбор «низ → вверх», «верх → вниз, в противостороны», «оба сразу», кнопка ⧖ Зеркало и ↶. Отражение через центр экрана — поворот на 180°: строка i ↔ n−1−i, столбец k ↔ W−1−k. XOR идёт по правилу волны: одинаковые → пробел, символ и пробел → символ, два разных → символ из отражения. «Оба сразу» берёт обе половины от исходного текста. При нечётном числе строк средняя строка — сама себе отражение, её не трогаем, иначе XOR стёр бы её. Операция меняет сам текст, поэтому ↶ хранит прежний, а счёт циклов Аниматрицы начинается заново. Подмечено при разборе: если брать верх уже после XOR с низом, низ становится просто отражённым верхом, это «обмен через три XOR». На страницу добавлен крупный шестиугольник прохода 155.
Исследование v0.015 — «продолжишь?» про ритм 12 верхнего бита. Верхний бит собирается из кадра одними XOR, поэтому он — чётность единиц кадра на фиксированном «следе» из 3613 клеток. След найден обратным ходом свёртки и сверен на всех 128 проходах. Приложенный к копиям начального кадра со сдвигом на d строк, след выделяет набор D = {d : d mod 12 ∈ {2, 4, 9, 11}}, периодичный с шагом 12. Верхний бит на проходе k — это чётность числа d из D с d & (k−1) = 0, совпадает на всех 128. По модулю 2 период 12 раскладывается в (1+x)⁴·(1+x+x²)⁴: множитель (1+x)⁴ даёт ритм 4, множитель 1+x+x² — ритм 3, вместе 12. Строк 128, ряд обрывается, отсюда сбой на стыке. Ритм — свойство лестницы из ромбов высотой 4, а не волны: при высоте 2 он 68, при 8 — 96, при 6 его нет. Почему D вышел периодичен именно с шагом 12, пока открыто.
Исследование v0.016 — «продолжай» про ритм 12. Шаг 12 сидит в самом следе лестницы: его центральный столбец — это
111101111000, повторённый через 12. Ритм складывается по ступеням. После первой ступени столбец повторяется
через 4, на второй и третьей ритм смешанный, с четвёртой становится ровно 12: четвёрка первой свёртки, умноженная на
тройку, набегающую дальше. Тройку даёт форма ромба: одномерная модель (только строки, окно 5 с шагом 2) даёт шаг 5, а не 12.
Волна этот след только «читает»: чистый набор D с шагом 12 получается лишь при отсчёте от 65-го прохода, а от шума, от
одной точки и от других кадров — нет. Вопрос закрыт, дальше — комбинаторика лестницы, к волне она не относится.
Исследование v0.017 — «почти надпись». Пользователь увидел в треугольнике с ромбической сеткой строчку текста; проверили буквально: ромб — буква, одинаковые ромбы — одна буква, зеркальный — та же строчной. На проходе 155 из 105 ромбов высотой 16 выходит 47 разных, с точностью до зеркала 26 букв, а без самого края ромба — 15. Каждая строка — зеркальный палиндром, горизонтальных слов длиннее 4 букв нет. Слова идут вдоль сторон: ряд ромбов, параллельный боковой стороне, на расстоянии e от края после короткого заголовка повторяет одно слово длиной в ближайшую степень двойки больше e+1 (край — «аб», дальше «девз», «гжиЛ»), начиная не позже уровня 2e+1. Проверено на всех 128 проходах и на ромбах 8 и 4 строки. Это закон периодов строк, повёрнутый на сторону. Картинки: кадр с буквами в ромбах и лист алфавита.
Code 35.59 — «да» на буквы в Code. В «Виде» под ромбической сеткой появился флажок «🔤 Буквы в ромбах». Каждый ромб сетки (высота — шаг сетки, при «авто» — 16) подписан буквой прямо на холсте: одинаковые ромбы — одна буква, зеркальный — та же строчной. Буквы раздаются по частоте, при равенстве — по первому появлению сверху вниз и слева направо, поэтому на проходе 155 выходит ровно лист алфавита со страницы «Исследование»: это сверено прогоном того же кода в node. Цвет буквы — ряд вдоль боковой стороны, чтобы слова «аб», «девз», «гжиЛ» были видны глазом. Справа сверху — сколько ромбов, разных и букв. Буквы считаются по всему тексту, но только когда текст сменился. Флажок входит в сцены и сбрасывается вместе с видом. При проверке поймался ложный сбой: тестовый файл был с переводами строк Windows, и «\r» в конце строки сдвигал вершину. На странице строк с «\r» не бывает, в коде это не ошибка.
Code 35.60 — «задавать цвет 0 и 1 для сетки». В «🎨 Цвете» под Активом и Фоном появилась строка «0 / 1»: флажок и два цвета. Флажок включает их на холсте: «0» и «1» красятся своими цветами, а яркость остаётся от Δ — изменившиеся символы с прозрачностью Актива, прочие с прозрачностью Фона, чтобы подсветка изменений не пропала. Синтаксис, крипто и мутация главнее, красное «точное совпадение» радуги тоже. Эти же два цвета теперь всегда берут 🎞 GIF, 🎞 Ромбы в кино и лист ромбов — раньше там были зашиты синий «0» и светлый «1», они же стоят по умолчанию. Флажок и цвета входят в сцены и в сброс вида. Заметка для чтения картинок: на сцене «1» в цикле нулей нет вовсе, так что синие и белые символы там — это Фон и Актив пресета «Зеркалиус» (Фон синий, Актив светлый, разница — Δ), а не «0» и «1».
Code 35.61 — «вообще Сетку имел в виду». Просьба была про слой «Сетка» (кнопка в «Файле», шахматка 1010 за строками), а 35.60 сделала цвета «0» и «1» для самого текста — это остаётся, но просили другое. Теперь в «🎨 Цвете» есть строка «Сетка 0 / 1»: флажок и два цвета. Без флажка сетка, как прежде, рисуется одним цветом Фона; выбор любого из двух цветов сам ставит флажок, чтобы не искать, почему цвет не применился. Работает во всех трёх видах сетки: символами, пикселями на мелком масштабе и кольцами под радаром. В пиксельном виде раньше «0» отличался от «1» только тусклостью (30%); при своих цветах «0» не притушен — их различает цвет. Прозрачность по-прежнему от Фона. Сетка кэшируется отдельным холстом, в ключ кэша вошли оба цвета, так что смена цвета перерисовывает её сразу.
Code 35.62 — «нужна разреженность сетки +1 — через символ пробел». В «🎨 Цвете» под цветами сетки — поле «Сетка: пробелы» (0…16): сколько пробелов между символами слоя «Сетка» в строке. 0 — сплошная 1010, как было; 1 — «1 0 1 0» через пробел; 2 — через два. Оставшиеся символы по-прежнему чередуются 1 и 0, а соседние строки сдвинуты — выходит та же шахматка, только редкая (1 0 1 0 над 0 1 0 1), а не полосы из одних единиц и одних нулей: иначе цвета «0» и «1» из 35.61 потеряли бы смысл. Столбцы считаются от центра холста, так что редкая сетка едет вместе с перетаскиванием и не «дрожит». Сделано во всех трёх видах: символами, пикселями (пробел — прозрачная клетка) и кольцами под радаром — там число мест на кольце теперь кратно 2·шаг, чтобы на стыке не было шва. Поле входит в сцены и в сброс вида.
Code 35.63 — «клик на заголовок — перезагрузка». Заголовок «Zerkalius Code NN.NN» в левой панели теперь кнопка: щелчок
перезагружает страницу, как F5. Ничего не теряется: снимок SESSION (текст, вид, счёт Аниматрицы) пишется сам при уходе со
страницы. У заголовка появились id="appTitle", курсор-рука и подсказка; маркер версии в правилах (CLAUDE.md) поправлен —
теперь это <h3 id="appTitle" …>Zerkalius Code NN.NN</h3>, а не голый <h3>.
Code 35.64 — «фигура в пустотах своих почему-то задаёт фон». Причина не в сетке: пустоты фигуры — это настоящие «0» текста. Генератор фрактала пишет «0» во все пустые клетки внутри треугольника, а «Обрезать фон» режет нули только снаружи, до первой и после последней «1» строки. Эти «0» рисуются тускло, цветом Фона, и ложились прямо на символы слоя «Сетка» — два слоя сливались в штриховку, и пустоты выглядели как свой, другой фон. Теперь при включённой сетке каждый символ текста сначала закрывает свою клетку чёрным: сетка видна только там, где у текста пробел. Сделано для обычного вида; под радаром сетка кольцами и символы стоят не по одной решётке, там закрытия нет.
Code 35.65 — «какие-то квадратные чёрные за символами». Закрытие сетки из 35.64 убрано, вид снова как в 35.63. Почему не вышло: сетка и текст стоят не на одной решётке. Во время игры текст плавно едет (скольжение 35.38) и почти всё время сдвинут на долю строки относительно сетки, а по горизонтали строка чётной длины сдвинута на полсимвола. Чёрный прямоугольник идёт за текстом и режет символы сетки пополам — отсюда чёрные квадраты с огрызками. А когда кегль выше межстрочного, прямоугольник следующей строки срезал и низ уже нарисованных символов. Урок: закрывать сетку клетками можно только если она стоит на той же решётке, что и текст; иначе это делается формой самого символа или правкой текста.
Code 35.66 — «нули должны быть в фигурах; просто клади сверху биты фигуры, а сетка всегда на заднем плане, а как это будет выглядеть, я подберу цветом 1 и 0 сетки». И пример: белая сетка — чёрные биты фигуры видны все; «0» сетки чёрный, на него лёг белый — виден только белый. Сделано так: клетка, где стоит символ фигуры, целиком принадлежит фигуре — символа сетки в ней нет, формы не смешиваются, а что видно, решают цвета. Порядок кадра при включённой сетке: холст прозрачный → текст (и полосы периодов) → сетка режимом destination-over, то есть под уже нарисованное, без занятых клеток → чёрный фон тоже под всё. Решётка сетки встаёт на решётку текста: по x от начала строк (строка чётной длины раньше была сдвинута на полсимвола — отсюда и огрызки в 35.64), по y от тех же строк; пока строки скользят, закрыта ближайшая клетка. Скрытые символы (прозрачность 0) клетку не занимают — там видна сетка. На мелком шрифте (больше 6000 клеток на экране) сетка не пишется заново каждый кадр: берётся готовая из кэша, на копии вырезаются клетки фигуры. Под радаром и в 3D-вращении — как было: сетка под текстом без вырезания.
Code 35.67 — «не понял, что это, вот что с нулями делает» (скриншот: строка «0 / 1» с чёрным «0» и белым «1»). Это строка 35.60 — цвета битов самой фигуры, не сетки. Чёрный «0» фигуры на чёрном фоне не виден, а клетку у сетки (35.66) всё равно занимает — на месте нулей фигуры в сетке чёрные дыры. Подпись была безликая «0 / 1», теперь «Фигура 0 / 1», а цвета шахматки — строка «Сетка 0 / 1» под ней; в подсказке сказано, чьи это цвета и что будет с чёрным «0».
Code 35.68 — «1 у своего цвета и 0 также». Два квадрата цвета стояли в конце строки после подписи «0 / 1», и было не понять, который из них чей. Теперь строки называются просто «Фигура» и «Сетка», а перед каждым квадратом своя цифра: «0 ■ 1 ■».
Code 35.69 — «тут стрелок не хватает, ползункам всем — стрелки» (скриншот плеера: Кадр и Скорость без ◂ ▸). Стрелки
раздавались только ползункам внутри левой и правой панели (.controls). Плеер и любой раздел, вынутый на
плавающее окно, к моменту раздачи лежат прямо в body — им стрелок не доставалось. Теперь ◂ ▸ получает
каждый ползунок страницы; удержание стрелки, как и прежде, повторяет шаг.
Code 35.70 — «и цвет фона надо вообще», и по ходу — «проверь все последние правки сам в браузере» (четвёртое разовое исключение). Первой строкой палитры «🎨 Цвета» встал «Фон холста» — цвет под текстом и сеткой, был всегда чёрный; прежняя строка «Фон» (цвет неизменившихся символов) переименована в «Статика», чтобы два «фона» не путались. Проверка нашла две ошибки, обе исправлены здесь же. Первая: флажок «Фигура 0 / 1» (35.60) молча не работал, пока включён «Цвет как код», а он включён в стартовом виде — синтаксис был главнее. Теперь цвета битов главнее синтаксиса (крипто и мутация — по-прежнему главнее них). Вторая: слой «Сетка» не переживал F5 — теперь он в снимке SESSION и в ★-сцене. Проверено в браузере на фигуре «Правило 90» (50 строк, нули внутри): сетка встаёт на решётку текста клетка в клетку, в клетках фигуры её нет, нули фигуры на месте; разреженность 1 — «1 0 1 0» шахматкой; цвета сетки 0 / 1 и фигуры 0 / 1 (жёлтые «1», синие «0») применяются; фон холста — и с сеткой, и без (пиксель угла 32,48,64 при #203040); радар с сеткой и воспроизведение — без ошибок в консоли; буквы в ромбах рисуются; стрелка ◂ ▸ у множителя скорости шагает и обновляет подпись; щелчок по заголовку перезагружает, после чего текст, галки, разреженность и сетка на месте. 35.69 и 35.70 ушли одним коммитом. Способ проверки (встроенная панель через локальный сервер) записан в правила.
Code 35.71 — «разреженность и по строкам тоже» — «сетки». Строка «Сетка реже» в «🎨 Цвете»: ↔ — пробелы между символами в строке (как было в 35.62), ↕ — новое поле, пустые строки между строками сетки (1 — через строку, до 16). Оставшиеся символы по-прежнему чередуются 1 и 0 шахматкой: номер символа в строке и номер строки считаются по оставшимся, так что ↔1 ↕1 даёт «1 0 1 0» над пустой строкой над «0 1 0 1». Сделано во всех видах сетки: символами (и из кэша, и под фигурой), пикселями на мелком масштабе (пустая строка прозрачна) и кольцами под радаром — там «строка» это кольцо, пропускается каждое кольцо, кроме каждого (↕+1)-го. Поле входит в сцены, в F5 и в сброс вида. В браузере не смотрел (разрешение было разовым); узор для ↔/↕ = 0/0, 1/1, 0/1, 2/1 сверен расчётом в node.
Code 35.72 — «когда на 1 сетки ложится такого же цвета 0, почему видно только 0? Должно же быть месиво». Я в 35.66 понял «клади сверху биты фигуры, сетка на заднем плане, а как будет выглядеть — подберу цветом» как «клетка фигуры целиком её» и вырезал сетку под фигурой. Пользователь имел в виду простое наложение слоёв. Теперь по умолчанию так: сетка позади, на той же решётке, что и текст (это из 35.66 осталось — символы совпадают клетка в клетку), биты фигуры сверху, и в общей клетке символы накладываются: одного цвета «0» на «1» — месиво из обоих, чёрный «0» сетки под белым битом — виден только белый. Прежнее поведение — по галке «Сетку под битами фигуры не рисовать» под цветами сетки. Урок: «сверху / на заднем плане» у пользователя — это порядок слоёв, а не вырезание; решают цвета.
Code 35.73 — «нужно нарезать ромбы и сложить в гиф или видео» (на снимках: сетка шаг 64, «каждый 2-й»). Кнопка «🎞 Ромбы в кино» уже резала ромбы, но по проходам снимала только верхний ромб и строго через проход, а шаг «каждый N-й» брал лишь 🎞 GIF всего текста. Теперь фильмы по проходам берут шаг оттуда же, и есть третий фильм — «все ромбы по проходам»: разобранный лист (ромбы на своих местах с зазорами, как в PNG «все ромбы одной картинкой»), кадр за кадром, пока весь текст не вернётся к первому кадру; предел — 256 кадров или ~200 МБ кадров в памяти. Волна гонится на копии, холст и счёт циклов не трогаются. Формат — GIF своим кодировщиком: видео (WebM) потребовало бы проигрывать кадры в реальном времени, а GIF собирается сразу и открывается где угодно. В браузере не смотрел — проверяет пользователь.
Code 35.74 — «нужна кнопка, которая все соберёт ромбы-кадры, разного размера, по всему циклу в свои гифы». Кнопка «📦 Все ромбы цикла — по GIF на размер» под «🎞 Ромбы в кино»: волна гонится на копии текста, пока весь текст не повторится (до 4096 проходов), после каждого прохода текст режется на ромбы 8, 16, 32, 64, 128, 256 — на каждый размер свой GIF. В GIF идут только РАЗНЫЕ ромбы, в порядке первого появления: без отбора ромбы 8 на тексте в 256 строк дали бы десятки тысяч кадров, а так выходит «алфавит» ромбов цикла (как у 🔤 Букв в ромбах, но по всему циклу и без склейки зеркальных). Сравниваются по тому, что видно: пробел / «0» / прочее. Предел 1500 кадров на GIF, в строке состояния — сколько разных из скольких. Файлы качаются по очереди.
Треугольник v0.001–v0.002 — «делаем отдельный html для такого треугольника, чтобы там было всё из того, что есть в этом файле, для начала» и следом «проверь, чтобы 1024 строки норм ходили». Новая страница Zerkalius-treugolnik.html (в хабе — Черновики → Triangle) — копия Code 35.74 целиком, дальше живёт сама. Память СВОЯ (ключи ztri_*): иначе две страницы затирали бы друг другу текст, сцены и вид; при первом запуске она берёт то, что лежит у Code, но ключи Code только читает. Сброс вида пишет пустое значение, а не удаляет ключ — иначе после сброса снова подхватился бы вид Code. 1024 строки, разобрано по коду (в браузере не мерил): шаг волны меняет одну строку, а страница пересчитывала все 1024 по 2047 символов и рисовала кадр — и так на каждый шаг, помноженный на множитель скорости. Теперь пересчитываются 2–3 затронутые строки, кадр и подпись — раз за тик; «целыми циклами» пересчитывает всё один раз после всех проходов. Следствие: «мутация» растёт только у строк, которые реально менялись. Символ мельче 4 px рисуется прямоугольником (fillText на сотни тысяч символов — главная цена кадра). Буквы в ромбах пересчитываются раз за проход, а не на каждом шаге. У 🎞 GIF — предел ~200 МБ кадров (на 1024 строках кадр ~2 МБ). Сетка «авто» знает ромб 512. 📦 Все ромбы цикла (и в Code 35.75) идёт кусками по 60 мс с ходом в строке состояния, повторное нажатие — стоп: на 1024 строках цикл ~1500 проходов по ~6 млн клеток ромбов, одним куском страница замирала бы на минуту. Размеры — до 512.
Треугольник v0.003–v0.005 — «Missing catch or finally after try», затем «проверь сам» (шестое разовое исключение). v0.003: мой комментарий // в строке сброса вида стоял ПЕРЕД «} catch (e) {}» и съел его — страница не запускалась вовсе. Замеры в Chrome на тексте 1024 строки × 2047 (конус, случайные 0/1 — худший случай), плоский вид: v0.004 — символ мельче 4 px пишется точкой в буфер пикселей и выводится одной картинкой: кадр при кегле 1 (весь треугольник на экране) 600 → 80 мс, при кегле 3 188 → 32 мс. Прямоугольники из v0.002 не помогли: цену давали смены заливки и строки цвета на каждый из миллиона символов, а не сам fillText. v0.005 — флаги Δ и мутации в typed arrays, сравнение по кодам символов: полный пересчёт 223 → 92 мс; шаг волны без склейки строки по символу: 100 шагов 60 → 27 мс. Итог на тик плеера: кегль 3 — 26 мс (множитель 1) и 49 мс (множитель 100), кегль 1 — 72 и 103 мс, «целыми циклами» — 173 мс при кегле 3. Шаг волны с выборочным пересчётом (v0.002) против прежнего полного — примерно в 370 раз дешевле. Осталось дорогим: ◇ сетка шаг 8 на кегле 1 (+50 мс — полмиллиона отрезков) и 🔤 буквы в ромбах (+60 мс на отрисовку букв). Кнопки со скачиванием (📦, 🎞) в этот раз не нажимались.
Треугольник v0.006 — «это вообще удалим» (кнопка 🛰️ радара), «подробнее по кадрам: сколько ромбов, какие на каких кадрах — перенеси сюда отображение, сводку», «отдельное окно для захвата выбранного ромба» и «подробное описание с примером, как считается Аниматрица и строится начальный Серпинский». Радар снят: обе кнопки спрятаны, а сцены, снимок F5 и стартовый вид его больше не включают. Три новых окна-раздела (вкладки сверху, таскаются, как все): «◇ Сводка ромбов» — текущий кадр (сколько ромбов, разных рисунков, букв, симметричных; буквы на своих местах), «▶ По кадрам — весь цикл» — таблицы по кадрам и по формам с рисунком и проходами, где форма есть, и 💾 .txt; «🔍 Ромб крупно» — 🎯 или Alt+щелчок по треугольнику, ромб живьём, на холсте белой рамкой, такие же — голубым, зеркальные — розовым, лента его разных состояний на границах проходов, GIF и PNG; «📖 Как считается» — правило 90 таблицей, пример на 4 строки (генератор, обрезка, пять проходов волны — проход 4 = Серпинский, проход 5 = проход 1), почему ромбы. Перепись ромбов теперь одна на всех (сводка, окно ромба, 🔤 буквы): числовой отпечаток вместо строк, прописная — та из зеркальной пары, чья строка символов меньше, как в 35.59. В цикле буквы — по первому появлению, в кадре — по частоте; это сказано в самом окне. Проверено в Chrome: правило 90 на 64 строки, ромб 16 — на проходе 5 21 ромб, 15 рисунков, 9 букв; цикл — период 64 с прохода 33 (разгон 28), 518 форм за цикл; Alt+щелчок берёт ромб и не трогает паузу. Поправка к собственному тексту: «нули исчезают на первом проходе» верно только для примера на 4 строки.
Треугольник v0.007 — «нужна кнопка закреп: первая строка всегда на самом верху при любом изменении масштаба». 🔝 — на месте убранного радара (и двойник над плеером). Разовая ⤒ в плеере ставила начало вверх один раз и останавливала игру; закреп держит всегда: пока он включён, отрисовка сама берёт позицию с первой строки и кладёт верх окна строк к верхнему краю холста — при любом кегле, интервале, во время игры и волны. Строк на экране — не больше, чем в тексте (иначе снизу по кругу снова шло бы начало); скольжение и сдвиг перетаскиванием по вертикали при закрепе не действуют. Помнится в снимке F5. Проверено в Chrome: кегль 3, 9, 20 посреди проходов волны — вверху строка 0, в 3–9 px от края.
Треугольник v0.008 — «по аналогии с ромбами вычислить и выделить эти треугольники — они до основания идут вниз; хотя это те же ромбы, просто общая грань их». Галка «◭ Треугольники-копии» в «👁 Вид». В чистой фазе проход — накопленный XOR по столбцу (умножение на треугольную матрицу единиц P), а в P^k клетка (i, j) равна C(k−1+i−j, i−j) mod 2 — единица ровно при (i−j) & (k−1) = 0 (Лукас). Значит, кадр через k проходов от начала цикла — XOR копий кадра начала цикла, сдвинутых вниз на все d с d & (k−1) = 0, и каждая копия видна треугольником: вершина на оси в строке d, стороны под 45° до основания. Рисуются V-линии от строки d вниз, цвет — по старшему разряду d, сумма разрядов — пунктиром, у вершины число d; «авто» оставляет не больше 24 копий (кратные 2, 4, 8…), можно выбрать «все» или «кратные N». Та же строка — в ◇ Сводке и в «📖 Как считается». k берётся по модулю периода. Проверено в Chrome расчётом по всем кадрам цикла: правило 90, 64 строки (период 64 с прохода 33) — 520 128 клеток, 100 строк (период 128 с прохода 65) — 2 552 700 клеток, расхождений 0; в цикле один символ «1». На 256 строках, k = 96 (k−1 = 01011111): копии 32, 128, 160 — линии легли на видимые грани узора.
Треугольник v0.009 — «по умолчанию для новых браузеров так открывай, и плеер» (снимок экрана). Раскладка без памяти: слева Файл, Звук, Формы, Слои; справа Движение, Логика, Вид, Цвет; окнами — ◇ Сводка ромбов сверху справа, 🔍 Ромб крупно под ней, плеер под треугольником правее центра; «📖 Как считается» спрятано. Первый запуск — не исходник с радаром, как в Code, а сам треугольник: правило 90, сид 1, 50 строк, фон обрезан; 1 мс на шаг, масштаб 11px, Аниматрица и 🔝 закреп включены. Подхватка памяти Code (текст, снимок F5, раскладка, вкладки) снята: в браузере, где открывали Code, иначе вместо треугольника встал бы исходник Code; сцены по-прежнему берутся у Code, пока своих нет. Проверено в Chrome на адресе 127.0.0.1 (своя пустая память, как у нового браузера) — вид совпал со снимком.
Треугольник v0.010 — снимок пользователя: зелёные треугольники у основания, которых ромбы не покрывают, и красные «песочные часы» между ромбами; затем «эти ромбы ещё и отражать от горизонтали, нижний на верх, например XOR». «Единица разбора» в «👁 Вид»: ◇ ромбы, ▲▼ треугольники (ромб, разрезанный горизонтальной диагональю; полосы высотой S/2 режут треугольник без остатка, в полосе n — n+1 ▲ и n ▼; ▲ последней полосы — края у основания без пары) и ⧗ часы (▼ над ▲ вершиной к вершине, там, где сходятся два ромба). Единица действует на сетку (горизонтали через S/2), 🔤 буквы, ◇ Сводку (с прогоном цикла) и 🔍 Крупно (щелчок берёт фигуру нужного вида). Движок переписан на общую геометрию фигур, вид подмешан в отпечаток. Сводка для ▲▼ считает, повторяют ли ▲ у основания рисунки ▲ выше. ⊕ Отражение: нижняя половина переворачивается через горизонталь на верхнюю и складывается правилом волны (верх главнее) — картинка в 🔍 Крупно и счёт «симметричны сверху вниз» в сводке. Проверено в Chrome: 50 строк, S = 32 — ▲▼ 9 фигур (6 ▲, 3 ▼, три ▲ у основания), одни часы в строке 32; щелчки попадают в нужные фигуры; XOR ромба сверен ручным расчётом (17 = 17). 64 строки, S = 16, весь цикл: симметричные сверху вниз — только на проходах 120–130 (часы — одни на всех 11, ромб — один на 4 из них), в 53 кадрах из 64 нет ни одной.
Треугольник v0.011 — «я всё понял, это пирамида», «вершина — центр часов». Единица «◆ пирамиды»: смотрим сверху, вершина — узел решётки (центр часов), рёбра — диагонали сетки, основание — квадрат 2h+1 × 2h+1 клеток вокруг узла; грани — ▼ и ▲ часов и половинки ромбов слева и справа остриём к вершине. Соседние пирамиды перекрываются: половинка ромба — грань двух пирамид. На сетке — вертикали (стороны квадратов), буква — на вершине, щелчок берёт пирамиду с ближайшей вершиной; в 🔍 Крупно — рёбра на картинке и четыре грани, повёрнутые к верху (обход кругом); в сводке — сколько пирамид с 4 одинаковыми гранями, с двумя парами, в среднем разных граней. Поправка к v0.010: пустые фигуры (одни пробелы — дыры в узоре) одинаковы и симметричны без смысла, теперь они считаются отдельно — прежние «симметричные на проходах 120–130» на 64 строках были именно такими. Итог расчётом по всему циклу (правило 90): у непустых пирамид 4 одинаковые грани — 0 при ромбах 16 и 32 (64 и 128 строк), 6 из 52 634 при ромбе 8; две пары — 2 из 951, 3 из 1902, 12 из 11 419; у 95–99% все четыре грани разные. Симметрия кадра живёт между пирамидами (лево ↔ право), а не внутри них. Грани сверены прямым чтением клеток.
Треугольник v0.012 — «да» на объёмный вид пирамид. Окно «🗻 3D»: пирамиды с вершинами в узлах одной чётности (решётка А — вершины в строках 0, S, 2S…, вершина текста — вершина пирамиды; Б — со сдвигом на полшага) ложатся основаниями встык, без перекрытия, и кадр становится полем пирамид; можно смотреть и одну пирамиду, выбранную в «🔍 Крупно». Проекция грани на землю — ровно тот кусок текста, что виден сверху, поэтому узор натягивается на грань точным аффинным отображением (drawImage под setTransform с обрезкой по треугольнику), без библиотек. Невидимые грани отбрасываются, остальные — от дальних к ближним, освещение по нормали; мышь — поворот, колесо — масштаб, ползунок высоты, автовращение, «⊙ сверху». Картинка живая: текстура (1 клетка = 1 пиксель) обновляется за волной не чаще 5 раз в секунду. Проверено в Chrome: «⊙ сверху» на 128 строках совпал с текстом клетка в клетку (1880 из 1880); 1024 строки — ромб 32: 1155 пирамид, кадр 61 мс; ромб 16: 4355 пирамид, 181 мс; текстура 19 мс.
Треугольник v0.013 — «делать»: пирамида и её отражение под основанием — октаэдр, знак Zerkalius. В «🗻 3D» галка «⧫ зеркало (октаэдры)»: под каждой пирамидой — такая же вершиной вниз, её грани несут ту же картину (проекция та же — это и есть отражение через основание), биты — по режиму: 0 ↔ 1, как нижняя половина в «Октаэдре»; пусто ↔ символ (дополнение узора, только внутри треугольника — иначе поле за краями стало бы сплошь «1»); без инверсии. Камера опускается под основание («⊖ снизу»), свет снизу отражён. Проверено в Chrome: 128 строк, ромб 32 — сверху клетки «1» светлые (голубых 0), снизу все 226 — голубые (биты перевёрнуты); при взгляде снизу видны ровно 140 нижних граней (35 октаэдров × 4).
Исследование v0.021 — «3»: точная формула разгона. Столбцы независимы, клетка видит только клетки выше — у каждой клетки своё время жизни нуля τ, не зависящее от числа строк ниже. Посчитано для всех клеток до 1024 строк и прямым прогоном до повтора: начало цикла = max τ + 1 (расхождений 0). max τ растёт скачками на строках 3·2^(k−1)+1 (4, 7, 13, 25, 49, 97, 193, 385, 769), рекордсмен — пара клеток с отступом ±2^(k−1), τ = 2^k. Формула: цикл с прохода 2^m + 1, где 2^m — наибольшая степень двойки ≤ 2(N−2)/3 (N ≤ 4 — проход 1); проверена для всех N от 2 до 1024. Отсюда поправка: «разгон = P/2 + 1» (раздел 9, v0.005, и мой раздел 11) верно только в верхней четверти каждого удвоения (N от 3·2^(m−2)+2 до 2^m); при 65…97 строках цикл идёт с 33-го, а не с 65-го. Прежние прогоны (50, 64, 100, 128, 200, 256, 512, 1000, 1024) все случайно попали в верхние четверти. Вывод «почему именно так» открыт: первая догадка (сплошная лесенка 1 0 1 0 по Лукасу над рекордсменом) расчётом опровергнута. Карта τ для 128 строк — razgon-tau-128.png; скрипты — archive\_issledovanie-treugolnik-1024\.
Исследование v0.022 — «дальше»: рекордсмен выведен. Столбец с отступом a = 2^(k−1): под краем «1» ровно 2a − 1 нулей подряд (на чётной глубине 2i при 0 < i < a C(a+2i, i) чётно — перенос младшего разряда, Куммер), на глубине 2a — «1» (C(3a, a) нечётно), на 2a + 1 — «0», рекордсмен. Первый проход заливает нули в блок из 2a единиц, а «1» под блоком гаснет в пробел — щит над нулём. Дальше блок — чистый XOR: щит после k проходов равен C(2a+k, k) − 1 (хоккейная клюшка) и непуст ровно при k & 2a ≠ 0, первый раз — при k = 2a. Ноль живёт 2^k проходов и гибнет на проходе 2^k + 1. Сверено расчётом для k = 1…9 по всем трём шагам. Открыта только верхняя граница (что никто не живёт дольше) — проверена сплошным расчётом до 1024 строк. Урок: догадка v0.021 («лесенка 1 0 1 0») была неверна — трасса столбца проход за проходом показала сплошные нули.
Треугольник v0.014–v0.015 — пользователь прислал выгрузку сводки (50 строк, ромб 8, проход 143) — «объясни на примере»; в выгрузке номер формы слипался с числом («#541» = форма #54, 1 раз) — теперь «#54×1», «Б×3». Затем «поиск по словарю на сочетания слов», «можно свитчер использовать» (E:\GD\_Swtchr). В Swtchr словаря нет — есть частоты троек букв, собранные из русских строк Windows; тем же путём собран словарь: словоформы из System32 u-RU\*.mui (и SysWOW64), с убранным «&» ускорителей меню (иначе «Сохр&анить» даёт обрывки «тва», «зра»), без сокращений (слова, чаще стоящие с точкой: «нед.», «авт.»), без слов без гласных, короткие — только частые; плюс короткие слова Swtchr и ~490 частых простых слов вручную — 21 770 словоформ, файл _js/slovar-ru.js (грузится по требованию, работает и с диска). Окно «🔎 Слова»: строки букв — ряды, стороны треугольника (у ромбов), по желанию справа налево; ищутся слова по словарю, сочетания (словарные слова встык) и «почти слова» по тройкам Swtchr (порог — 30-й процентиль похожести самих словарных слов); щелчок подсвечивает фигуры на холсте. Из двух букв — только настоящие (да, не, на, по…). Проверено: 50 строк, ромб 8, проход 143 — ваза, два, ели, жал, кем, «два·за»; за цикл — ещё вниз, окон, еда, ива, хор, где, мед, жил, дно, око, мак, сом… Буквы — имена форм по частоте, так что находки — совпадения, как слово в номерном знаке.
Треугольник v0.016 — «значит ищем картинки-фильмы» → «бегущие формы» и «фильм одного места». Окно «🎞 Фильмы» прогоняет цикл на копии: у каждого места — его фильм (период — через сколько проходов место повторяется — и число разных кадров), щелчок выбирает место в «🔍 Крупно» (лента, 🎞 GIF); ходы — тот же рисунок на следующем проходе в соседнем месте, цепочки «качели» и «бег», щелчок — GIF окрестности. Итог расчёта: бега нет и быть не может — волна пересчитывает каждый столбец сам по себе, вбок рисунку сдвинуться нечем. 128 строк, ромб 16, весь цикл: рисунок остаётся на месте 427 раз, переезжает по-настоящему (ушёл со своего места и появился рядом) — 2 раза, цепочек нет. Первая прикидка в Python насчитала «качели» по 5 кадров, но засчитывала и случаи, когда рядом просто стоял близнец того же рисунка, — окно считает строже. Фильмы мест: 27 мест с периодом 32, 42 — 64, 36 — 128; внутри периода все кадры разные; короче всех — верхние ромбы (раздел 4).
Треугольник v0.017 + Октаэдр v0.042 — «связь с „Октаэдром“: открыть выбранную пирамиду прямо там, большим знаком». В «🔍 Крупно» кнопка «◆ Октаэдр»: грань пирамиды — h+1 рядов, и в тексте правила 90 значимы клетки одной чётности (прочие — нули-прокладки), так что на грани в ряду r от вершины ровно r+1 клеток — треугольник Паскаля, как грань «Октаэдра»; бит — «1» → 1, прочее → 0. Грани — восточная, южная, западная, северная (обход по часовой, как слоты октаэдра, повёрнутого на 45°), в ряду — слева направо для смотрящего снаружи (у «Октаэдра» k = 0 у левого угла, проверено по обходу вершин грани). Передача — адресом …#treug=R.БИТЫ: «Октаэдр» v0.042 берёт картину как «свои биты» при основании 4, снимает Серпинского и чистит адрес, чтобы F5 не затёр правок. Низ октаэдра — как всегда, та же картина инвертированная. Проверено в Chrome: 64 строки, ромб 16, пирамида с вершиной в строке 32 — «Октаэдр» открылся с 9 рядами, основанием 4, все 180 бит совпали, адрес очищен.
Треугольник v0.018 — «октаэдры по циклу: GIF или запись того, как поле „дышит“ за весь период». В «🗻 3D» кнопки «🎞 GIF цикла» и «⏺ Видео цикла»: волна гонится на копии текста (шаг — «каждый N-й» у 🎞 GIF Аниматрицы), каждый кадр — то же 3D, что в окне, с подписью прохода, пока весь текст не вернётся к первому кадру (не больше 512); при «вращать» за цикл — ровно один оборот. У 3D с освещением сотни оттенков, а кодировщик GIF знал до 8 цветов — теперь до 256 (8 бит; прежние GIF с 4–5 цветами не меняются), кадр квантуется в куб 6×6×6. Видео — WebM с холста (MediaRecorder, кадр по requestFrame), в полных цветах. Проверено в Chrome: 64 строки, ромб 16 — GIF 64 кадра, 426 КБ, 1,1 с, открывается; 16 строк, ромб 8 — WebM 16 кадров, 194 КБ, 400×340.
Исследование v0.023 + Треугольник v0.019 — «что мы знаем о протеканиях 1 или 0 этих слоёв с вершины вниз» (скриншот 🗻 3D, стрелка от вершины поперёк полос). Раздел 13 «Протекание» и абзац в «📖 Как считается». Течь идёт только вниз по столбцу, за один проход — хоть через весь столбец (верх уже пересчитан). «0» течёт только в разгоне: в цикле нулей нет ни у одного N, а начало цикла = гибель последнего нуля — это уже стояло в разделе 12, в ответе пользователю я сперва назвал это новой находкой, в разделе сказано честно. Новое: верхняя «1» столбца вечна (родник), одна «1» после k проходов на глубине d ⇔ d & (k−1) = 0 — отсюда слои 2^m на проходах 2^m + 1; ось треугольника — чистый родник на проходе p (128 строк, проходы 1…255, клетка в клетку). Прочие столбцы — родник плюс копии; чистых родников со сдвигом фазы у 64 строк 34 отступа из 64. Картинка rodnik-128.png — глубина × проход.
Треугольник v0.020 — «режим отображения, где вместо 1 и 0 квадраты цветом отличить» и следом «а режим с ромбами вместо квадратов». В «Цвете» под строкой «Фигура» — «Биты: 1 0 знаками / ■ квадраты / ◆ ромбы». Квадрат — вся клетка текста (ширина символа × интервал), ромб — вписанный в неё; цвета — «0» и «1» строки «Фигура» (в этих режимах всегда, иначе квадраты были бы одного цвета), яркость полная, «Скрыть статику» работает как прежде. Фигуры копятся в Path2D по цвету и заливаются разом — две заливки на кадр вместо тысяч fillText; при кегле меньше 4 px — прямо в буфер пикселей, в кольцевой раскладке фигура повёрнута вдоль кольца. Режим помнят сцены. GIF и прочие выгрузки рисуют по-прежнему своим способом. Chrome в этот момент был отключён — проверен только разбор скрипта, картинку смотрит пользователь.
Треугольник v0.021 — «тут настройку, чтобы видео с панелями запись» (скриншот кнопки ⏺). Правый щелчок по ⏺ — меню «Что писать: только холст / вкладку целиком, с панелями»; выбор помнится (ztri_rec_mode), в режиме вкладки на кнопке значок ▣. Панели — не холст, captureStream их не видит, а рисовать DOM в холст самим — тяжело и неточно. Поэтому вкладка пишется захватом экрана браузера (getDisplayMedia, preferCurrentTab): Chrome один раз спрашивает «Поделиться этой вкладкой», его кнопка «Закрыть доступ» тоже останавливает и сохраняет запись. Хранилище кусков, имя файла, защита от закрытия — те же, что у записи холста (общий хвост begin). Во время записи вкладки кнопка не мигает и счётчик REC не показывается — оба попали бы в кадр. Звук — звук вкладки, если отмечен в окне Chrome, иначе трек визуализатора. Chrome отключён — проверен только разбор скрипта.
Code 35.76 + общий _js/recorder.js — «да» на «перенести в Code и в общий модуль записи». Code получил ту же правку, что Треугольник v0.021 (своя память выбора — zcode_rec_mode). Общий recorder.js — у всех страниц с круглой ⏺ в правом нижнем углу (Genezis, Genezis WebGL, GPU, Grid, Kubits, Lively, Октаэдр): правый щелчок — «что писать», выбор один на все эти страницы (zerk_rec_mode), значок ▣, запись вкладки через getDisplayMedia; остановка — ⏺, R или «Закрыть доступ» в Chrome. У модуля нет подписи ?v= в подключениях — чтобы правка приехала, может понадобиться Ctrl+F5. Проверен разбор скриптов, в браузере — пользователь.
Результаты v0.001 (новая страница rezultaty/) + Хаб v0.031 + Треугольник v0.022 + Исследование v0.024 — «это в методичку, может и в хаб? все результаты — очень интересное получилось», затем «надо отдельной, не в ресёрч — это же как бы результаты» и «нечто, что можно готовым смотреть». Витрина: вверху весь цикл 1024 строк одной анимацией (новая, cikl-1024.gif: каждый 4-й проход, 256 кадров, густота единиц в квадрате 4×4) и шесть главных законов строкой; дальше карточки — «все ромбы цикла» 1024 строк по семи размерам (первые 300 разных рисунков каждого, с числом разных за цикл), цикл и законы, ромбы изнутри, зеркало, другие правила — у каждой ссылка на свой раздел «Исследования». Картинки «Исследования» не копируются, берутся из его папки. Полные GIF по 1500 рисунков (3–21 МБ, вместе 65 МБ) на сайт не пошли: публичный репозиторий и так несёт 190 МБ старого видео. MP4 пробовали — на кадрах, где каждый — новый рисунок, видео тяжелее GIF (512: 62 МБ против 21). В хабе — третья главная кнопка Results под Triangle; в «📖 Как считается» Треугольника и в подзаголовке «Исследования» — ссылки на витрину; hub-link.js знает папку rezultaty.
Исследование v0.018 — «проверим и с заполненными нулями, без обрезки фигуры, 90 начнём». Правило 90, 50 строк без «Обрезать фон»: разгон 32, период 64, но единиц в цикле 1…50 и все в центральном столбце, а нули живут; с обрезкой — наоборот. Разгадка: волна переписывает клетку только по клетке того же столбца строкой выше — столбцы независимы. Где встречаются «0» и «1», остаётся верхний, и метка самой верхней непустой клетки столбца (строка 0 не переписывается) заливает весь столбец; к циклу каждый столбец однометочный, а в однометочном столбце волна — чистый XOR по наличию символа. Отсюда два закрытых вопроса: период всегда степень двойки при любых нулях (метки едут на узоре XOR), и нули живут ровно в столбцах, чья верхняя непустая клетка — «0» (с обрезкой верх — край треугольника, там «1»; сиды 101, 1101, 10011 оставляют «0» в строке 0). Сверено на 13 прогонах из 13 (правила 90, 18, 150, 30, 110, разные сиды, с обрезкой и без). Полосы во всю ширину на скриншоте — фон из «0», он однометочен сразу и мигает периодами строк. Открыто: точная формула разгона P/2 и P/2 + 1.
Треугольник v0.023 — «а если вместо XOR Аниматрицу AND», «какие ещё есть лог. операции, которые не обнулятся», «да». Под
галкой Аниматрицы — выбор операции волны: XOR (прежний), XNOR, NAND, NOR, AND, OR. Прежде чем делать, перебрали все 16
операций от двух бит на столбце 128 строк (столбцы независимы, см. исследование v0.018): цикл 128 дают только XOR и XNOR —
только у них по верхней клетке и новой нижней однозначно восстанавливается старая, то есть проход обратим. NAND и NOR
не обнуляются сразу — разгон до 127 проходов, потом мигание с периодом 2. AND и OR замирают после первого прохода: строка
становится AND (OR) всех строк над ней, а повтор ничего не меняет; на сцене «1» AND оставит один центральный столбец. Правило
волны было переписано в девяти местах (сама волна, GIF, ромбы в кино, окна ромба и поля) — теперь все берут клетку из одной
функции waveCell(). XNOR, NAND и NOR из двух пробелов делают символ; пишут «1», поэтому фон вокруг треугольника
зажигается. Смена операции обнуляет счёт циклов (старые отпечатки к новой операции не относятся), текст не трогает. Выбор
входит в сцену и переживает F5. «Зеркало через центр» и Эхо остались на XOR — это не волна.
Layers v1.628 — «в текущих строках — там тоже треугольник — найти все ромбы-треугольники по размерам, записать и сортировать по размерам, и отдельно все, с наложениями, строка за строкой, бит за битом», уточнение: «там нет Аниматрицы, просто статику». В «Строках» рядом с «🧮 Лин. сложностью» — ◇ Ромбы: сетка, ◇ Все внахлёст и поле «до» (размер, 0 — все). Ищутся ▲ (вершина сверху), ▼ (вершина снизу) и ◇ (▲ размера s и ▼ размера s−1 под ним) всех размеров от 2 — так, как стоят на экране: начало строки берётся тем же расчётом, что у XOR по столбцам (выравнивание, «½», зеркала), наклон стороны — полсимвола на строку на «½», символ на остальных. Фигура есть, только если все её клетки — биты. «Сетка» — жадно сверху вниз, слева направо, без наложений внутри вида и размера; на треугольнике Паскаля это ровно регулярная нарезка (проверено рассуждением: следующая ▲ того же размера встаёт не раньше, чем через s бит). «Все» — каждое положение. Отчёт — файл .txt: сводка по размерам, у каждого вида и размера разные рисунки по частоте и все места (строка : бит). Потолки — 120 млн прочитанных клеток и 40 млн символов отчёта, иначе на треугольнике в 128 строк «все без ограничения» — это около 300 млн клеток; отсюда и поле «до», по умолчанию 16. Данные не трогаются.
Общий формат фигур _js/figury.js + Layers v1.629 + Треугольник v0.024 — «нужно потом сравнить и найти одинаковые с
найденными в Аниматрице, форматы надо подготовить». Обе страницы пишут фигуры одной таблицей .tsv через новый общий модуль
(ZFIG): одна строка на разный рисунок — вид (▲ ▼ ◇ ⧗ ◆), шаг решётки, строк, клеток, рисунок (строки через «/», клетки 0, 1
и «.» — пусто), ключ без зеркала (меньший из рисунка и его отражения), подрешётки «чёт»/«нечёт», сколько, где. Главная
трудность — решётки разные: Треугольник рисует правило 90 на ПОЛНОЙ сетке (шаг 2: строка на два символа шире), Паскаль там
лежит в клетках одной чётности, а волна Аниматрицы перемешивает обе; Layers на «½» хранит только клетки Паскаля (шаг 1:
строка на бит шире). Поэтому у фигур шага 2 пишутся обе подрешётки отдельными столбцами, уже в виде шага 1: подрешётка
вершины («чёт») у ◇ высотой S — это ромб Паскаля со стороной S/2 + 1, вторая — на размер меньше. Фигура Layers на «½»
сравнивается с этими столбцами, на обычных выравниваниях — с рисунком напрямую. В Layers рядом с «до» — выбор «отчёт .txt /
таблица .tsv», «до» по умолчанию 17 (ромбы и ▲ Треугольника высотой 32). В ◇ Сводке Треугольника — «📐 .tsv»: прогнан цикл
— все формы цикла (зеркальные близнецы у него уже слиты), нет — фигуры текущего кадра. В модуле есть и чтение таблицы
(ZFIG.parse) — под будущее сравнение.
Треугольник v0.025 — «надо кнопку сохр все формы — которая запустит и дождётся всех циклов и сохранит». В ◇ Сводке — 📐 Весь цикл → .tsv: тот же прогон, что у ▶ (копия текста, кусками, до повтора или 4096 проходов), а когда цикл замкнётся, таблица всех форм скачивается сама. Повторное нажатие во время прогона — стоп, и тогда таблица не пишется, чтобы не принять обрывок за весь цикл. Вид и размер фигур — выбранные в окне.
Проверка 2026-09-25 (по слову пользователя «проверь, запусти и сохрани 256 Аниматрицу, все размеры»): Правило 90, сид «1», 256 строк × 513, XOR. Ромбы S = 8…128 и ▲▼ S = 8…256 — все 11 прогонов замкнулись одинаково: повтор с прохода 129, период 256, кадров 385 (разгон P/2 + 1, как в исследовании). Разных форм: ромбы 22479 / 13501 / 5831 / 2250 / 610, ▲▼ 21204 / 21474 / 9951 / 4112 / 1453 / 321; таблицы — 120 МБ. Две находки: браузер пропускает с одной страницы только ПЕРВОЕ из автоматических скачиваний подряд (остальные молча глотает — таблицы пришлось принимать локальным приёмником), и в скрытой вкладке прогон почти стоит: setTimeout(…, 0) там идёт раз в секунду.
Треугольник v0.026 — «да» на «кнопку: все размеры → один файл». В ◇ Сводке — 📐 Все размеры → .tsv и выбор видов (◇ и ▲▼ / все 4 / выбранный): для каждого вида и каждого размера из списка, что помещается в текст, — тот же прогон цикла, в конце ОДНО скачивание: шапка ZFIG со сводкой прогонов и блоки «# --- вид, S = …» (ZFIG.parse их пропускает), в «где» — вид и S. Стоп — повторным нажатием, файл тогда не пишется; ▶ и «Весь цикл» на время прогона не перебивают его. Куски прогона цикла теперь идут через MessageChannel, а не setTimeout, — в скрытой вкладке он больше не стоит.
Проверка Layers v1.629 (по слову пользователя «прогони в Layers 256 Серпинский для теста»): 🔺 Серпинский на 256 строк, «Центр ½», «до» 17. Сетка — 0,6 с, 2627 разных рисунков; все внахлёст — около 4 с, 14240 разных, отчёт .txt упёрся в потолок 40 млн символов (сводка полная). Счёт сверен с формулами: ▲ размера 2 в сетке — 8256 (полосы по 2 строки, 1 + 2 + … + 128), ▲ всех положений размеров 2…17 — C(257,3) − C(241,3) = 492200. Формат сверен с Треугольником: все 6 рисунков ромбов кадра 0 Аниматрицы (сам Серпинский, подрешётка «чёт») при S = 8, 16, 32 нашлись среди ◇ Layers «все» сторонами 5, 9, 17. В «сетке» Layers — не все (при S = 32 два из шести): жадная укладка ромбов ложится не в те узлы, что у ромбической сетки Треугольника (строки через S/2). Память localhost после проверки возвращена из копии.
Layers v1.630 — «пройдись по всем панелям, наведи порядок в кнопках по минимуму — минимум текста, две кнопки на строку,
максимум утоньши, сгруппируй по функциям, проверь на дубли, вкладку Новое распусти». Все панели (Шаги, Поиск, Маски, Лог находок,
Вид, Строки, Выделить, Построения, Сквозная, Перенос) пересобраны одним приёмом: разделы .psec с маленьким
заголовком и сеткой в две колонки, кнопка с полем — строкой .pr на обе колонки. Кнопки 15 px (было 17), шрифт
11 px, промежутки 2 px; подписи — по два-три слова, не влезло — многоточие; полный смысл остался в подсказках, их не трогали.
Короче стали и подписи, которые код ставит на ходу («↕ Переписать», «🖱 Выдел: нет», «⇔◀ Рев+Инв», «🎭 Маска: вкл», «⛔ Выше
отсечки: нет», «📌 Фикс: 0», «⬆ Кусок вверх»…). Id у всех кнопок прежние — обработчики и сохранённая раскладка их находят;
элементы переносил скрипт по id, с проверкой, что ни один не потерян. Цветовые строки «Вида», ползунки, подсветки, режимы
фон-поиска и ряд ручек «Переноса» перенесены целиком — у них своя вёрстка. Вкладка «Новое» (дубли-пульты v1.542) распущена:
все её кнопки и так на своих панелях. Дубли сняты с панелей в скрытый #retiredBtns (живы, чтобы код их находил):
«⇔ Зеркало: круг» (= «◀/▶ Зеркало»), «Инв» (= «⇔◀/⇔▶»), «= Цвет» (= «✕ Новые» во «Виде»), «🎭 По маске» из «Поиска» (= её
копия в «Масках»). Одинаковые подписи у разного — разведены: «⤓ Вписать» зеркала и «⤓ В строку» у GF(2). Прежняя разметка со
всеми её комментариями — в архиве v1629.
Layers v1.631 — «окно для поиска кнопок». Новая вкладка 🔎 (окно «🔎 Кнопки», гуляет, как все: док, выпадающее меню, холст, отдельное окно) и Ctrl+K — открыть его с курсором в строке. Ищет по всем панелям: подпись кнопки или галки, её подсказка и имя панели, слова в любом порядке, без регистра и ё; совпавшие в подписи — выше. Щелчок по найденному — показать: панель раскрывается (или поднимается её окно), кнопка мигает жёлтой рамкой; «▶» — нажать сразу. Enter — показать первую, Ctrl+Enter — нажать. Список собирается заново на каждый ввод — подписи переключателей меняются на ходу, панели ездят. Скрытые дубли (#retiredBtns) в поиск не попадают. Нужно стало после v1.630: подписи короткие, и «где та кнопка» проще спросить словом из подсказки. Ctrl+F не занят нарочно — он остаётся браузеру.
Layers v1.632 — «Крест удалить из Layers, он есть в Зазеркалье — достаточно; также ядро децимации, карту осей» (из списка «что только для справки» пользователь выбрал пункт 1). Сняты: окно 🪞 Крест (в Zazerkalius — «🪞 Зеркало»), кнопки 🧬 Ядро, 🪞 Карта осей и её пара 🪞 Оси сквозной со списком обхода (в Zazerkalius — «🧬 Лента: оси и ядро» и «Указатели симметрии»). Код остался: всё подвешено через проверку «есть ли кнопка» и без неё молчит, Карта осей в кэш не пишется — включённой после перезагрузки не окажется. Остальное из списка (▽ Спуск, ⇋ Поправка, 🧮 Лин. сложность, GF(2), балансы и номера) — не трогали. И вторая просьба, по снимку меню цепочек: «сюда перемести сохранение ромбов». ◇ Ромбы: сетка, ◇ Внахлёст, поле «до» и формат (.txt / .tsv) переехали из «Строк» в подвал списка цепочек (▾ у имени), над настройками вида. Список перерисовывается целиком, поэтому значения «до» и формата держат переменные rhDdMax/rhDdFmt. Поиск 🔎 теперь находит и кнопки этого подвала — щелчок раскрывает список.
Layers v1.633 — «там по меню подсказки врут». У ◇ Ромбов в меню цепочек подсказки были перенесены из «Строк» как есть: «отчёт скачивается .txt» (формат теперь выбирается) и «поле справа» (оно ниже) — переписаны под новое место, с указанием на страницу «Сравнение». И шире: после v1.630 подсказки по всем панелям ссылались на кнопки старыми именами («⬆ Достроить вверх», «▭ Выбор ячеек», «✕ Снять столбец», «🧩 Паттерн-цепочка»…). Скрипт сверил подписи v1629 с нынешними и заменил старые имена в «ёлочках» — только в том, что видит человек: подсказки (title, TIPS) и сообщения в коде; комментарии в коде не трогал, это история. Около шестидесяти замен. Поле маски подписано «🎭 Прореж.» — так на него и ссылаются подсказки (прежнее «🎭 Маска» совпало бы с кнопкой маски в «Строках»). Попутно исправлены три подсказки, вравшие ещё до этого: «🔗 Сквозная 🐍 →/←» и «⧅/⧄ Зигзаг» — в «Поиске» эти режимы зовутся «ЗмейПрав/ЗмейЛев» и «ЗигПрав/ЗигЛев».
Сравнение v0.002 + Layers v1.634 + Треугольник v0.028 + _js/figury.js (картина) — «тут бы ещё показать
статистику по отдельности для каждого, не обязательно оба файла загружать, и в них показать целый и его части, желательно
интерактив — не Аниматрицу, а только если статика». У каждого набора — своя сводка сразу после загрузки: вид × высота,
клеток, разных рисунков, встреч, самый частый. В формат добавлен необязательный блок «картина» (строки «#»: шаг, первая
строка и «#| a биты» — где строка начинается в полустолбцах); старое чтение его пропускает, формат остался v1. Пишут его
Layers (◇ Ромбы → .tsv — цепочка) и Треугольник (📐 .tsv текущего кадра); у цикла Аниматрицы картины нет — кадров много.
Если картина есть, страница рисует её целиком, а ниже — части: вид и высота, рисунки по частоте маленькими картинками;
щелчок по рисунку зажигает на картине все его места (поиск по самой картине, так что годится любой рисунок, и с зеркалом),
щелчок по картине берёт фигуру выбранного вида с вершиной в этой клетке. Щелчок по строке сравнения зажигает фигуру на
обеих картинах (у совпавших подрешёткой — целую фигуру своего набора). Подпись модуля у всех трёх страниц — ?v=2, иначе
браузер отдал бы старый figury.js без картины.
Треугольник v0.030 + Layers v1.635 + Сравнение v0.003 + _js/figury.js (?v=3) — «надо как-то сгруппировать —
непонятно ничего, что как, и знать, что скачаю; отдельные кнопки, не зависящие от текущего прогона: По циклу · Участки (ромб) ·
Все размеры — чтобы так писала итоговая кнопка; и Всё», и следом «ещё надо открывать сразу в окне для просмотра». В ◇ Сводке
Треугольника две группы. «Смотреть»: ▶ Цикл по кадрам — на экран, 💾 Отчёт .txt. «Скачать таблицу .tsv»: три выбора — откуда
(цикл / кадр), участки (◇ ромбы, ▲▼, ⧗, ◆, все виды), размер (все / этот) — и итоговая кнопка, которая сама пишет, что скачает:
«📐 Скачать: Цикл · Ромбы · Все размеры»; рядом «📐 Всё: цикл · все виды · все размеры». Прогон каждый раз свой, на копии
текста — открытый «▶ Цикл по кадрам» на результат больше не влияет (раньше «📐 .tsv» молча брал его, если он был). Кадр пишется
с картиной, несколько размеров — одним файлом. Сняты «📐 .tsv», «📐 Весь цикл → .tsv» и «📐 Все размеры → .tsv» с выбором видов —
их всё это покрывает. Галка «👁 сразу открыть в «Сравнении»» (и такая же 👁 у ◇ Ромбов в меню цепочек Layers, для .tsv): окно
«Сравнения» открывается в момент щелчка — после долгого прогона браузер счёл бы его всплывающим и не пустил, — а таблица
приезжает туда сообщением, когда готова (ZFIG.sendToViewer шлёт, пока страница не ответит; первая — в набор А, дальше — в Б).
Пока делалось, Треугольник дважды уходил вперёд в соседней сессии (v0.027, v0.029) — номера взяты из файла.
Треугольник v0.031 + Layers v1.636 + Сравнение v0.004 + _js/figury.js (?v=4) — по снимку («⏹ Стоп», идёт
прогон, а окно «Сравнения» уже открыто пустым): «пусть страницу потом откроет». Галка «👁» теперь только отметка: окно
открывает ZFIG.save, когда таблица готова (ZFIG.showInViewer). Уже открытое окно «Сравнения» получает её сразу. Иначе страница
пробует открыть окно сама — у быстрой выгрузки это ещё тот же щелчок, и браузер пускает; после долгого прогона цикла браузер
такое окно обычно блокирует как всплывающее, и тогда в правом нижнем углу появляется плашка «Готово: … — 👁 Открыть в
«Сравнении»» — её щелчок уже настоящий. Файл скачивается в любом случае.
Layers v1.637 — «Сравнение показывает 0 разных рисунков, шаг решётки 2», «пусть не смотрит вообще выделение, по всем делает» и «подсказка врёт». ◇ Ромбы (сетка и внахлёст, .txt и .tsv) берут теперь ВСЮ цепочку: раньше при одной выделенной строке диапазон был «от первой строки до неё», и выделенная строка 1 давала таблицу из двух строк — почти пустую. Если фигур ноль, а выравнивание не «½» (шаг решётки 2), сообщение подсказывает включить «Центр ½»: строки, растущие на бит, как у Паскаля, стоят со сдвигом в полсимвола, и на целых столбцах их биты друг под другом не сходятся. Над «◇ Внахлёст» и другими строками меню цепочек всплывало «Переключить вкладку цепочки»: title стоял на обёртке меню, а подсказки ищут ближайший элемент с title вверх по разметке — всё без своей подсказки брало её. Title переехал на саму кнопку «Цепочка ⌄».
Хаб v0.035 + Битмультфильмы v0.004 — «сделай стрелки от Треуг — к Результатам, переименуй Битмультфильмы». Между двумя главными кнопками хаба — три дорожки во всю ширину кнопки, по ним вниз бегут шевроны, цвет переливается вместе с кнопками (при «меньше движения» в системе стоят на месте). Кнопка «Results / Результаты» теперь «Bit Cartoons / Битмультфильмы», так же названа и сама страница rezultaty/ (заголовок окна и шапка). Папка и адрес прежние, ссылки не ломаются.
Треугольник v0.032 + Исследование v0.025 — следом за переименованием: ссылки на витрину подписаны «Битмультфильмы» (в Треугольнике — ещё и строка состояния «Заготовка из «Битмультфильмов»» после перехода по ссылке с заготовкой).
Хаб v0.036 — по снимку, где стрелки стояли: «оживи вниз-вверх, пусть дёргаются». Стояли они из-за «меньше движения» (на Windows Server включено по умолчанию, см. v0.028) — теперь оно стрелки не останавливает. Плавный бег вниз заменён рывками: пара шевронов прыгает вниз и отскакивает вверх с короткими замираниями, у каждой из трёх дорожек свой темп.
Битмультфильмы v0.005 — по снимку просмотра «Ромбы 64»: «там кнопки вперёд-назад, плей-пауза» и «в центр экрана». В полосе просмотра GIF — «◀ назад», «⏸ пауза / ▶ плей», «вперёд ▶», ползунок и номер кадра; пробел, ← и → — то же с клавиатуры. GIF браузер на паузу не ставит и кадров не отдаёт, поэтому страница читает файл сама и раскладывает на кадры своим разбором GIF (палитры, прозрачность, чересстрочность, снос кадра), показывая их на холсте. Все кадры в памяти не держатся (у ромба 512 — ~330 МБ): снимок каждого 25-го, шаг назад собирается от ближайшего. Сверено со встроенным разбором Chromium на всех 17 GIF страницы — кадры совпадают до пикселя, и после шагов назад тоже. С диска (file://) браузер файл читать не даёт — там GIF просто крутится, без кнопок. Картинка (любая, не только GIF) стоит в центре экрана; крупная (×4) не срезается, а прокручивается.
Треугольник v0.033 — по снимку окна «🗻 3D»: «это в новом окне — возможность открывать». В шапке каждого раздела — ⧉: раздел переезжает в отдельное окно браузера живым (как «🗗 Панели в окно» в Layers) — ручки работают, рисует по-прежнему страница Треугольника; окно можно унести на другой монитор. 🗻 3D там растягивает холст на всё окно (дома — прежние 400×340). Вернуть — ↩ в шапке или закрыть окно: раздел встаёт туда, где был (в раскладку пишется это место, а не окно). Вкладка раздела, пока он в своём окне, поднимает окно, а не прячет раздел; ✕ возвращает и прячет. Место и размер окна у каждого раздела запоминаются; уходит страница — окна закрываются с ней. Проверено на сайте и с диска.
Сравнение v0.005 — «пусть сверху картинка и потом ниже таблица». В каждом наборе теперь сначала картина с выбором частей и рисунками, под ней — сводная таблица (вид × высота). Раньше таблица стояла первой, и до картины надо было листать.
Сравнение v0.006 — «пусть подгонит масштаб, если не влезает в окно картинка, и колёсиком мыши изменять масштаб там» и «создать гифы на каждый размер для фигур всех в один файл, можно рар или несколько»; следом — «нет, по порядку». Картина, которая не влезает в ширину набора или в 75% высоты окна, вписывается сама; колесо над ней — крупнее / мельче вокруг курсора, рядом — масштаб в процентах и «⤢ вписать». Щелчки по картине и подсветка мест масштаб учитывают. «🎞 GIF по размерам (.zip)» у каждого набора — по GIF на каждый вид и высоту (как строки сводки): кадры — все разные рисунки группы по порядку появления, как в файле, с подписью «◇ 5 стр. · 3/22 · ×53 · стр 1 бит 0»; скорость — 0,2…1,5 с на кадр. Все GIF и spisok.txt — одним .zip без сжатия: RAR браузер писать не умеет, .zip открывают и WinRAR, и Windows. GIF пишет тот же кодировщик, что в Треугольнике. Проверено на цепочке 200 строк: 33 GIF, каждый читается, кадров столько же, сколько в списке.
Layers v1.638 + Сравнение v0.007 + _js/figury.js (?v=5) + Треугольник v0.034 (только подпись модуля) — «так гиф
должна все кадры поочерёдно, а она просто взяла индивидуальные?» и по снимку меню цепочек: «тут нет мест? надо, чтобы там два
вида выгрузки было — только индивидуальные, и все поочерёдно»; «по умолчанию так сделай, как на скриншоте». У ◇ Ромбов в меню
цепочки три формата: «отчёт .txt», «таблица .tsv — разные» (строка на разный рисунок, как было) и «таблица .tsv — все места по
порядку» — строка на каждое место фигуры, сверху вниз и слева направо; «сколько» — всего раз у рисунка, «где» — это место.
Шапка такой таблицы несёт строку «# порядок: все места» (ZFIG.PLACES), parse() отдаёт places. Умолчания подвала — «до 256»,
«таблица .tsv — разные», 👁 включена. «Сравнение» такую таблицу для сводки и сравнения сводит к разным рисункам (сводки двух видов
одной цепочки совпадают), а «🎞 GIF по размерам» при «все места по порядку» даёт кадр на каждое место: «◇ 3 стр. · место 1/190 ·
рис. 1/2 ×91 · стр 1 бит 0»; у таблицы «разные» мест нет — там кадры по разным рисункам, о чём сказано в spisok.txt. Кодировщик
GIF пишет кадр за кадром и порциями по ~40 мс (мест бывают десятки тысяч; предел — 20 000 кадров на GIF), таблица LZW помечается
поколением вместо очистки на каждый кадр. Проверено на цепочке 40 строк: 169 разных, 1125 мест — сумма «сколько» у «разных»
та же, у каждого рисунка мест ровно «сколько»; 15 GIF, 1125 кадров, все читаются.
Layers v1.639 — «светлый фон нужен, вкл/выкл». Во вкладке «Вид», рядом с «💬 Подсказки», — ☀ Светлый фон. Интерфейс Layers тёмный насквозь: сотни цветов прописаны прямо в правилах, и наборы цветов полотна тоже тёмные, — поэтому не вторая палитра, а переворот яркости у всей страницы (invert + hue-rotate 180°): тёмное становится светлым, оттенки остаются — красная «1» остаётся красной, только темнее, белая становится чёрной, серый «0» — светло-серым, фон полотна — белым. Картинки переворачиваются обратно. Окна панелей (Панели, Маски, Результат, Черновик, Лог находок) светлеют вместе со страницей, новые открываются уже светлыми. Выбор хранится с настройками вида, сброс настроек возвращает тёмный. Проверено: закреплённые на экране элементы стоят на своих местах, после перезагрузки режим сохраняется.
Layers v1.640 — по снимку группы «Круг»: «Полуоборот — у этой кнопки должна быть как галка, запоминать последнее нажатие (как Круг)… Инв переименуй в ИнвКруг… если несколько строк выделено — нижняя выделенная делает полуоборот, а верхние — этот же её полуоборот своей длины, то есть больше сделают: строка в 2 раза уже сделает полный оборот» и «в другую сторону также». «◄ Инв / ► Инв» теперь «◄ ИнвКруг / ► ИнвКруг». Полуоборот — две кнопки, ◄ Полуоборот и ► Полуоборот, и запоминаются, как ◄/►Круг: подсвечена последняя, «🚀 Авто» повторяет полуобороты этой стороны. Правило: k — длина нижней выделенной строки, каждая выделенная делает k тактов ИнвКруга в свою сторону (у строки длины L это k mod 2L тактов): нижняя встаёт изнанкой, как раньше; на бит короче — изнанка и сдвиг на бит; вдвое короче — полный оборот, строка дома. Прыжок считается сразу, вместе с пометками «перевёрнут» и «новый». «Авто» перебирает до повтора набора: у строки 2L / НОД(k, 2L) прыжков, у набора — НОК (для 4/6/7/8 — 42). Проверено: на 120 случайных наборах разной длины, в обе стороны, прыжок совпадает с k честными тактами ИнвКруга — биты, флаги и пометки; «Авто» останавливается на полном цикле, строки возвращаются домой.
Layers v1.641 — «нужно такой же полуоборот для Круг сделать». Под «◄/► Круг» — ◄ ½ Круг / ► ½ Круг: полный оборот обычного Круга — L сдвигов, половина — L/2, поэтому k = половина длины нижней выделенной строки (у нечётной — с округлением вниз), и каждая выделенная строка сдвигается на k mod L бит без инверсии: вдвое короче нижней — полный оборот, стоит на месте. Прежний полуоборот, чтобы не путать, подписан ◄ ½ ИнвКруг / ► ½ ИнвКруг и стоит под «ИнвКругом». Оба запоминаются, как Круг, «Авто» повторяет их до повтора набора: у ½ Круга строка возвращается через L / НОД(k, L) прыжков. У одной строки нечётной длины два полуоборота — L−1 сдвиг, о чём и говорит сообщение. Проверено на 240 случайных наборах: ½ Круг и ½ ИнвКруг, в обе стороны, совпадают с k честными тактами — биты, флаги, пометки.
Layers v1.642 — по снимку группы «Круг»: «сделай им отдельную кнопку Шаг и Авто — которые при находке продолжают нажимать, а Шаг — это вручную». Внизу группы — ▶ Шаг (один раз нажимает запомненную, подсвеченную кнопку Круга: ◄/► Круг, ½ Круг, ИнвКруг, ½ ИнвКруг) и 🚀 Авто — тот же прогон, что у общей «🚀 Авто», но находка его не останавливает даже при включённом «🛑 Стоп»: захватывается как обычно, и прогон крутит дальше — до конца цикла вариантов или до повторного нажатия (на кнопке тогда «⏹ Стоп»). Итог прогона теперь говорит, сколько было находок, а не «совпадений не найдено». Проверено с подставной находкой на каждом пятом ходу: общая «Авто» встаёт на ходе 5 из 84, «Авто» Круга проходит все 84 (17 находок).
Layers v1.643 — «почему не включил следующую строку, нашёл же её паттерн» (у пользователя был выключен «🧲 Захват», но при разборе нашлась и настоящая ошибка). Число вариантов прогон считал один раз на старте, по исходному выделению (у строк 1–2 — 2 хода), и после захвата вставал на этом старом пределе, будто всё перебрано, — следующая строка не успевала найтись. Било по «🚀 Авто» Круга (оно на находке не стоит) и по общей «🚀 Авто» без «🛑 Стоп». Теперь, если захват поменял набор строк, цикл вариантов пересчитывается для нового набора и идёт заново с текущего положения. Проверено на шаблоне с «🧲 Захватом»: прежде «► Круг» вставал на «2 из 2» со строками 1–4, теперь выделение растёт дальше (за 8 с — до 1–22, ½ ИнвКруг — до 1–26). С «⏩ Турбо» тоже: за 6 с 6370 ходов против 485 без него, захват идёт, повторное нажатие останавливает.
Layers v1.644 — «но при Шаге должен работать автозахват, а при Круге он безразличен; Авто — сделай просто дублем старой версии» и «перемести поближе к Авто, третьей в ряду» (по снимку «🧲 Захват»). ▶ Шаг группы «Круг» нажимает запомненную кнопку Круга и захватывает находку, даже если «🧲 Захват» выключен (на время нажатия захват включается и сразу возвращается как был); сами кнопки Круга захватывают по галке, как всегда. 🚀 Авто группы «Круг» — теперь ровно общая «🚀 Авто»: тот же обработчик, при «🛑 Стоп» встаёт на находке; особый режим «не стоять на находке» из v1.642 снят. Галка 🧲 Захват переехала из «Поиска» (группа «Совпадение») в группу «Круг», третьей в ряд: «▶ Шаг · 🚀 Авто · 🧲 Захват». Проверено при выключенном захвате: «► Круг» выделение не трогает, «▶ Шаг» добавляет найденную строку, галка после него остаётся выключенной.
Layers v1.645 — «сейчас при находке не сбрасывает накрученные строки — надо кнопку: если вкл, то сбрасывает» (выбран вариант «вернуть биты»), «и счётчик пересчитать, потому что всё по новой», и по снимку «↺ Сброс» рядом с «🚀 Авто»: «последнее нажатие запоминать для Авто — то есть я про эту». Кнопка в разделе «Ход» рядом с «🚀 Авто» теперь ↺ Сброс при находке — переключатель (подсвечена — включено, запоминается с настройками); сброс цепочки к шаблону остался «↺ Сбросом» верхнего меню, копией которого она была. Если включено и находка захватывает строку, все уже накрученные строки (и та, что окно выбросит сверху) возвращаются к виду до начала кручения — биты, флаги «перевёрнут», пометка «новый», — найденная добавляется, и весь набор крутится заново, счётчик вариантов с нуля. Исходный вид (rotBase) снимается перед первым сдвигом строки в серии; серия кончается при ручной смене выделения, смене режима, сбросе; номера едут вместе со строками при достройке сверху. Работает в «Авто», на кнопках Круга и в «▶ Шаг». Проверено с подставной находкой: вручную (► Круг) и в «Авто» (► ИнвКруг) со сбросом строки возвращаются к исходному виду и счёт идёт с нуля, без сброса накрутка сохраняется; состояние кнопки переживает перезагрузку.
Layers v1.646 — по снимку «Вар: 110654/1441440»: «правильно считает общее количество? для 32 строки… полуоборот… 32 бита». С нижней строкой в 32 бита такого числа у полуоборота быть не может: строка короче 32 бит возвращается через нечётную часть своей длины (прыжков), 32-битная — через 2, так что в пределе двойка стоит не выше первой степени, а 1 441 440 = 2⁵·45 045 (это ½ ИнвКруг с нижней в 17 бит). В «Авто» полуоборот считался верно, и после захватов предел пересчитывался; неверным был ручной счётчик: после нажатий «½ Круг / ½ ИнвКруг» он считал такты Круга / ИнвКруга (2·НОК длин), а не прыжки, и расходился с «Авто» в k раз (строки 29–33: 9 493 440 вместо 287 680). Теперь и вручную одно нажатие — один ход, предел — halfTurnTotal, как в «Авто». Проверено: строки 28–32 — 1/188790, 2/188790…; 9–17 (½ ИнвКруг) — 1/1441440.
Layers v1.647 — «🧲 Подтянуть… удали её», «она выключена должна быть». Галка «🧲 Подтянуть» (найденный паттерн переезжал в колонке паттернов наверх, к первому ненайденному; с «🧲 Захватом» её путали — тот про выделение строк) снята из «Поиска», а само подтягивание выключено насовсем: st.pull = false и в умолчаниях, и при чтении галок, а старое сохранённое «вкл» больше не читается. Порядок паттернов теперь не меняется от находок.
Layers v1.648 — «лог лагает, не показывает после 13-й находки, хотя они только что были» и «также туда запиши, каким инструментом — Круг, Инв… — найдено, и компактнее всё». Запись в «Лог находок» делал только render(), а «Авто» (тем более с «⏩ Турбо») за кадр делает пачку ходов и рисует один раз: из нескольких находок пачки в лог попадала лишь последняя, а с «🧲 Захватом» без «🛑 Стоп» находки идут одна за другой. Теперь прогон пишет находку сам, на своём ходу (bgFindLogHit), render() её не повторяет. У записи — инструмент (st.lastDirMode): столбец «чем» — ◄/► Круг, «и» — ИнвКруг, «½» — полуоборот, полное имя в подсказке, по нему можно сортировать. Компактнее: в «стр» и «шаг» — голые числа, строки ниже, столбцы режимов уже (4,8em вместо 6,2em). Проверено: «Авто» ► ИнвКруг с «Турбо» и захватом — 20 захватов, 20 записей в логе (раньше большая часть терялась), у каждой «►и».
Layers v1.649 — «нужен анализ: кнопка, которая так же, как Авто, будет находить, но не захватывать, пока весь цикл не пройдёт, и запишет потом для каждой строки, в каком шаге нашлась и по какому поиску». В группе «Круг» — 🔬 Анализ: тот же прогон, что у «🚀 Авто», по запомненной кнопке Круга, весь цикл вариантов, но без захвата, без «🛑 Стоп», без «⚖ Стоп при балансе» и без записи в лог по ходу. На каждом ходу запоминается, какие строки нашлись — под выделением и все ниже (для этого на время анализа включён тот же обход строк ниже, что у «🔻 Полного прохода», только с полным списком поисков на строку), — и какими поисками. В конце, или при остановке повторным нажатием («⏹ Стоп анализа»), в «Лог находок» ложится запись на каждую пару «строка — шаг» (по строкам, внутри по шагам) с поисками по столбцам и инструментом в «чем», а сообщением — сводка: сколько строк, сколько находок, первые шаги по строкам. Цикл больше 10 млн вариантов анализ не начинает. Лог держит теперь до 2000 записей (было 200) и пересобирается, только когда изменился (раньше — на каждом кадре). Проверено на шаблоне: строки 4–6, ► ИнвКруг — 120 из 120, 8 строк, 370 находок, все 370 в логе, выделение не тронуто; остановка на полпути пишет найденное к тому моменту; обычная «🚀 Авто» после анализа работает как прежде. (За «полный цикл» строки не обязаны вернуться точно домой, если включено «⊙ На «1»»: Круг тогда прыгает до единицы — так и у «Авто».)
Layers v1.650 — по снимку «Подсветок»: «сюда нужна подсветка неизменных символов при реверсе КРАСНЫМ, и кнопку не менять неизменные для Круг — ИнвКруг» (выбран вариант «запомнить на старте»). В «Подсветках» — ⇄= со своим цветом (по умолчанию красный, --crk-hl): двойник «⇄🔎 Реверс: неподвижные» — жмёт её и повторяет её состояние; красит биты, которые не изменятся при развороте строки (палиндромные позиции). В «Круге» — 📌 Не менять неизменные (переключатель, запоминается): перед первым сдвигом строки в серии снимаются её подвижные позиции (бит ≠ зеркальному), и при ◄/► Круге, ИнвКруге, ½ Круге, ½ ИнвКруге палиндромные стоят на месте весь прогон, а по кругу едут только остальные, между собой (у ИнвКруга бит, прошедший их шов, переворачивается). Серия — как у «↺ Сброса при находке». Счётчик вариантов и полуобороты считают только подвижные биты. Проверено на 200 случайных наборах: неизменные не сдвигаются, прыжок ½ совпадает с шагами, за посчитанный цикл строки возвращаются домой; пример: 1011001 — подвижны 2-й и 4-й биты, три «► Круга» меняют их местами, «Вар: 3/4».
Сравнение v0.008 — «не применилась правка?» по GIF-кадру «4/8 · ×276» (оказалось — не обновлена страница). Чтобы такое было видно сразу: если в наборе есть таблица без мест («разные»), рядом с «🎞 GIF по размерам» пишется, в каком файле мест нет и что там кадры пойдут по разным рисункам (и как выгрузить все места), — и при загрузке, и в итоге сборки.
Layers v1.651 — «также Реверс — подключи к Авто, Шагу». В группе «Круг» — ⇄ Реверс как режим Круга: нажатие разворачивает выделенные строки (ничего не выделено — все) и запоминается, как ◄/► Круг; «▶ Шаг», «🚀 Авто» и «🔬 Анализ» повторяют разворот — с поиском, захватом, логом (в «чем» — «⇄») и счётчиком. Цикл — 2 хода (второй разворот возвращает строки; если все строки палиндромы — один). Пометки «перевёрнут» и «новый» разворачиваются вместе с битами. Предел вариантов для всех режимов Круга теперь считает одна функция (shiftModeTotal) — и в «Авто», и при ручных нажатиях, и при пересчёте после захвата. Старая «⇄ Реверс» в «Строках» — как была. Заодно «🔬 Анализ» на пустом выделении говорит «крутить нечего», а не «цикл больше 10 млн». Проверено: разворот и обратно «▶ Шагом» (1/2, 2/2), «Авто» — 2 из 2 и строки дома; с захватом — 7 находок, окно со строк 5–6 доехало до 12–13; анализ — 2 из 2.
Layers v1.652 — «добавь кнопку реверс+инверс: по кругу сначала реверс, потом инверс этой строки — цикл свой для каждой строки, и также с Авто» и «это убрать, оно есть уже в Зазеркалиусе» (по снимку «GF(2)» и «Лин. сложн.»). Рядом с «⇄ Реверсом» — ⇄🔁 Реверс+Инв, режим Круга: ход по очереди — разворот, инверсия, разворот, инверсия… Очередь у каждой строки своя (revInvPhase): захваченная посреди прогона начинает со своего разворота. Цикл строки — 4 хода (s → R·s → I·R·s → I·s → s), у строки, чей разворот равен её инверсии (1100, 110100…), — 2; у набора — 4 или 2. Запоминается, работает с «▶ Шагом», «🚀 Авто», «🔬 Анализом», захватом, логом («⇄и» в «чем») и «↺ Сбросом при находке» (сброс возвращает и очередь). Раздел «Анализ» (🧮 GF(2) с выбором операции и t, «Лин. сложн.») снят — есть в Зазеркалиусе; код остался. Проверено: 1011 → 1101 → 0010 → 0100 → 1011 (1/4…4/4); строка, вошедшая посреди, — с разворота; «Авто» с захватом — 4 из 4, 3 находки; анализ — 4 из 4.
Сравнение v0.001 (новая страница sravnenie/) + Хаб v0.032 — «мне как также потом сделать» (про сравнение ромбов Layers с таблицами Аниматрицы, которое сделано было скриптом). Страница без скриптов: файлы .tsv общего формата — в «Набор А» и «Набор Б» (по нескольку), «Сравнить». Фигура сравнивается по виду и рисунку; у шага 2 — ещё и подрешётками «чёт»/«нечёт» (иначе Треугольник с Layers на «½» не сравнить); галки — зеркальные одинаковы, с подрешётками, без однотонных (фигуры из одних 0 или 1 совпадают почти всегда и заслоняют остальное). Итог — сводка по видам и высотам «совпало из», таблица совпадений (крупные первыми, на экране 500, все — в «💾 совпадения .tsv»): как совпало (целиком / чёт / нечёт), где впервые в А и в Б, у скольких форм Б. Файлы читаются в странице, никуда не отправляются. В хабе — «Compare» в «Знаке и записях»; hub-link.js знает папку sravnenie.
Хаб v0.033 — «перенеси в черновики первым» (снимок кнопки «Код»). Code больше не главная кнопка хаба: он встал первым в «🔬 Черновики», перед Genezis; остальные черновики — как были, по порядку создания. Главными остались Triangle и Results; у Triangle, теперь первой, снят верхний отступ, который был нужен под Code.
Хаб v0.034 — «Zerkalius-genezis-webgl.html: сравни с Генезисом — по-моему, это мёртвая ветка, удали, если нет ничего эксклюзивного». Сравнение подтвердило: это старая копия Genezis (v0.330 против v0.427, на ~3600 строк короче). Все 123 её id есть в Genezis. WebGL-рендер (PIXI, «⚡ WebGL-рендер») в Genezis тоже есть и развит дальше. Её «свои» функции — остатки старой раскладки (вкладки правой панели, полоса кнопок плеера) или локальные имена. «◀ Turbo / Скор ▶» — в Genezis те же ползунки с теми же id, только кнопки значками. Ключи памяти браузера те же. Страница перенесена в archive\_retired\ (на этой машине папка заведена сейчас, с описанием ЧТО-ЗДЕСЬ.txt), кнопка «WebGL Engine» снята с хаба; прежние версии страницы — в archive\Zerkalius-genezis-webgl\.
Результаты v0.002 + Треугольник v0.027 — «Zerkalius · результаты: ссылки на переход с заготовкой и нажатым плеером Аниматрицы для каждого случая разобранного». У каждой карточки «Результатов» — «▶ в Треугольнике»: открывает Треугольник с заготовкой этого случая и уже запущенной Аниматрицей (плеер — целыми циклами, как сняты картинки). Заготовка передаётся адресом: ?n=строк, r=правило (90), s=сид (1), trim=0 — без обрезки фона, rh — ромбическая сетка с этим шагом, let=1 — буквы в ромбах, bands=1 — полосы периодов, axis=1 — ось симметрии, pass=0 — плеер по шагам. Треугольник читает адрес при запуске, строит треугольник, ставит свой стартовый вид и нужные галки, пишет в строке состояния, что это заготовка, и чистит адрес. Чтобы не затереть работу пользователя, пока страница открыта по ссылке, Треугольник не пишет в память ни состояние, ни строки: F5 возвращает обычный Треугольник. В выборе шага ромбической сетки добавлены 128, 256 и 512 — под крупные ромбы цикла 1024. Карточки сопоставлены по картинке: 1024 строки — весь цикл и семь размеров ромбов; 128 — цикл, лист, полосы периодов, разгон, родник, ромбы изнутри, зеркало; правила 30, 110, 150; без обрезки фона.
Треугольник v0.029 + Результаты v0.003 — вопрос про карточку «Ромб 512 · 3 в кадре»: GIF-ы «Все ромбы цикла» собраны переписью — в кадр шёл только ромб, какого ещё не было. Так работала кнопка 📦 в Треугольнике (с 35.74) и скрипт archive\_issledovanie-treugolnik-1024\tri_cycle.py. Пользователь: «структуру не ломаем волны! так можно только для сжатия, но когда записывать GIF или ещё что — надо нумерацию-повторения учитывать, а то получим рваную волну; но, возможно, так и надо — только уникальные собрать, поэтому этот вариант оставим, но чётко различим; добавь вариант со всеми кадрами». Сделано: кнопка 📦 переименована в «Уникальные ромбы цикла», в подписи кадра — «уникальный №i/всего разных», файлы …-unikalnye-…. Рядом новая «🎞 Все ромбы цикла подряд»: каждый ромб каждого прохода в порядке волны, повторы не выбрасываются; в подписи — проход, место ромба в кадре и №рисунка из того же словаря, «новый» или «повтор (впервые — проход q)»; файлы …-podryad-…. Картинка хранится по разу на рисунок, кадр — ссылка на номер. Кадров подряд — сколько влезет в ~120 МБ на размер, не больше 3000 (крупные ромбы — сотни проходов, мелкие — меньше прохода); когда предел набран у всех размеров, волна дальше не гонится. В «Результатах» раздел переименован в «Уникальные ромбы цикла» и помечен: словарь, а не ход волны. Сами GIF не пересняты.
Треугольник v0.035 — «поправь»: строка состояния заготовки из ссылки (v0.027) писала «Аниматрица запущена», даже когда в ссылке anim=0 и галка Аниматрицы снята. Замечено при проверке кнопок ромбов цикла в браузере. Теперь текст берётся из самой галки: «Аниматрица запущена, плеер целыми циклами / по шагам» или «Аниматрица выключена».
Zazerkalius v0.038 — «проверь» (адрес страницы). Страница не запускалась с v0.037: в zz-ui.js «SyntaxError: Unexpected end of input». Причина — моя правка v0.037 («+ Столбик» становится эталоном ⚑): комментарий // встал посреди строки обработчика и закомментировал её конец — say(…) и закрывающую «};». Комментарий перенесён в конец строки, zz-ui.js проходит проверку синтаксиса. Архив v037 тоже сломан, рабочие — v036 и v038. Урок: после правки JS — node --check на каждый изменённый файл, прежде чем отдавать версию.
Zazerkalius v0.039 — там же, при проверке: окно «🧊 Вид» стояло развёрнутым, но пустым. Оно было помечено свёрнутым (collapsed), а правило v0.026 «#w-view .wbody{display:flex}» — селектор по id — перебивало общее «.win.collapsed .wbody{display:none}»: тело свёрнутого окна оставалось на экране, а рисовать в свёрнутое окно renderView отказывается. Общему правилу дан !important — свёрнутый «Вид» снова свёрнут, двойной щелчок по заголовку разворачивает. Вторая половина той же беды: при разворачивании «Вид» не перерисовывался (пока был свёрнут, отрисовку пропускал) и стоял пустым до первой правки строк — теперь «–» и двойной щелчок сразу зовут renderView.
Zazerkalius v0.040 — «🧮 Лин. сложность: при смене выделения строки вживую бы обновлять сразу результаты». Окно теперь считает само при каждой отрисовке страницы — смена текущей строки (щелчок, стрелки, выбор в «Виде»), правка, новые строки, — а также при смене «текущая строка / все строки подряд» и при разворачивании окна. Свёрнутое окно не считает (длинная лента «все строки подряд» — Берлекэмп–Мэсси, квадрат от длины). Кнопка «🧮 Найти правило» осталась — пересчитать вручную.
Zazerkalius v0.041 — «давай» на предложение: собрать операции Зазеркалиуса в одно семейство и спросить у строки её самый короткий адрес в этом мире. Новое окно «🔎 Адрес»: перебор цепочек из 11 операций — как есть, зеркало, антизеркало, инверсия, разворот, повтор, Туэ–Морс, код 1→10/0→01, 🔺 Паскаль (k шагов), ▽ спуск (край), круг. Цена честная: номер операции 4 бита, числа — кодом Элиаса γ, сдвиг круга — ⌈log₂ N⌉, длина всей строки известна (размер файла). «Как есть» = 4 + N, поэтому у случайной строки адрес на 4 бита длиннее её — плата за мир. Перебор с отсечением по цене и памятью; каждый адрес собирается обратно и сверяется. Живой пересчёт — глубина 4 и 250 мс, «🔎 Искать глубже» — 6 и до 4 с; ответ по строке запоминается, чтобы глубокий не затирался живым. Проверено перебором вне страницы: Туэ–Морс 16 → 5 бит, палиндром 16 → 16 (4 + 12), «101»×6 → 14, строка Паскаля 16 (1…0…1) → «Паскаль(повтор)» 15, случайные 64 и 200 бит → «как есть» +4; все адреса собрались обратно.
Zazerkalius v0.042 — «прогнал: на 4 длиннее строки, структуры нет — всегда; давай искать структуру другими методами», и следом: «может, исходить из номеров ряда», «длина строки и её номер, как пишутся в битах — сравнить со строкой», «и ещё длина строки с такой же по Серпинскому». Новое окно «🧪 Структура»: разные способы записать строку и честная цена каждого в битах (+4 на номер способа, «как есть» = N + 4) — счёт единиц (перекос), серии, контекст (адаптивный код Кричевского — Трофимова, лучший порядок до 16), повторы кусков (LZ), почти-зеркало / антизеркало / период / Туэ–Морс с поправками (γ(k+1) + log₂ C(n, k) — сколько ошибок и где), линейное правило, адрес из «🔎», из номера и длины строки (двоичная запись номера и длины — нулями слева, по кругу, задом наперёд, Грей, номер XOR длина; строка Серпинского той же длины; Туэ–Морс со сдвигом на номер), из соседней строки (та же, инверсия, разворот, 🔺+1, ▽, сдвиги, +1, XOR двух выше). Внизу — строка бит в бит против каждого кандидата «из номера и длины»: совпавшие тускло, несовпавшие красным. Режим «все строки подряд» добавляет построчный способ: каждая строка — из номера, из соседней или как есть. Проверено вне страницы: случайные 64 бит — «как есть» лучший; строка Серпинского 40 — 9 бит вместо 45 (из длины, точно); двоичный номер 8 бит — 9 вместо 12; строка 200 бит с 10% единиц — 106; столбик Серпинского 64 строки — 442 бита вместо 2084; столбик из случайных — ничего. Живой пересчёт укладывается в ~0,1–0,2 с.
Zazerkalius v0.043 — «за край всей нижней границы — цепление для изменения размера» (по окну «🔎 Адрес», где текст не влезал). У каждого окна вдоль всего нижнего края — полоса 7 px: тянешь — меняется высота, при наведении подсвечивается линией. Угол справа внизу остался (ширина и высота сразу). Высота запоминается, соседи ниже подстраиваются, как после угла; у свёрнутых и вынесенных в отдельное окно полосы нет.
Zazerkalius v0.044 — «проверь или объясни» по снимку «📡 Сигнала по базе»: «Прочитано строк: 71 (все)», сообщение — каша с «?», «не решено 9». Не поломка: без выделения окно читало весь столбик, и строки треугольника (не сигнал) декодировались как сигнал — «?» там, где строка одинаково далека от базы и от отступа. Теперь без выделения читается последний отправленный сигнал, если его строки на месте (с того же места и той же длины); иначе — весь столбик, но с прямым предупреждением. И строки, далёкие и от базы, и от отступа (ближе, чем запас, нет ни к чему), считаются «не похожими на сигнал» — сколько их, пишется сверху.
Zazerkalius v0.045 — по снимку «Цикла и памяти»: «это тоже живое изменение, вообще всё живым надо сделать». Живыми стали и остальные окна-расчёты: 🔁 Цикл и память, 🧮 GF(2), 🧬 Лента (оси через стык или ядро децимации — в последнем выбранном кнопкой режиме), 🔎 Орбита, ⇅ Сортировка сдвигов. Считают сами при смене текущей строки, правке строк и смене своих настроек (операция, t, режим ленты, «кусками»), если окно открыто; свёрнутое не считает, развернул — досчитает. Чтобы любое действие не гоняло все расчёты, у каждого окна ключ — от чего оно зависит (строка, номер, настройки, для ленточных — весь столбик); не изменился — не считает (так же теперь и 🧮 Лин. сложность). Тяжёлое — по кнопке: GF(2) у строк длиннее 256 бит, сортировка сдвигов длиннее 4096. Живой ⇅ не трогает поле «№ для обратного хода» — его ставит только кнопка.
Zazerkalius v0.046 — «что если каждую строку в треугольнике считать кольцевой» → «да, сделай режим кольцом». В «△ Треугольник из строки» — режим «◯ кольцом от строки (цилиндр)»: следующая строка — XOR с соседом справа по кругу (то же правило, что «x ⊕ сосед справа» в «Цикле и памяти»), все N строк одной длины. Сообщение пишет вход μ и петлю λ и строку, на которой всё умерло в ноль. Перебором всех строк: длина — степень двойки (4, 8, 16) — любая за n шагов в ноль; нечётная — через шаг чистый цикл (7 → 7, 5 → 15, 9 → 63); смешанная (6, 12) — вход 2 / 4, потом цикл. Шаг теряет 1 бит (у следующей строки единиц всегда чётно), поворот проходит сквозь весь цилиндр.
Zazerkalius v0.047 — «△ Треугольник из строки: пусть строится от выделенной, поля рядом с кнопкой удали». Поля «строка или маска» и «строк N» убраны: строится от текущей (выделенной) строки, число строк — само: 🔺 Паскаль и маской — по длине строки, но не меньше 16; ▽ спуск — до одного бита; ◯ кольцом — пока строка не повторится (μ + λ + 1, не больше 256). Остались выбор режима и «△ Построить».
Zazerkalius v0.048 — «только я о конусе имел в виду: строка 111 как ни крути — 111, а 1000 — это 0100…» → «◯ конус — да, но его нужно видом сверху, кольца расходящиеся, и чтоб крутить можно было руками каждое». Новое окно «◯ Конус»: строка k — кольцо k от центра наружу (треугольник, свёрнутый в конус), бит — дуга кольца. Тянешь по кольцу — крутится только оно, отпустил — встаёт на целый бит; щелчок — строка текущая (обведена золотом). Жёлтая черта сверху — место бита 0 неповёрнутой строки. Поворот — только вид; «⤓ в строки» записывает повороты в строки (↩). «◯ к наименьшему» ставит каждое кольцо в наименьший вид (ожерелье) — одинаковые кольца встают одинаково; одинаковые обведены одним цветом. Внизу: в сколько положений встаёт текущее кольцо (у 111 — 1, у 1010 — 2, у 1000 — 4), его наименьший вид, строки с тем же кольцом, сколько разных колец в столбике. Ожерелье — zzNecklace в zz-core.js. Рисуется до 160 колец.
Zazerkalius v0.049 — «ок, масштаб там по колесику» (в «◯ Конусе»). Колесо — масштаб ×0,3…×60 вокруг курсора (точка под курсором остаётся на месте), тянешь мимо колец или с Ctrl — сдвиг вида, двойной щелчок мимо колец — как было. Масштаб пишется внизу окна.
Zazerkalius v0.050 — по снимку номеров «18 7 · 19 8·11…»: «выровняй номера и числа неменяющих — балансов также; и надо окно, где каждой строке вживую будет сопоставляться баланс, общий баланс до текущей строки по всем; также и по числу неменяющихся с общим; и также неменяющиеся лентой до текущей». Номер строки — в своей колонке (не уже 3 знаков, по правому краю), числа у номеров — колонками: левое число по правому краю, правое по левому, разделитель посередине, цифры одной ширины (tabular-nums) — столбик ровный при любых длинах. Новое окно «⚖ Балансы»: у каждой строки — 0:1 и перевес, те же нарастающим итогом от строки 0, неподвижные при развороте · меняющиеся и их итог, и «лентой» — неподвижные у строк 0…i, выписанных подряд и развёрнутых целиком. Текущая подсвечена и видна (прокрутка к ней), сверху — её итоги словами; щелчок по строке таблицы — она текущая. Лента — до 400 строк / 200 000 бит.
Zazerkalius v0.051 — по снимку «◯ Конуса»: «конус — супер; надо ещё чётче разграничить кольца, и выделять при наведении; цвета брать из поля строк, в том числе и символов; и если меняется там — то и здесь, и если крутить тут — то там». Кольца — с зазором (биты занимают 72 % кольца) и тонкой чертой между ними. Наведённое кольцо обводится, его строка в поле подсвечивается. Цвета — те же, что у бит в поле (--b1 / --b0, неподвижные красным при включённом «неподв.»); когда дуга крупная (приблизил колесом), рисуется и сам символ 0 / 1 шрифтом поля. Фон — как у поля. Поворот кольца теперь крутит саму строку: пока тянешь, строка в поле поворачивается на каждом целом бите, отпустил — записано, ↩ вернёт весь поворот разом. Правка строк в поле — кольца меняются сразу (как и было). Кнопки «↺ как в строках» и «⤓ в строки» сняты — поворот больше не только вид; «◯ к наименьшему» поворачивает сами строки.
Zazerkalius v0.052 — «при изменении текста всё дёргается, на многих меню так же» (по снимку текста под конусом). Живые тексты окон меняют число строк — при смене строки, при наведении (в конусе строка «под мышью» то появлялась, то пропадала), — и всё под ними прыгало: холст конуса сжимался и перерисовывался, таблицы и виды ехали вверх-вниз. Теперь у каждого текста окна высота запоминается наибольшей: растёт один раз и назад не сжимается; растянул окно (угол или нижний край) — меряется заново. В конусе строка «под мышью» есть всегда («наведи на кольцо…», когда мышь не над кольцом).
Zazerkalius v0.053 — по снимку «🧊 Вида» с кольцами-плоскостями: «когда выделена плоскость — с Ctrl и ещё кнопкой — сделай, чтобы по этой плоскости перпендикулярно вставать» и «стрелки сейчас вверх-вниз перпендикулярно — пусть лево-право». Ctrl + щелчок по кольцу — его плоскость выделена, и камера сразу встаёт перпендикулярно: смотрит прямо на плоскость (с той стороны, откуда уже смотрели), «вправо» экрана — ближайшая к прежнему ось мира в этой плоскости. Кнопка ⊥ под стрелками — то же для уже выделенной плоскости (потянул за кольцо). Стрелки при выделенной плоскости: ◀ ▶ — вращают в ней (вокруг её оси), ▲ ▼ — наклон поперёк (вокруг горизонтали экрана), выделение не снимается; прежде все четыре крутили вокруг оси.
Zazerkalius v0.054 — по снимку пустой шапки: «сюда — возможность закреплять кнопки для вывода вверх панелей». В шапке — 📌 (режим закрепления) и полоса закреплённых. В режиме щелчок по любой кнопке с именем кладёт её копию в шапку (копия жмёт оригинал, в том числе в вынесенном окне), щелчок по шапке окна — кнопку окна: разворачивает, поднимает наверх стопки, прокручивает к нему и на миг обводит золотом. Правый щелчок по закреплённой — открепить; выход из режима — 📌 или Esc; в режиме кнопки и шапки окон обведены пунктиром, сами не срабатывают и не таскаются. Набор (Z.pins) запоминается.
Zazerkalius v0.055 — по снимку «◯ Конуса»: «сюда галку, включённую по умолчанию, — запрет сдвига строк; и галку включения лучей к центру от граней бит — от каждого кольца выделенного или всех сразу». «Запрет сдвига строк» (включён сразу): кольца мышью не крутятся, строки в поле не меняются — тянешь, двигается весь вид, щелчок по кольцу — выбрать строку; «◯ к наименьшему» при запрете не работает и говорит, что снять. Выбор «без лучей / лучи от текущего кольца / лучи от всех колец»: от каждой границы бит кольца — луч к центру (у текущего ярче, у всех — бледно), видно, какие биты соседних колец лежат на одном луче.
Zazerkalius v0.056 — по снимку лесенки сверху: «кнопку сохранения вида до 3 пресетов; кнопку — включает линию, соединяет концы, с подсчётом пересечений об себя же; площадь прямоугольников, площадь описанного квадрата или круга». В «🧊 Виде» — ① ② ③: пустой щелчком запоминает вид (поворот, масштаб, сдвиг), занятый щелчком возвращает, правый щелчок перезаписывает, Shift + щелчок стирает; занятые подсвечены. «⟋ концы» (для одной строки, у лесенки): золотая пунктирная хорда от начала до конца, пересечения с лесенкой — красные точки (смена стороны хорды: знак x·Z − z·X), касания — кружки. Внизу площади: под лесенкой — сумма прямоугольников «шаг 1 × нулей до него» (число пар «0 раньше 1»), над ней — X·Z минус это; между лесенкой и хордой — ∫|z(x) − Z/X·x| dx и перевес стороны; описанные прямоугольник X·Z, квадрат max(X, Z)², круг π(X² + Z²)/4. Для хорды и пересечений в drawSegs добавлен слой поверх (cam.overlay).
Zazerkalius v0.057 — по снимку «◯ Конуса»: «выделение колец золотым цветом — непонятно, какой-то раздел кольца делает, путает». Золотая обводка текущего кольца — две окружности (по внутреннему и внешнему краю) — рисовалась одним контуром, и canvas соединял их отрезком справа, на угле 0: выглядело как черта поперёк кольца. Теперь каждая окружность — своим контуром, перемычки нет.
Zazerkalius v0.058 — «разложить — свернуть все окна» и (по снимку «🔴 неподв.») «сюда же реверс-инверс». «📐 Разложить» теперь раскладывает окна по местам и сворачивает все (кроме подсказок и вынесенных) — видны одни шапки; Shift + 📐 — разложить, не сворачивая. «неподв.» — три положения по кругу: выкл → 🔴 ⇄ неподвижные при развороте (бит = зеркальному, красным) → 🟢 ⇄🔁 неподвижные при реверс-инверсии (бит ≠ зеркальному — разворот с инверсией кладёт его на то же место, зелёным) → выкл. Режим действует в поле строк, в наложении полей, в конусе и в числах у номеров.
Zazerkalius v0.059 — «в левое меню» (по снимку шрифта и размера в шапке). Выбор шрифта цифр и ползунок размера перенесены из шапки в левую панель — раздел «Шрифт» перед «Шаблонами»; в режиме значков (◂) раздел скрыт. В шапке освободилось место под 📌 закреплённые кнопки.
Zazerkalius v0.060 — по снимку кнопок шапки окна: «сюда кнопку — на всю оставшуюся половину окна после поля строк, а все остальные под ним». В шапке каждого окна — ⛶: окно встаёт наверх стола во всю его ширину и видимую высоту (всё место справа от поля строк), свёрнутое — разворачивается, окно под полем строк — возвращается на стол; остальные окна — ниже (с «⤒ К верху» их укладывает раскладка, без него — сдвигаются на высоту окна). ⛶ у такого окна — золотая; ещё раз ⛶ — прежнее место и размер.
Zazerkalius v0.061 — по снимку кнопок над полем строк: «замок на изменение строк». 🔓 / 🔒 перед «неподв.»: пока закрыт, строки не меняются ничем. Сделано в одной точке: почти каждая правка начинается со snapshot() (точки отмены) — при закрытом замке он прерывает правку до изменения особой ошибкой ZZ_LOCK, которую общий обработчик ошибок глотает молча; правка на месте и ↩ проверяют замок сами. Попытка — сообщение внизу; у поля слева золотая черта. Смотреть, выделять, копировать, крутить виды, считать окна — можно. Замок запоминается.
Zazerkalius v0.062 — по снимку текста «🧊 Вида» (сверху, хорда, площади, описанные): «всё это в табличном виде по каждой строке». Новое живое окно «📐 Лесенки — таблица»: по строке — единиц и нулей, C(n,k) (сколько лесенок в ту же точку; длинное — коротко «1,23·10^30», наведи — полностью) и его чётность по Серпинскому (нечётно ⇔ X AND Z = 0), пересечения и касания хорды концов, площади под / над лесенкой, между лесенкой и хордой и перевес стороны, описанные прямоугольник, квадрат, круг. Сверху — итоги по всем строкам; текущая подсвечена и видна; щелчок по строке таблицы — она текущая. До 400 строк в таблице.
Zazerkalius v0.063 — по снимкам «1 поле · наложением · по центру» и поля ввода строки: «это — слева от поля ввода строки, а поле сузить». Выбор числа полей, колонками / наложением (с ⊕ и кнопками осей и итога, когда наложение) и выравнивание строк перенесены из верхней полосы поля в строку ввода, левее поля; поле ввода сужено (180–340 px), строка при нехватке места переносится.
Zazerkalius v0.064 — «да» на «проверю точно или добавлю в 🧪 Структуру способ „горы Дика“» (разговор о строке 0010010011011011 — симметричной неразложимой горе). Перебором всех 65 536 строк по 16 бит: баланс 8:8 — 12 870, горы Дика — 1430 (C₈), одна гора — 429 (C₇), симметричные — 70 (C(8,4)), симметричная одна гора — 35 (C(7,3)); сказанное «в уме» число 35 подтвердилось. В «🧪 Структуре» — способ «горы Дика»: узнаёт строку-хребет (0 вверх или 1 вверх, не ниже земли, в конце на земле), вид (одна гора или несколько, симметрична ли) и цену: 3 бита + log₂ числа таких гор. Для 0010010011011011 — 3 + log₂ 35 ≈ 8,1 → 9 бит (+4 на номер способа = 13) против 20 «как есть».
Zazerkalius v0.065 — «добавь кнопки: инверсия и реверс». В «Построениях» слева — 🔁 Инверсия (0 ↔ 1) и ⇄ Реверс (задом наперёд): над выделенными строками, ничего не выделено — над текущей; выделение остаётся, ↩ вернёт, замок 🔒 их держит. Попутно в «горах Дика» — «симметричные горы» вместо «симметричная горы».
Zazerkalius v0.066 — по снимку своего шаблона «Столбик · 70 стр.»: «при клике заменять текущие, а не достраивать вниз». Свой шаблон щелчком теперь заменяет: столбик — весь столбик, строка — текущую строку (↩ вернёт; замок 🔒 держит). Shift + щелчок — как раньше, вставить под текущей. Встроенные шаблоны — как были (вставляют под текущей).
Zazerkalius v0.067 — по снимку «📐 Разложить»: «не раскрывает окна… надо ещё кнопку Свернуть». 📐 Разложить снова раскладывает окна по местам и разворачивает все (как до v0.058). Рядом — ▭ Свернуть: сворачивает все окна на своих местах (кроме подсказок и вынесенных); если все уже свёрнуты — разворачивает все.
Zazerkalius v0.068 — по снимку «◯ Конуса» (⛶ горит, окно узкое): «эта кнопка — на всю ширину, оставшуюся после поля строк, а все остальные вверх или вниз». Ошибка v0.060: соседи уезжали ниже только без «⤒ К верху»; с ним раскладка сперва ужимала окно по соседям справа, а потом, видя его узким, оставляла соседей рядом. Теперь соседи всегда сначала уходят ниже окна, потом раскладка — окно на всю ширину стола, остальные под ним. Если окно уже помечено развёрнутым, но узкое, ⛶ не возвращает его, а разворачивает как надо.
Zazerkalius v0.069 — по снимку «🔁 Инверсия»: «* только неподвижных». Рядом — «🔁* Инв неподв.»: переворачивает только неподвижные биты (по режиму «неподв.»: выкл и 🔴 — при развороте, 🟢 — при реверс-инверсии), у выделенных строк или текущей, ↩ вернёт. Заметка: инверсия неподвижных при развороте даёт ровно реверс-инверсию строки (пара «a a» → «ā ā», пара «a ā» стоит), как «Инв меняющихся» даёт разворот.
Zazerkalius v0.070 — «меню: разложить треугольник на треугольники и ромбы по размерам». Новое живое окно «△ Разложить на ▲ ▼ ◇»: треугольник (строки с длиной +1 — решётка Паскаля; выделенные, иначе весь столбик; можно и не с вершины) режется размером S на полосы по S строк: ▲ вершиной вверх (сторона S), между ними ▼ вершиной вниз (сторона S−1), ромб ◇ — ▲ и ▼ под ним; все ◇ и нижний ряд ▲ — весь треугольник. Таблица по размерам 2…64 и степеням двойки: сколько ▲, ▼, ◇ и сколько разных рисунков / форм (зеркальные — одна форма); щелчок по размеру — галерея разных фигур этого размера (◇, ▲ или ▼ — выбор вверху), самые частые первыми, «×n». Геометрия — zzTiles / zzTileCensus в zz-core.js.
Zazerkalius v0.071 — по снимку треугольника в поле: «кнопку — треугольник в 90°», «подобрать межсимвольный». Над полем — ◸ 90°: межсимвольный интервал подбирается сам — шаг символа = 2 × шаг строк (ширина цифры меряется пробой шрифтом поля, шаг строк — по настоящей строке), тогда каждая следующая строка, сдвинутая по центру на полсимвола, уходит ровно на свою высоту: стороны под 45°, угол при вершине прямой. Слева тот же отступ, чтобы центр не съезжал. Пересчитывается при каждой отрисовке (шрифт, размер); в наложении полей не действует.
Zazerkalius v0.072 — «инверсия второй половины строки». В «Построениях» — «🔁½ Инв второй половины»: биты правой половины наоборот, левая на месте, у нечётной длины средний бит тоже на месте; у выделенных строк или текущей, ↩ вернёт. Палиндром чётной длины от этого становится антипалиндромом и обратно.
Zazerkalius v0.073 — «поправь» по снимку «Построений»: правый столбец кнопок уехал за край панели — длинные подписи новых кнопок распирали сетку. Колонки теперь не шире половины (minmax(0, 1fr)), длинная подпись обрезается многоточием (целиком — в подсказке); подписи укорочены: «🔁½ Инв ½», «🔁* Неподв.».
Zazerkalius v0.074 — «нет 90» (◸ 90° горит, треугольник прежний). Проверил в браузере: строка поля (.rw) — не блок, номер и биты стоят прямо в сетке поля, и её высота 0 — шаг строк мерился нулём, интервал выходил 0. Теперь шаг строк — расстояние между битами двух соседних строк. Попутно (v0.073) укорочены три подписи слева: «🔺+1 Строка», «🔢+1 Номер», «⇅ Вокруг тек.» — теперь все кнопки «Построений» целиком в панели.
Zazerkalius v0.075 — «убери выделения текста» (снимок: полоса кнопок «◯ Конуса» залита синим выделением). Кнопки, подписи, выборы, полосы инструментов, шапки окон и панелей, холсты, заголовки таблиц больше не выделяются как текст — ни щелчками, ни перетаскиванием рядом. Тексты-итоги окон, строки и поля ввода выделяются и копируются, как прежде. Попутно (v0.074): при включении ◸ 90° поле прокручивается к середине треугольника — на 70 строках он шире 2800 px.
Zazerkalius v0.076 — по снимку «◯ Конуса»: «галку — скрыть все, кроме выделенных; выделение нескольких — по Ctrl». Ctrl + щелчок по кольцу — выделить его / снять (Ctrl + перетаскивание, как прежде, двигает вид); выделение то же, что в поле строк (щелчок по номеру, Ctrl, Shift) — выделенные кольца обведены голубым, их строки выделены в поле, и обратно: выделил номера в поле — видно в конусе. Галка «только выделенные» скрывает остальные кольца (текущее видно всегда), лучи — тоже только у видимых. Кольца остаются на своих местах.
Zazerkalius v0.077 — «текст дёргает поле» (снимок: «70 стр. · 2485 бит · текущая 13 (14 бит) · против «Столбик · 70 стр.»: изменено 1 стр.» в две строки). Строка над полем меняла длину и переносилась, полоса над полем росла и сжималась — строки прыгали. Теперь она всегда в одну строку: не влезает — многоточие, целиком — во всплывающей подсказке.
Zazerkalius v0.078 — по снимку крупного кольца «◯ Конуса»: «как-то чётче границы внутри кольца и цвета ярче — сливаются». Заливка плотнее: у единиц и неподвижных — почти сплошная (и крупно, с символами — 80 %), у нулей — заметная; символ на единице — цветом фона, жирно (контраст), на нуле — своим цветом; между битами — тёмные черты, по краям кольца — контур.
Zazerkalius v0.079 — по снимку кольца с лучами: «лучи — то есть сектора закрасить полупрозрачно до центра своими цветами, можно градиент до центра» → «только когда одна выделена или несколько, но не все». Галка «сектора к центру»: у выделенных колец (Ctrl + щелчок; ничего не выделено — у текущего) каждый бит закрашивает свой клин от кольца до центра своим цветом (единица и неподвижный — плотнее, ноль — бледнее), к центру прозрачнее; кольца рисуются поверх.
Zazerkalius v0.080 — «теперь, когда видим кольца, нужен для них другой реверс — неменяемых; всё, что через центр, как-то должно реагировать». Зеркало кольца — ось через центр: на кольце начала нет, осей n, отражение m кладёт бит j на место (m − j) mod n (обычный ⇄ строки — m = n − 1). Выбор в «◯ Конусе»: без оси / лучшая ось (больше всего неподвижных) / как у строки / вручную ◀ ▶ (на полбита) / через центр 180° (пары диаметрально напротив). Для выделенных колец (или текущего): ось — золотой пунктирный диаметр, неподвижные при этом отражении — красным (при 180° — зелёным), пары бит через ось соединены хордами: золотом равные, серым разные. Внизу — неподвижных сколько и сколько даёт лучшая ось («кольцо зеркально само себе», если все). «⇄ по оси» — отразить строки по их оси (реверс кольца), при 180° — повернуть на полкруга; ↩ вернёт.
Zazerkalius v0.081 — наблюдение пользователя: «центр сектора бита через ось кольца выходит либо ровно между битов (01, 10, 11, 00), либо на какой-то бит» — так и есть: при чётной длине напротив бита бит, при нечётной (n = 2k + 1) — ровно граница между битами j+k и j+k+1; в конусе кольца чередуются. «Конечно!» — режим «через центр 180°» теперь работает и на нечётных кольцах: от центра каждого бита — прямая через центр в границу напротив, бит красится по паре напротив: зелёный — совпал с обоими, золотой — с одним, красный — ни с одним; внизу счёт трёх видов.
Zazerkalius v0.082 — «похоже, нужно будет поднять этот конус в высоту ещё, чтобы всё это разглядеть — нити, лучи». В «◯ Конусе» — галка «3D» и ползунок «высота» (0…4): кольцо i стоит на своей высоте, вершина сверху; камера — поворот вокруг оси конуса и наклон (90° — вид сверху, 0° — сбоку). Рисуется по глубине: сектора к центру своего кольца, биты дугами (те же цвета и неподвижные, что в плоском), потом нити — ось конуса, оси зеркал колец, хорды, лучи к центрам колец. Тянешь — вращать, Ctrl — сдвиг, колесо — масштаб, двойной щелчок — вид по умолчанию. Крутить кольца и выделять щелчком — в плоском виде.
Zazerkalius v0.083 — «похоже, луч, проходящий между битов, надо продолжать во внешнее кольцо!». В режиме «через центр 180°» у нечётного кольца луч от бита через центр, дойдя до границы напротив, продолжается пунктиром наружу — в следующее кольцо, и там точка цветом бита, в который попал (единица / ноль; фиолетовая — если снова ровно в границу). И в плоском виде, и в 3D (нить вниз, к внешнему кольцу). Внизу — сколько лучей ушло в единицы, в нули, в границы и сколько попало в такой же бит, как исходный.
Zazerkalius v0.084 — «надо сохранять положение, изменённое вручную, для каждого кольца». Ручная ось зеркала теперь у каждого кольца своя (Z.coneAxisOffs по номеру строки, сдвиг от оси строки ⇄ в полубитах) и запоминается: ◀ ▶ поворачивают оси выделенных колец (или текущего), не трогая остальные; правый щелчок по ◀ / ▶ — вернуть оси этих колец к оси строки. Кольца без своей оси берут общую, как раньше.
Zazerkalius v0.085 — «замок может… индивидуальный». Замок сдвига у каждого кольца свой: «🔒 кольца» запирает / отпирает выделенные кольца (или текущее), правый щелчок — снять свой замок (кольцо снова по общей галке «запрет сдвига строк»). Запертое кольцо теперь не стоит, а крутится мышью только на вид — строка не меняется, а положение запоминается у кольца (Z.coneRot, целыми битами); незапертое, как прежде, крутит саму строку. Сдвиг всего вида — мимо колец или с Ctrl. «◯ к наименьшему»: запертые — на вид, незапертые — сами строки. Внизу — заперто ли текущее кольцо, своим замком или общим, и на сколько повёрнуто на вид.
Zazerkalius v0.086 — по снимку кольца из одного бита: «у единицы не должно быть луча — только в центр, то, что уже есть: сектора, градиент». У кольца из одного бита больше не рисуются оси зеркала, хорды, луч «через центр» с продолжением наружу и лучи к центру (плоско и в 3D) — остаётся только сектор-градиент к центру.
Zazerkalius v0.087 — «похоже, границу внутреннюю и внешнюю кольца надо как-то различать, цветом». У каждого кольца внутренний край — голубой, внешний — оранжевый (прежде оба серые); у текущего кольца те же цвета, толще (прежде оба золотые). Попутно (v0.086) золотая метка начала — короткий штрих снаружи колец, а не черта от центра, которую принимали за луч.
Zazerkalius v0.088 — «справа сделай таблицу с номерами строк — замков, строк, как в поле строк; теперь его свернём, а это — на первое место, просто то будет дублем». В «◯ Конусе» справа от холста — строки столбика: номер, замок кольца (🔒 / 🔓; золотая рамка — свой замок), сама строка в цветах поля, «↻k» — кольцо повёрнуто на вид. Щелчок — текущая, Ctrl + щелчок — выделить (то же выделение, что в поле), щелчок по замку — запереть / отпереть это кольцо, правый — снова по общей галке. Текущая подсвечена, таблица держит её в виду; перерисовывается только при изменениях.
Zazerkalius v0.089 — по снимку кольца «11»: «есть лучи от центров бит, а есть от границ — от границ, похоже, не надо; оставь только границы на кольце, чтобы туда запускать лучи от бит других». Лучи («лучи от бит текущего / всех колец») теперь идут от центра каждого бита (середины дуги) к центру — и плоско, и в 3D; лучей от границ больше нет, границы — только черты на самом кольце, куда попадают лучи бит других колец.
Zazerkalius v0.090 — «граница — цветом, сами построятся», «где надо». Границы бит на кольцах красятся по тому, что разделяют: где биты разные — яркая черта (0→1 по часовой — сиреневая, 1→0 — бирюзовая), где одинаковые — тонкая бледная. Края серий видны сразу, и узор границ по кольцам проступает сам. В плоском виде и в 3D.
Zazerkalius v0.091 — по снимку узкого поля строк с конусом под ним: «строки перемести с их меню туда — справа от конуса, или просто конус дай располагать слева от поля строк». В шапке — «⇆ поле справа»: колонки меняются местами — окна (конус и остальные) слева, поле строк со своими кнопками справа; ещё раз — как было; запоминается. Разделитель тянется в ту же сторону, что поле (при поле справа — влево шире). Окно, прикреплённое под полем, остаётся под ним — его перетащить на сторону окон.
Zazerkalius v0.092 — по снимку таблицы у конуса: «это тогда не нужно — прямо на строках расположи, у номеров, перед номерами замки (значки)». Замок кольца теперь — значком перед номером строки в поле: 🔒 заперто, 🔓 открыто (бледно), золотая рамка — свой замок, «↻k» — кольцо повёрнуто на вид; щелчок — запереть / отпереть, правый — снова по общей галке. Таблица строк справа от конуса убрана, холст — снова на всю ширину окна.
Zazerkalius v0.093 — по снимку номеров строк: «тут шрифт и значки покрупнее, и выровняй всё, может, столбики — границы между ними тонкие». У номера строки — ровные столбики: замок | поворот ↻ | номер | неподвижные·меняющиеся | 0:1; между ними тонкие черты; шрифт 13 px (был 11), замок 14 px, числа 12 px. Столбик поворота есть всегда (пустой, если кольцо не повёрнуто) — чтобы столбики не съезжали. Попутно (v0.092): колонка номеров — всегда по содержимому.
Zazerkalius v0.094 — два снимка: «верхняя граница поля конуса — до конца, заголовок — внутрь поля» и «все остальные кнопки в левом режиме убрать под меню левое» (стопка свёрнутых шапок окон). Холст «◯ Конуса» теперь на всё окно, от верхнего края; шапка, строка кнопок и текст внизу лежат поверх него полупрозрачно. При «⇆ поле справа» свёрнутые окна не стоят на столе, а кнопками — в левой панели, раздел «Окна» под шаблонами; щелчок — окно разворачивается на стол; свернул («–», ▭) — снова в панель. Без «поле справа» — как прежде.
Zazerkalius v0.095 — по снимку развёрнутого «◯ Конуса»: «нет — не занимает по высоте и ширине». ⛶ ставил окно с отступами 12 px, а раскладка ещё сдвигала его на 12 px вниз. Теперь развёрнутое окно — вплотную: от левого и верхнего края стола во всю ширину и видимую высоту, без рамки и тени; раскладка держит его на самом верху, ширину не ужимает.
Zazerkalius v0.096 — «номера гуляют при выделениях» (снимок: у выделенных 55 и 63 весь ряд у номера сдвинут влево). Столбики чисел у номера были «по содержимому» и прижаты вправо: у выделенной строки цифры жирные, шире — и ряд уезжал. Теперь у каждого столбика постоянная ширина (замок, поворот, номер, два столбика чисел), ряд прижат влево — выделение ничего не сдвигает.
Zazerkalius v0.097 — «в 0-й строке не должно быть ничего, с 1-й строки вписываем биты». Строки теперь нумеруются для глаза с единицы: в поле строк (и у замков), в таблицах «⚖ Балансы» и «📐 Лесенки», на карточках «🧊 Вида», у строк сигнала, в текстах окон и сообщениях («текущая», «строка», «кольцо», списки одинаковых колец). Строка треугольника номер k — k бит. Внутри счёт по-прежнему с нуля — ничего не пересчитывается.
Zazerkalius v0.098 — «3D — это, конечно, нечто шедевральное», «поставь кнопку крутить вправо-влево — всю, потом, похоже, каждое по отдельности». В «◯ Конусе»: «весь: ⟲ ⟳» — крутить весь конус (плоский — вокруг центра, в 3D — вокруг оси): щелчок — 15°, держишь — крутится плавно; правый щелчок — к началу. «кольца: ◁ ▷» — выделенные кольца (или текущее) на бит против / по часовой: запертое — на вид (запоминается), открытое — сама строка (↩ вернёт).
Zazerkalius v0.099 — «Esc — снять выделение со строк всех». Esc снимал выделение и раньше, но только когда фокус не стоял на галке, выборе или кнопке — после щелчка в окне (например, в «◯ Конусе») клавиша пропускалась. Теперь Esc снимает выделение со всех строк и там (в поле строк и на кольцах сразу), из поля ввода — сперва уводит фокус; внизу пишется, сколько снято.
Zazerkalius v0.100 — «я всё понял — это пирамида!» и «3» — на «зеркало под основанием, как в знаке». В «◯ Конусе» — галка «⧗ зеркало вниз» (включает 3D): под последним кольцом, общим основанием, — та же пирамида вниз: кольцо i отражено через основание, биты инвертированы (0 ↔ 1) — как в «Октаэдре», знаке Zerkalius (пирамида и её зеркало под общим основанием). Основание — на середине картинки, ось конуса продолжается до нижней вершины; неподвижные при развороте красятся так же.
Zazerkalius v0.101 — по снимку отметок «↻1 ↻3 ↻4» у номеров: «как это снять — накрутку?». Щелчок по «↻k» у номера строки — снять накрутку этого кольца (при наведении отметка зачёркивается); в «◯ Конусе» — «↺ снять ↻»: у выделенных колец, ничего не выделено — у всех. Строки при этом не меняются — снимается только поворот «на вид».
Zazerkalius v0.102 — «как запустить кручение — пока что обычное, всех сразу» и «и видеозапись». В «◯ Конусе»: «▶ крутить» — весь конус крутится сам, без остановки (плоский — вокруг центра, 3D — вокруг оси), скорость — ползунок рядом (град/с, минус — в другую сторону), ещё раз — стоп; «⏺ видео» — запись самого холста конуса (без кнопок) в .webm, 30 кадров/с, на кнопке — время; ещё раз — стоп, файл скачивается. Общий recorder.js не взят: он склеивает все видимые холсты страницы, а здесь их несколько.
Zazerkalius v0.103 — «лампа Аладдина запущена» → «как её зажечь». В «◯ Конусе» — галка «✨ свет»: из центра расходится тёплое свечение, единицы и неподвижные биты светятся своим цветом (ореол), в 3D ближнее ярче дальнего. На тёмном фоне — ярче всего. Ореол тяжелее для отрисовки: на больших столбиках кручение может идти медленнее.
Zazerkalius v0.104 — «гит и это» — на «▶ крутить с выбором: всё целиком / каждое по биту / навстречу». Рядом с «▶ крутить» — выбор режима: всё целиком (весь конус одним углом, как было); каждое по биту (все кольца на одно число бит — маленькие вертятся быстрее, рисунок закручивается спиралью; скорость ползунка / 10 — бит в секунду); навстречу через одно (чётные по часовой, нечётные против, одинаковым углом). Поворот кольца на экране — его поворот «на вид» плюс кручение; строки не меняются. Правый щелчок по ▶ — всё на места. Пишется через ⏺ так же.
Zazerkalius v0.105 — «режим дзен». В «◯ Конусе» — «🧘 дзен»: только конус на весь экран (и во весь экран браузера) — шапка, левая панель, поле строк, остальные окна, кнопки и текст конуса спрятаны; кручение, свет, 3D, октаэдр — как настроены; мышь и колесо работают. Выйти — Esc (или выход из полноэкранного режима). Подсказка «Esc — выйти» внизу гаснет через три секунды.
Zazerkalius v0.106 — «по Esc не снимается выделение одной строки». Проверено в браузере: Esc выделение снимал, но у той же строки оставалась подсветка текущей строки (фиолетовая полоса и черта у номера) — она и выглядела как выделение. Теперь Esc гасит и её; щелчок по строкам или стрелки / PageUp / PageDown / Home / End возвращают подсветку.
Zazerkalius v0.107 — «у строк снялось, но в кольцах 3D осталось». Esc теперь гасит и золотую обводку текущего кольца в конусе — и в 3D, и в плоском виде; вернётся вместе с подсветкой текущей строки (щелчок по строкам или по кольцам, стрелки).
Zazerkalius v0.108 — «не снимается». Проверил на настройках пользователя: включено «только выделенные», выделения нет — конус показывал текущее кольцо с осью зеркала и хордами, и после Esc оно оставалось. Теперь кольца «в фокусе» — выделенные, без выделения — текущее, а после Esc — никакое: ось, хорды, сектора и лучи «текущего» снимаются, а «только выделенные» при пустом фокусе показывает все кольца. Щелчок по строкам или кольцам, стрелки — фокус на текущем снова.
Zazerkalius v0.109 — «пока это всё делай без меня» — на три предложенных, но не сделанных вещи. ⬡ Многоугольники (галка в «◯ Конусе»): строка из n бит — правильный n-угольник вместо кольца, бит — сторона, границы бит — вершины; конус становится ступенчатой пирамидой, в плоском виде и в 3D. Вершины лежат на прежней окружности, углы у бит те же, что у дуг, — поэтому лучи, оси, хорды, «луч во внешнее кольцо», кручение и попадание мышью считаются по-прежнему, меняется только расстояние от центра; строки из 1 и 2 бит остаются кругами. ▲ Пирамида Паскаля — новое окно: этажи-треугольники, клетка нового этажа — XOR трёх соседей этажом выше. От «1» — тетраэдр Серпинского (на этаже k единиц 3^m, m — единиц в двоичной записи k; окно это пишет); от текущей строки — строка ложится нижним краем верхнего этажа, и грань под ней растёт ровно как 🔺+1; от строк поля — столбик становится верхним этажом. Этаж хранится строками r = a + b, и правило в них — «сама клетка ⊕ 🔺+1 строки над ней»; поэтому каждая грань — обычный треугольник Паскаля по модулю 2. Вращение, масштаб, срез «до этажа» и «только он», «▶ расти», «⟳ крутить», «⤓ этаж в строки» (обратно — затравкой «от строк поля»). Больше 120 000 единиц не рисуется — этажей тогда меньше, и окно об этом пишет. ▭ поле строк (кнопка в шапке): поле строк с разделителем прячется, окна берут его место; строки живут дальше, кнопки слева работают. Запоминается.
Zazerkalius v0.110 — «почему так? может, надо крест и точку?» — на «строки из 1 и 2 бит остаются кругами». Кругами они остались потому, что многоугольнику нужно три вершины: у одного бита вершина одна, у двух бит обе «стороны» легли бы на один отрезок и два бита слились бы. Теперь при «⬡ многоугольниках» строка из 1 бита — точка (диск в центре, цветом бита), из 2 бит — крест: биты — две руки поперёк (каждая по середине своего бита, своим цветом, крупно — с символом), границы между ними — две руки вдоль, цветом границы (0→1 сиреневая, 1→0 бирюзовая, одинаковые — бледная). Крест крутится вместе с кольцом; в 3D и в «⧗ зеркале вниз» — так же. У треугольника Паскаля сверху теперь точка, крест вокруг неё, дальше треугольник, квадрат, пятиугольник.
Zazerkalius v0.111 — по снимку «всё равно круг, тут что-то не так; давай сделаем 2 бита двумя Г в разные стороны на одной плоскости — сверху будет крест» и «углами по центру». Точка была диском во всё нулевое кольцо — при масштабе выходил большой круг; теперь это маленькая точка в самом центре, рисуется поверх всего. Два бита — две Г углом в центре: у каждого бита руки идут на четверть и на три четверти его половины круга, под прямым углом, вторая Г — напротив; вместе — косой крест, в центре — точка. Граница между битами — короткая черта у края в щели между Г (0→1 сиреневая, 1→0 бирюзовая). Символ бита — внутри своей Г. В 3D и в «⧗ зеркале вниз» — так же.
Zazerkalius v0.112 — «под нижней строкой последней поставь линию-границу; если за неё вверх — пусть скрывает строки ниже неё, делая их бесцветными, и этих строк как будто нет». Под нижней строкой поля теперь черта-граница. Тянешь её вверх — строки ниже черты становятся серыми и уходят из счёта: окна, конус, кнопки, «+ Столбик», сохранение в .txt и строка внизу поля видят только строки над чертой («… · за границей N стр.»). Вниз — строки возвращаются на свои места; двойной щелчок по черте — вернуть все. Почему хранятся отдельно: в приложении больше полутора сотен мест читают строки поля напрямую — «как будто нет» надёжно выходит только так: спрятанные лежат своим хвостом у каждого поля, а поле — это только строки над чертой; поэтому всё прежнее их просто не видит. Черта одна на все поля (колонками и наложением): у каждого над ней остаётся не больше того же числа строк, хотя бы одна. Спрятанные строки не выбираются и не правятся. Перенос черты — правка: ↩ вернёт; замок строк её не держит — биты не меняются. Запоминается.
Zazerkalius v0.113 — по снимку конуса с «секторами к центру»: «из центра — посмотри, что за синие полосы идут». Это были швы, а не данные: каждый бит закрашивал свой клин отдельно, полупрозрачно, и на общей кромке двух соседних клиньев сглаживание каждого покрывает пиксель лишь наполовину — вместе выходит меньше, чем внутри клина, и сквозь кромку просвечивает фон. На кольце из сотен бит — сотни тонких светлых (на тёмном — синеватых) черт из центра, даже между двумя единицами. Замер на кольце из одних единиц: внутри клина 146, на каждой кромке 157. Теперь подряд идущие биты одного цвета закрашиваются одним клином — внутри него кромок нет вовсе (замер: ровно 146–147); черта остаётся только там, где цвет и правда меняется (0↔1, неподвижный бит). Так же в 3D и у многоугольников.
Zazerkalius v0.114 — «после нижней черты, которую ты сделал, в Конусе сделай как бы строку для заполнения из пустых ячеек по числу +1» и «одну из них заполни 1». Сразу под чертой-границей — строка пустых ячеек (пунктир): их на одну больше, чем бит в нижней строке над чертой, первая уже «1». Щелчок по ячейке — пусто → 1 → 0 → пусто. «+» у её номера — строка встаёт в поле под нижнюю (пустые ячейки — нулями), ↩ вернёт; под чертой — следующая, снова +1. В конусе она же — пунктирное кольцо снаружи всех колец (бит 0 сверху, как у всех), его ячейки щёлкаются так же; видна в плоском виде. Черновик запоминается; сменилась длина нижней строки — строка для заполнения начинается заново. Сразу в строки она не уходит, даже когда все ячейки заполнены: щелчок крутит ячейку через 1 и 0, и строка уходила бы на полпути; поэтому — «+».
Zazerkalius v0.115 — «надо сохр настройки и все биты в файл, чтобы на другом компе». В шапке — «💾 Всё» и «📂 Всё». «💾 Всё» скачивает файл zazerkalius-vse-ГГГГММДД-ЧЧММ.json: все четыре поля строк, строки за чертой, черновик строки для заполнения, свои шаблоны, окна и их места, конус, вид, тема — всё, что страница помнит. «📂 Всё» (или файл, перетащенный на страницу, — прежний 📂 его тоже узнаёт) спрашивает и заменяет всё разом. Почему так: всё состояние и так живёт в одном объекте (его же страница пишет в память браузера), поэтому файл — этот объект целиком, а открытие кладёт его в память и перезагружает страницу: разложить по полям и спискам сотню настроек вручную значило бы что-то забыть, а при перезагрузке их раскладывает тот же код, что всегда. Прежнее состояние перед открытием остаётся в памяти браузера отдельной копией — на случай не того файла. ↩ открытие не отменяет. 💾 рядом с полем строк по-прежнему пишет только столбик в .txt.
Zazerkalius v0.116 — «пусть с центра через все кольца в стороны проходит луч, который проходит между границами битов, и когда он дойдёт моментом хоть до нижней строки — то место, куда он упадёт, пометить 1; как часы, между зубьями; а так луч держится стенами колец; в 1 строке». В «◯ Конусе» — галка «⌖ луч-часы». Из центра через каждую границу строки 1 (у строки из одного бита граница одна — это стрелка) идёт золотой луч. Кольцо он проходит только в щель — там, где у кольца граница между битами; попал на бит — стоит у стены (красная черта поперёк). Прошёл все кольца над чертой — падает в кольцо для заполнения, и ячейка под ним становится «1» (в поле — тоже). Щель — четверть градуса. «Хоть моментом»: при кручении щели сходятся на миг, который легко проскакивает между кадрами, поэтому между кадрами положение пересчитывается мелкими шагами (сколько нужно, чтобы самое быстрое кольцо сдвигалось меньше щели), и пойманный миг показывается вспышкой луча. Что видно сразу: поворот кольца на целое число бит не меняет, где у него границы, поэтому стоящие кольца, «всё целиком» и «каждое по биту» пропускают луч только там, где границы общие у всех колец (у строк 1…9 бит — только сверху, в ячейку 1). Новые места даёт «навстречу через одно»: чётные и нечётные кольца едут друг против друга, и щели сходятся в других местах. Видно в плоском виде; в 3D кольца для заполнения нет, и луч не метит.
Zazerkalius v0.117 — «луч пожирнее и поярче, а пустая строка тоже должна крутиться». Луч-часы теперь широкий: золотое тело со свечением и светлая сердцевина поверх, у дошедшего до края — ещё шире и со светлой точкой на конце; стена — толще. Кольцо для заполнения крутится вместе со всеми — как следующее за нижним кольцо: «каждое по биту» — на тот же бит, «навстречу» — по своей чётности, «всё целиком» — вместе с конусом; щелчок по его ячейке попадает в ту, что под мышью, как бы оно ни стояло. Луч метит ячейку, которая под ним в этот миг. Что это меняет: в «каждом по биту» щели всех колец сходятся сверху на каждом целом бите, а кольцо для заполнения к этому мигу повёрнуто уже на следующую ячейку — луч, как стрелка часов, по тику метит ячейки одну за другой (в v0.116 он попадал только в первую).
Zazerkalius v0.118 — «как удалить нижнюю строку — пустую — и заново». У номера строки для заполнения, между «+» и номером, — «✕»: черновик стирается, строка снова пустая, в первой ячейке «1». В конусе то же — правый щелчок по её пунктирному кольцу. Строки поля не трогаются; ↩ стёртый черновик не возвращает — он не правка строк, а заготовка. Раньше начать заново можно было только сменой длины нижней строки.
Zazerkalius v0.119 — две просьбы подряд про луч-часы. «Сделай кнопку остановка по проходу лазера, пауза, потом вручную продолжить, и показывай цикл — сколько прошло кругов и сколько их всего». Рядом с «▶ крутить» — «⏸ на проходе»: как только лазер дошёл до края, кручение встаёт ровно в этом положении (луч виден проходящим), дальше — снова ▶. Проход — это миг, когда щели сошлись; пока они держатся вместе несколько шагов подряд, это один проход, а не десяток; после паузы тот же проход второй раз не останавливает. Рядом — счёт: «⟳ круг K из T · проходов лазера P». Круг — оборот стрелки (строки 1). В «каждом по биту» кольцо из n бит возвращается на место через n бит, все кольца вместе с кольцом для заполнения — через НОК их длин; у строк 1…9 и кольца из 10 ячеек это 2520 кругов. НОК считается в BigInt: у сотни разных длин он астрономический и пишется как «a,bc·10^k». Когда цикл пройден, внизу сообщение. В «навстречу» все кольца поворачиваются на один угол, поэтому цикл — 1 круг (360°). Правый щелчок по ▶ обнуляет и счёт. Фаза «навстречу» больше не обрезается каждые 100 оборотов, иначе сбивался счёт. «В 1 строке сделай 4 выреза для направления луча — там я вручную сначала его направлю». В кольце строки 1 — четыре выреза (↑ → ↓ ←), прорезью цветом фона, крутятся вместе с кольцом; выбранный — золотой. Щелчок по кольцу строки 1 при луч-часах выбирает ближайший вырез, и луч идёт только через него. Прежде луч шёл через границы строки 1, у строки из одного бита это был единственный путь вверх; теперь направление задаётся вручную.
Zazerkalius v0.120 — «дай возможность ось соединять вручную со следующим кольцом в щели, при этом крутя внутреннее кольцо, а не внешнее». При луч-часах кольцо строки 1 (с вырезами) тянется мышью само по себе и плавно, а остальные кольца стоят. Когда луч подходит к щели кольца 2 (границе его бит) ближе примерно 10 пикселей, кольцо защёлкивается, и луч встаёт ровно в щель; внизу пишется, куда он дальше: проходит все кольца или какое кольцо его держит. Короткий щелчок без движения, как раньше, выбирает вырез. Кнопки «⌖◁ ⌖▷» доворачивают строку 1 так, что луч встаёт в соседнюю щель кольца 2; правый щелчок по ним снимает довод. Почему плавно, а не битами: прежний поворот кольца мышью шёл целыми битами, а у строки из одного бита целый бит — это полный оборот, то есть луч никуда бы не сдвинулся. Поэтому у строки 1 теперь свой довод в градусах (Z.coneAimRot), он прибавляется к её повороту и вместе с кручением крутит и вырезы. Строки при этом не меняются.
Zazerkalius v0.121 — «убери из 1 строки 4 выреза, оставь один». Вырез в кольце строки 1 теперь один, золотой: там, где бит 0 строки 1 (сверху, пока кольцо не довёрнуто). Направление луча задаётся только доводом кольца — тянуть кольцо строки 1 мышью (защёлкивается в щелях кольца 2) или «⌖◁ ⌖▷»; короткий щелчок по нему вырез больше не выбирает, а подсказывает. Если до этого был выбран другой вырез (→ ↓ ←), при запуске он переводится в довод на 90°, 180° или 270° — луч остаётся там же, где был.
Zazerkalius v0.122 — «как сбрасывать накрученные биты, чтобы по умолчанию вернулось» → «нужна кнопка, которая сбрасывает биты всех строк». Сброс был в трёх местах: «↺ снять ↻» (накрутка «на вид»), правый щелчок по ▶ (кручение), правый щелчок по ⌖◁ ⌖▷ (довод строки 1). Теперь в «◯ Конусе» есть «⟲ всё на места»: разом у всех колец снимает накрутку, останавливает кручение и обнуляет его вместе со счётом кругов и проходов, снимает довод строки 1. Строки не трогает: если строку сдвигали открытым кольцом, это настоящая правка бит, и вернуть её может только ↩.
Zazerkalius v0.123 — «вернуть сами биты всех строк к начальному набору (1, 11, 101…)» — «это». В «Построениях», рядом с «🧹 Очистить», — «↺ Начальные»: рабочее поле снова тот столбик, с которого страница начинается (1, 11, 101, 1111, 10001, 110011, 1010101, 11111111, 100000001). Строки за чертой этого поля тоже убираются, иначе черта при перетаскивании вернула бы прежние под начальными. Другие поля не трогаются; ↩ вернёт прежние строки. Положение колец в конусе кнопка не меняет, для этого есть «⟲ всё на места».
Zazerkalius v0.124 — «чем задана ширина лазера и междубитья в кольцах?» → «да» на предложение сделать их одним числом. Раньше это были три разных числа: лазер рисовался толщиной 5–14 пикселей (22% шага колец), прорезь между битами — по 1,5 пикселя с каждой стороны, а в расчёте щель была четверть градуса, то есть меньше пикселя. Толстый луч мог лежать поверх стены и не проходить. Теперь в «◯ Конусе» рядом с «⌖ луч-часы» есть ползунок «щель» (градусов во всю ширину, 0,2…10, по умолчанию 2; двойной щелчок — 2°), и одно это число задаёт всё сразу: допуск в расчёте, прорезь между битами в кольцах (при луч-часах черты границ тонкие, чтобы щель была видна пустой), вырез в строке 1 и ширину лазера. Лазер — клин той же угловой ширины: у центра узкий, к краю шире, ровно как щели, которые тоже по углу. Кольцо он проходит, если его середина (светлая черта) в щели, то есть луч хотя бы наполовину в ней. У колец с мелкими битами щель не шире 0,9 бита, иначе в щель превратилось бы всё кольцо. Совсем узкий клин рисуется не тоньше 3 пикселей на конце, чтобы его было видно. Шаг расчёта между кадрами подстраивается под самую узкую щель.
Zazerkalius v0.125 — «сделай кнопку сохранения настроек и битов всех полей, чтобы при сбросе и Начальные — это применял, и когда файл загружен с другого компа — то тоже он становится умолчанием». В шапке — «⭐ Умолчание»: запоминает снимок всего состояния (биты всех полей со строками за чертой и строкой для заполнения, положения колец, настройки) — всё, кроме раскладки окон: она у каждого экрана своя. Горит, когда своё умолчание есть; правый щелчок — забыть. «↺ Начальные» теперь берёт из него биты всех полей (без него — встроенный столбик 1, 11, 101…), «⟲ всё на места» — положения колец, кручение, довод строки 1 и настройки конуса (луч-часы, щель, пауза на проходе, режим и скорость кручения, свет, многоугольники, сектора, 3D, лучи, зеркало, замки; без умолчания — нулевые положения, как было). Файл, открытый «📂 Всё», сам становится умолчанием — об этом спрашивает и подтверждение. ↩ после «↺ Начальные» возвращает прежние строки.
Zazerkalius v0.126 — «также надо зафиксировать: если луч, пройдя все между битами, пройдёт и между ячейками пустой строки — это будет выход луча и остановка кручения полная». Луч, прошедший все кольца, теперь проверяется и на кольце для заполнения: попал в границу его ячеек (в пределах той же щели с ползунка) — это выход. Ячейку он не метит, а уходит за край конуса: клин до края холста, зелёная сердцевина, зелёное кольцо-метка там, где вышел. Во время кручения выход всегда останавливает его полностью, даже без «⏸ на проходе», и записывается: счёт «🚪 выходов N» рядом со счётом кругов и журнал последних 50 выходов в состоянии страницы (фаза, круг, время; едет и в файл «💾 Всё»). Внизу — сообщение, на каком круге. Один выход засчитывается один раз; после остановки ▶ крутит дальше и тот же выход второй раз не ловит. Счёт выходов обнуляется там же, где счёт проходов. Что из этого следует сразу: в начальном положении щели всех колец и граница ячеек пустой строки сходятся сверху, так что без довода строки 1 луч стоит на выходе. В «каждом по биту» на каждом целом бите кольцо для заполнения тоже повёрнуто на целую ячейку, поэтому любой проход сверху — выход, и кручение встанет на первом же тике (в v0.117 такие проходы метили ячейки по очереди). Разные места дают довод строки 1 и «навстречу».
Zazerkalius v0.127 — «хотя не так: дострой до 256 строк после последней — пустые, можно еле заметными показать, но если луч пройдёт — помечать 1, если 2 и более раз — всё записать в бит, пусть там будет хоть три 111 в одном бите». Выход луча с полной остановкой (v0.126) убран. Вместо него при луч-часах за строкой для заполнения — пустые кольца до строки 256 (галка «▦ до 256», включена): еле заметные контур и черты ячеек, каждое кольцо на ячейку длиннее предыдущего, как строка для заполнения, и крутится по тем же правилам. Стен у них нет: луч, прошедший строки, идёт сквозь все пустые кольца до края и в каждом метит ячейку, через которую прошёл (попал в границу ячеек в пределах щели — прошёл между ними, ничего не метит). Счёт проходов: каждый проход луча прибавляет каждой ячейке на пути единицу, и она пишет «1», «11», «111»… (где влезает текст; закраска тем плотнее, чем больше проходов). В строке для заполнения — то же: «1» ставится, как раньше, а при 2+ проходах ячейка показывает «11», «111». Проход засчитывается один раз, пока щели держатся вместе; засчитывается и во время ▶, и когда луч довели до края вручную (мышью, ⌖◁ ⌖▷, ползунком щели); не засчитываются загрузка страницы, включение луч-часов и «⟲ всё на места». Счёт хранится у страницы (едет в «💾 Всё» и в ⭐ умолчание); сменилось число строк или длина нижней — начинается заново; «✕» у строки для заполнения стирает и его. Под конусом — сколько ячеек помечено, сколько проходов и самый большой счёт. Цена: колец становится 256, поэтому кольца строк тоньше — колесо мыши приближает; без луч-часов пустых колец нет. Цикл кругов по-прежнему считается по строкам и строке для заполнения — с пустыми кольцами НОК стал бы числом в сотню знаков.
Zazerkalius v0.128 — по снимку конуса (лазер виден сквозь всё, «ещё не запускал») — «понял; все пустые строки — 0, без 1 начальной». Лазер виден без запуска потому, что в начальном положении щели всех колец сходятся сверху, и луч проходит сразу. А «1» в первой ячейке строки для заполнения ставила сама страница (так просили в v0.114), и её легко принять за метку лазера. Теперь строка для заполнения начинается пустой: все ячейки пусты, при «+» — нули. Черновик, оставшийся от прежнего начала (ровно «1» и пусто), при первом запуске новой версии очищается один раз; черновик с другими отметками не трогается. «✕» тоже даёт всю строку пустой.
Zazerkalius v0.129 — «совсем не видно граней у пустых — сделай хотя бы у ближайшей более заметными, и после того как прошли через какое-то кольцо — ловить лазер следующим кольцом, его битами, и т. д.». Грани: пустые кольца теперь гаснут постепенно — ближнее (сразу за строкой для заполнения) ярко, с обоими краями и более толстыми чертами ячеек, дальше каждое бледнее (×0,88 на кольцо, не бледнее 0,12). Ловля: в v0.127 пустые кольца были без стен, и луч метил по ячейке в каждом. Теперь они тоже стены: луч, прошедший строки, идёт дальше только в щель между ячейками, а первое кольцо (начиная со строки для заполнения), где он попал в ячейку, его ловит — там луч и стоит, точка на конце, и эта ячейка получает единицу (1, 11, 111…). Прошёл щели всех пустых колец — уходит за край, ничего не метит (так в начальном положении: все щели сверху). Вспышка при кручении — тоже до поймавшего кольца. Под конусом пишется, какое кольцо и какая ячейка поймали луч.
Zazerkalius v0.130 — «не работает» (сразу после отправки v0.129 в git). Страница не запускалась вовсе: SyntaxError: Missing initializer in const declaration в zz-ui.js. Причина — правка v0.129: комментарий «// пойман пустым кольцом» лёг посреди объявления const rs = …, px = …, py = …, после px, и закомментировал его конец — px остался без значения, и весь файл перестал разбираться. Комментарий перенесён в конец строки. Урок тот же, что с */ в блочном комментарии: дописывая комментарий в середину длинной строки, смотреть, что стоит после него.
Zazerkalius v0.131 — «не идёт лазер дальше 2 строки, хотя проход есть», «так стена — это ячейка бита 3 строки», «там должен её покрасить и поставить 1», «смысл в том, что лазер красит все биты, на которые упадёт», «все ячейки изначально пустые». Краска: у колец строк появился свой слой краски, сначала пустой. Луч упёрся в бит (стена) — эта ячейка закрашивается золотом и получает «1»; упал на неё снова (ушёл и вернулся) — «11», «111»…, как у пустых колец (v0.127). Пока луч стоит на той же ячейке, это одно попадание; красит и когда тянут строку 1, и на каждом шаге ▶ кручения. Биты самих строк не меняются. Счёт лежит там же, где у пустых колец (Z.voidHits, ключ «кольцо:бит»), и «✕» у строки для заполнения стирает его вместе с ними. Проход: довод строки 1 (защёлка при перетаскивании, ⌖◁ ⌖▷) ставил луч ровно в середину щели кольца 2. После ▶ с паузой кольца стоят не на целых битах, и щель кольца 3 могла лежать чуть в стороне: щели перекрываются, проход есть, а середина луча уже мимо — стена. Теперь луч встаёт в середину общего прохода — пересечения щелей колец 2, 3, 4…, пока оно не пусто. Проверено перебором 2000 положений: дальше, чем раньше, — в 97, ближе — ни в одном.
Zazerkalius v0.132 — «что значит красить поверх? да там пустые ячейки строк чёрные, когда лазер попадает — 1 ставить». В v0.131 кольца строк при луч-часах по-прежнему показывали свои 0/1, а краска лазера ложилась поверх — отсюда и «поверх». Теперь, пока включены ⌖ луч-часы, ячейки колец строк пустые: все чёрные, без символов 0/1 и без цветных границ 0→1 / 1→0 (щели между ячейками видны как были). Ячейка, в которую упал лазер, закрашивается и получает «1» (снова упал — «11», «111»…). Биты строк в поле не трогаются; луч-часы выключены — кольца снова показывают строки.
Zazerkalius v0.133 — по снимку (одна строка «1», луч чуть правее верха упирается в строку для заполнения) — «не идёт дальше 2». Довод строки 1 — защёлка при перетаскивании, ⌖◁ ⌖▷ и середина общего прохода (v0.131) — искал щели только в кольцах строк, начиная с кольца строки 2. Когда строка одна, кольца строки 2 нет: следующее кольцо — строка для заполнения, за ней пустые. Защёлки не было, ⌖◁ ⌖▷ отвечали «кольца 2 нет», а рукой в щель шириной 2° не попасть — луч оказывался на ячейке строки для заполнения, и она его ловила. Теперь кольца для довода — все подряд, как их видит луч: строки, строка для заполнения, пустые до 256. С одной строкой: защёлка ставит луч в верхнюю щель (проходит всё), ⌖▷ — в нижнюю щель кольца 2, там его ловит кольцо 3.
Zazerkalius v0.134 — «тут надо лог вести: на каком проходе какая ячейка какой строки, и также переход сквозь щель», «нужна кнопка вперёд-назад для Плея, вручную, чтобы смотреть», «пусть лазер, когда светит на границу какого-то кольца, не в щель, подсвечивает её», «когда прошёл через щель, то в месте этом убери свечение на толщине кольца, чтобы видно было эту щель». 📜 Лог лазера — под текстом конуса (виден при луч-часах): всякий раз, когда конец луча сменился (упёрся в другую ячейку, пойман другим кольцом, ушёл за край), — запись: номер, угол луча, где он кончился и что стало в ячейке (1, 11…), и сквозь какие щели прошёл («2: 2|1» — строка 2, между ячейками 2 и 1; длинный путь — первые 10 и «ещё N»). До 1000 записей, новые сверху, ⧉ — скопировать, ✕ — очистить. Счёт единиц у пустых колец теперь тоже по смене конца луча, как у стен (раньше — только когда луч начинал проходить все строки, и ячейка, поймавшая луч сразу после другой пустой, оставалась без единицы). ◀ ▶| рядом с ▶ крутить — кручение тем же режимом (по биту / навстречу) до прошлого / следующего события лазера; каждый шаг в логе и в строке сообщений. Подсветка: луч упёрся — край этой ячейки светится красным во всю ширину; лёг ближе трёх ширин щели к щели — золотом светятся и края этой щели. Щели видно: на толщине колец, чьи щели луч прошёл (и выреза строки 1), золотой клин со свечением вырезан — остаётся тонкая сердцевина. Попутно: при пустой текущей строке окно «Орбита» зацикливалось (поиск кусков: indexOf("") никогда не даёт −1) и вешало страницу — пустой кусок теперь пропускается.
Zazerkalius v0.135 — «сделай паузу при клике на поле, а плей — только по кнопке; устрани дёргание кнопок, когда там что-то меняется, и сгруппируй их чётче по функциям» (по снимку панели конуса одной сплошной лентой). Пауза: щелчок по конусу или по полю строк, пока кольца крутятся, — пауза; дальше — только «▶ крутить». Дёргание: кнопки шли одним потоком с переносом, и всё, что меняло ширину — «▶ крутить» ↔ «⏸ стоп», часы записи на «⏺ видео», число у ползунка щели, строка «⟳ круг … · проходов лазера …» посреди кнопок, — переносило ряды. Теперь у этих кнопок постоянная ширина, а строка счёта кругов — отдельной строкой постоянной высоты под кнопками (длинная обрезается многоточием). Проверено: во время ▶, записи видео и после остановки все кнопки на тех же местах. Группы: ВИД (к наименьшему, одинаковые цветом, только выделенные, сектора, многоугольники, 3D, зеркало вниз, высота, свет, лучи) · КОЛЬЦА (запрет сдвига, замки, по биту ◁ ▷, ось и ⇄ по оси, снять ↻) · КРУЧЕНИЕ (весь ⟲ ⟳, режим, ▶ крутить, ◀ ▶|, скорость, всё на места) · ЛАЗЕР (луч-часы, до 256, щель, ⌖◁ ⌖▷, на проходе) · ЗАПИСЬ (видео, дзен) — каждая в рамке с подписью.
Zazerkalius v0.136 — по снимку строки для заполнения в поле — «тут, когда бит покрасил в строке, покажи остальные нулями, заполни». Лазер ставит «1» в ячейку строки для заполнения — остальные пустые ячейки этой строки сразу становятся 0: строка готова целиком (например, .... → 0010). Следующее попадание в ячейку с 0 делает её 1. «✕» — снова все пустые. Руками по ячейке — как было (пусто → 1 → 0 → пусто).
Zazerkalius v0.137 — по снимку ползунка скорости — «эта скорость непонятная: раздели — одна только скорость, а противоход задавать другой кнопкой, и слева-справа стрелки шаг». Ползунок шёл от −120 до 120, середина — стоп, левая половина — против часовой. Теперь ползунок — только величина (5…120), направление — кнопка «↻ по часовой / ↺ против» рядом с «▶ крутить» (постоянной ширины). Шаги ◀ ▶| стоят по бокам ползунка, одним блоком, и идут относительно выбранного направления: ▶| — туда, куда крутит ▶, ◀ — обратно. Сохранённая скорость со знаком читается как была: знак — направление, число — ползунок. При правке — та же ошибка, что уронила v0.129: комментарий, вписанный после запятой в середину объявления const d = …, key = …, съел key; поймано проверкой синтаксиса до отправки, комментарий — в конец строки.
Zazerkalius v0.138 — «в тот момент, когда первая ячейка строки покрасится битом, этот диск (кольцо) останавливай — то есть все внутренние не будут крутиться». Лазер впервые закрасил ячейку кольца (строки, строки для заполнения или пустого) — это кольцо и все внутри него встают на фазе этого мига; внешние крутятся дальше (режимы «по биту» и «навстречу»; «всё целиком» кольца друг относительно друга и так не сдвигает). Строка 1 — источник луча — крутится всегда: первый прогон, где встала и она, показал, что луч тогда упирается в только что закрашенную ячейку навсегда и всё замирает. В логе — «⏹ встали кольца 2–k». Остановленные снова крутятся после «✕» у строки для заполнения, «⟲ всё на места», правого щелчка по ▶ и смены строк. Заметно сразу: в начальном положении все щели сверху, и первая краска обычно падает далеко в пустые кольца (в прогоне с 4 строками — кольцо 164), так что встают сразу кольца 2–164, а дальше луч, крутясь, закрашивает ячейки остановленных колец: 1, 11, 111…
Zazerkalius v0.139 — «а в самом начале, когда лазер из центра идёт в 1 строку, то его положение относительно выхода из 1 кольца, где одна щель, установи в противоположной стороне, сам лазер пусть стоит неподвижно», «и направлен вверх», «то есть кольцо останавливается только в момент выхода лазера из него наружу», «и так все кольца пройдёт наружу». Лазер теперь неподвижный и всегда светит вверх (раньше луч шёл из выреза и крутился вместе со строкой 1). Вырез строки 1 в начале — внизу, напротив лазера, и крутится вместе с кольцом строки 1: выход открыт, только когда вырез проходит мимо лазера (в пределах щели), иначе луч упирается в строку 1 изнутри («стоп: стр 1» в логе). Тянешь строку 1 — вырез защёлкивается на лазере; ⌖▷ / ⌖◁ — крутят строку 1 по / против часовой, пока вырез не встанет на лазер, открыт — закрывают (вырез напротив). Остановка (вместо v0.138): кольцо встаёт в тот миг, когда луч вышел из него наружу — строка 1, когда вырез прошёл мимо лазера, дальше каждое кольцо, чью щель луч прошёл; краска остановки не вызывает. Так луч проходит кольца по одному наружу; вышел за край — «▶ крутить» сам встаёт на паузу: «⏹ Лазер вышел наружу — все кольца на его пути встали». Прогон «навстречу», 5 строк, до 256: 41 событие, кольца вставали пачками от 1 до 84 и луч ушёл за край. В режиме «по биту» на каждом целом бите щели всех колец сходятся вверху, поэтому там луч выходит наружу почти сразу, одной пачкой.
Zazerkalius v0.140 — по снимку лога (361 запись вида «№361 · 0° · за край · сквозь щели: 2: 1|2, 3: 2|3 … ещё 245») — «это всё записывай справа и компактнее». Текст конуса и лог лазера — колонкой справа поверх холста (не шире 380 px), от низа кнопок до низа окна; лог занимает всё, что осталось под текстом, мелким моноширинным шрифтом, строки через одну подкрашены. Запись — одной строкой: 39 ◎ 163п:2→1 ⏹120–162 ‖2–162 — номер; ▮ упёрся (строка:ячейка→что стало), ◎ пойман (п — пустым кольцом, з — строкой для заполнения), ↗ край, ■ закрыт (вырез строки 1 в стороне); ⏹ — встали кольца, ‖ — прошёл щели этих строк, номера диапазонами. Угла больше нет — лазер всегда вверх. Полная запись (с ячейками у каждой щели) — в подсказке при наведении и в копии ⧉.
Zazerkalius v0.141 — по снимку группы «ВИД» конуса — «нужна своя html для этого, с полем строк, вообще всё без других вкладок». Страница «◯ Конус» — zazerkalius\Zerkalius-konus.html, кнопка «Cone» в хабе (v0.037) рядом с Zazerkalius. Своего кода у неё нет: она ведёт на Zerkalius-zazerkalius.html?solo=cone, и Zazerkalius, видя ?solo=, показывает поле строк с левой панелью и одно окно — конус — во весь стол; остальные окна скрыты и не пересчитываются, кнопки про окна (📌, ⤒, 📐, ▭ Свернуть, 📖) и ⛶ ⧉ – у конуса спрятаны, окно не таскается. Память своя (ключ zazerkalius_solo_cone): при первом запуске строки и настройки берутся из Zazerkalius, дальше живут отдельно, и раскладку окон Zazerkalius страница не трогает. 💾 / 📂 Всё — тот же файл, переносится между обеими.
ПОЧЕМУ НЕ КОПИЯ СТРАНИЦЫ
Копия HTML с одним окном разошлась бы с Zazerkalius на первой же правке конуса, а zz-ui.js обращается к элементам всех окон — добавь в Zazerkalius новое окно, и копия без него упала бы при запуске. Один код с ключом в адресе всегда совпадает с Zazerkalius; тем же ключом отдельной страницей открывается и любое другое окно (?solo=pyr — пирамида и т.п.).
Zazerkalius v0.142 — по снимку текста конуса («Наведи на кольцо…», «Кольцо 4 заперто…», «Разных колец 9 на 9 строк»), стоявшего колонкой справа поверх конуса, — «это всё вообще под строки». На странице «◯ Конус» текст конуса и 📜 лог лазера теперь в поле строк, под самими строками (до 45% высоты поля, дальше прокрутка), а конус занимает весь стол. В Zazerkalius — как было, справа в окне конуса.
Zazerkalius v0.143 — «исправь дизайн: слишком черно, ничего не видно, режет» (страница «◯ Конус»). Режет: кнопки конуса лежали полупрозрачной плашкой поверх холста (так задумано в окне Zazerkalius, v0.094) и закрывали его верх и левый край. На странице конуса кнопки теперь сплошной полосой сверху, конус — под ними на всё оставшееся место, шапки окна нет (название — в шапке страницы). Черно: у страницы конуса своя тёмная палитра, светлее и контрастнее: фон #171b26 вместо почти чёрного #0b0d12, панели и рамки светлее, подписи #b0b9cc, нули на кольцах #8f99ae. Её читает и холст конуса. Светлая тема (☀) и Zazerkalius — без изменений.
Zazerkalius v0.144 — «кнопки слишком высокие, сделай компактнее» и по снимку номеров строк (🔒, ↻3, номер) — «тут слева отступ ненужный». Отступ: ячейка номера — сетка из пяти колонок: замок, ↻ накрутка, номер и две по 4.6em под счётчики «⇄ н·м» и «0·1». Счётчики выключены — а колонки под них оставались, и между номером и строкой зияло около 120 px пустоты. Теперь колонки счётчиков появляются, только когда счётчики включены (в Zazerkalius тоже). Кнопки конуса на странице «◯ Конус» — ниже и плотнее: шрифт 12 px, почти без внутренних отступов, галки и ползунки меньше, группы теснее; полоса кнопок заметно ниже, конусу больше места.
Zazerkalius v0.145 — после трёх переделок полосы кнопок конуса по словам и двух макетов («в общем, как дизайн страницы делается — может, макет сперва?», «это проблема постоянная — есть что-нибудь такое, конструктор какой?») — «сделай тогда сначала это: чисто поля настроим, просто прямоугольные, чтобы мог создавать я руками». Первый шаг режима раскладки, пока на странице «◯ Конус»: кнопка ▦ Раскладка в шапке кладёт поверх стола сетку, на ней рисуются поля-прямоугольники — тянешь по пустому месту — новое поле, тянешь поле — двигается, за край или угол — размер (шаг 8 px), двойной щелчок — имя, правый — цвет, Del — удалить, Esc или «✓ Готово» — выйти; «+ Поле» — новое посреди стола. Поля хранятся в долях стола (Z.lay) — на другом экране встанут так же — и едут в «💾 Всё». Пока это только разметка; следующий шаг — разложить по полям кнопки конуса. Неудачная попытка v0.145 «панели в четыре колонки» (на узком окне колонки не помещались и резались) в git не ушла — откачена до выбора макета.
Zazerkalius v0.146 — «все кнопки стандартизируй и дай мне перемещать». Стандарт: на странице «◯ Конус» каждая кнопка, список, ползунок и галка — одинаковая плашка высотой 24 px, шрифт 12 px, одна рамка и скругление; галка стала кнопкой-переключателем (включена — голубая рамка и фон). Перемещать: в «▦ Раскладке» каждую такую плашку (и подписи групп, и строку счёта кругов) можно утащить куда угодно, в том числе на свои поля. Первый вход в раскладку снимает их с полосы кнопок ровно там, где они стояли, — ничего не прыгает; дальше полоса кнопок пуста и спрятана, конус на весь стол, а кнопки живут на столе сами по себе (Z.lay.items, доли стола, едут в «💾 Всё»). Пока раскладка открыта, кнопки не нажимаются — только тянутся. Поля теперь видны и вне раскладки — цветными панелями под кнопками. «↺ Кнопки на место» (в раскладке) возвращает кнопки на полосу; поля остаются.
Zazerkalius v0.147 — «готово; затем в редактировании дай прикреплять к полям сразу кнопки и двигать вместе, и размеры кнопок выровняй по стандарту». Прилипание: в «▦ Раскладке» кнопка, брошенная центром на поле, прилипает к нему — поле под ней подсвечивается, у прилипшей рамка цвета поля, у имени поля — «📎 число кнопок». Тянешь поле — его кнопки едут вместе с ним; тянешь поле за край — кнопки стоят на месте. Брошенная мимо полей — отлипает. Удалил поле — его кнопки остаются на местах свободными. Прилипшая хранит сдвиг от угла поля в px, свободная — место в долях стола. Стандарт размеров: высота 24 px, ширина — кратна 32 px без зазора 4 px (28, 60, 92, 124…), подписи по центру; с шагом сетки 8 кнопки встают ровными рядами и колонками.
Zazerkalius v0.148 — по снимку подсказки над полем строк («№ — выделить · Del · Ctrl+C/V · двойной щелчок — править») — «эти все подсказки текстовые вообще не делаем на HTML, если не попрошу: они из-за текста двигают панели». Правило для всего сайта (записано и в правила проекта). Здесь убраны: подсказка над полем строк (осталась всплывающей у слова «Строки»), строка «Наведи на кольцо… / Под мышью — строка N» в тексте конуса, «(двойной щелчок мимо колец — как было)» у масштаба и полоса подсказки внизу «▦ Раскладки» (всё это есть во всплывающих подсказках кнопок).
Zazerkalius v0.149 — «проверь, там все кнопки съехали». Стандартная ширина v0.147 (кратна 32 px) сделала кнопки шире — «одинаковые — цветом» из 162 px стала 188 — а места у них остались прежние, и соседи в ряду наехали друг на друга. ⇶ Выровнять (в «▦ Раскладке»): кнопки каждого поля и свободные делятся на ряды по высоте, ряд встаёт на сетку 32 px, кнопки в ряду — слева направо, не ближе 4 px к соседу (с шириной 32k − 4 это ровно следующая клетка), порядок сохраняется. Раскладка, сделанная в v0.146–0.148, выравнивается так один раз сама при загрузке; кнопки, впервые снятые с полосы, сразу встают ровными рядами через 32 px. Кнопки теперь тянутся по сетке 32 px (поля — по-прежнему 8).
Zazerkalius v0.150 — по снимку раскладки после автоматического ⇶ (кнопки торчат из своих полей влево и вверх: «одинаковые — цветом» из «Поля 8», стрелки «по биту» из «Поля 5»). Выравнивание v0.149 ставило кнопки по сетке всего стола, и у поля, чей угол не на этой сетке, кнопка съезжала за его край. Теперь у каждого поля своя сетка — от его угла, 8 px слева и 24 px сверху (под имя поля): и ⇶, и перетаскивание ставят кнопку в клетку поля, над которым она, не левее и не выше его края, а если помещается — и не правее и не ниже; не влезла в ряд — на новую строку от левого края поля. Свободные кнопки — по сетке стола, как было. Попутно по правилу «видимых подсказок не делаем» с холста 3D конуса и пирамиды убрано «— тяни: вращать, Ctrl: сдвиг, колесо: масштаб, двойной щелчок: как было» (осталось «поворот · наклон · высота»). И — «поле 4 — это то, что удалить, и поле 7» (в «Поле 4» пользователь сложил подписи групп и «весь:», ненужные на столе): в раскладке Del у выбранной кнопки или подписи убирает её со стола; всё убранное возвращает «↺ Кнопки на место». Выбрано поле — Del удаляет поле, как раньше (его кнопки остаются на местах).
Zazerkalius v0.151 — по снимку раскладки — «верни как было всё» (выбрано: «страницу как до раскладки»). Код Zazerkalius и страницы «◯ Конус» — снова как в v0.144: полоса кнопок конуса сверху, компактная, режима «▦ Раскладка» (v0.145–v0.150: поля, свободные кнопки, прилипание, ⇶, Del) больше нет. Оставлено только то, что к раскладке не относится, — видимые подсказки убраны по правилу пользователя (v0.148, v0.150). Раскладка, которую пользователь расставил руками, была испорчена автоматическим выравниванием v0.149 (оно записало новые места поверх) — и вернуть её было нечем: копии не осталось. Урок: не менять сохранённое пользователем без его команды, а перед любой такой правкой — копия.
Zazerkalius v0.152 — «поправь отображение битов в конусе: раньше цвет символа в строках был фоном сектора в кольце, сектор — бит». С v0.078 сектор единицы заливался её цветом почти сплошь (80%), а сектор нуля — на 28%, и нули читались тусклыми полосками, а не цветом своего символа. Теперь каждый сектор — сплошь ровно тем цветом, каким его символ стоит в поле строк (у 0 и у 1; неподвижные — красным/зелёным, как в поле), а цифра поверх — тёмная, цветом фона. В 3D — так же. Касается и Zazerkalius, и страницы «◯ Конус».
Zazerkalius v0.153 — три просьбы подряд. (1) «В строках уменьши межстрочный отступ до 0.7 минимум, когда не все строки помещаются по высоте»: межстрочный поля строк — переменная --rlh (обычно 1.25); после каждой отрисовки и при изменении высоты поля оно меряется, и если строки не влезают, шаг сжимается ровно настолько, чтобы влезли, но не ниже 0.7 — дальше прокрутка. У ужатого поля колонка номеров (замок, поворот, номер, числа) держится в высоту строки и мельчает вместе с ней — иначе значок 🔒 не дал бы строке стать ниже. Проверено замером (fs 18, поле 554 px): 20 строк — 1.25 как было, 26 — 1.07, 30 — 0.90, 34 — 0.80, 60 — 0.70 и прокрутка. ◸ 90° пересчитывает межсимвольный от нового шага. (2) По снимку левой панели — «все кнопки по 2 в строку умести, сократи текст названий и добавь значки, где нет»: построения (⇉ Код тоже — режим 1→10 остался в подсказке), треугольник (список пополам с кнопкой, пункты короче: 🔺 Паскаль, ▽ Спуск, ◯ Кольцо, ▦ Маска, 〰 Лента — полные — в подсказках), шрифт и размер в один ряд, шаблоны по два (свои, с ⚑ и ✕, — во всю ширину); значки шаблонам без них: ⇉ Туэ–Морс, 🪞 Палиндр., 🔁 Антипал., 〰 0101…, ⚠ Сбой 011…, 🎲 Случ. 16. Ни одна подпись не обрезается при ширине панели 249 px. (3) По снимку полосы конуса — «этой группе кнопок задай свой цвет полупрозрачный»: группа «Кручение» — золотистым полупрозрачным фоном и рамкой, подпись группы — золотом.
Zazerkalius v0.154 — «div tools (полоса кнопок конуса) — убери фон»: у полосы кнопок конуса подложки больше нет ни на странице «◯ Конус» (была сплошная цветом панели, черта снизу осталась), ни в окне конуса Zazerkalius (была полупрозрачная поверх холста). Цветные группы (v0.153 «Кручение») теперь лежат прямо на фоне страницы.
Zazerkalius v0.155 — четыре снимка подряд. (1) Строка «⟳ круг 0 · цикл — 1 круг (360°), каждый круг все кольца на местах · проходов лазера 0» — «текст удали»: её на полосе конуса больше нет (сам счёт цикла работает, «⟳ Цикл пройден» — сообщением внизу, как было). (2) «🧘 дзен» — «наверх перед Сохр.»: кнопка в шапке, перед «💾 Всё». (3) Группа «Запись» с «⏺ видео» — «в одну квадратную кнопку внизу холста слева»: группы нет, ⏺ — квадрат 32 px в левом нижнем углу холста (в записи — ⏹, время — в подсказке; в дзене скрыта; на видео не попадает — пишется только холст). (4) «⎯ граница» у черты под строками — «убери надпись»: подписи нет, черта тянется как была; сколько строк за ней — в строке сведений поля. Попутно вопрос «одинаковые — цветом — работает или дубль?»: не дубль и работает — обводит одним цветом кольца, которые поворотом совпадают (одна длина, одно ожерелье), но только в плоском виде; в треугольнике все строки разной длины, совпадать нечему — поэтому галка ничего не показывает.
Zazerkalius v0.156 — (1) «в один размер все, минимальный который» (выбрано: левая панель): кнопки и списки левой панели — одной высоты по самой низкой, 24 px (как «+ Строка»; прежде построения, шаблоны и «△ Строить» были 26, списки 25), с одними отступами; ширина и так одна — пополам (113 px), уже только список шрифтов, у которого значок 🔤. Столбик значков (◂) — как был. (2) По снимку «70 стр. · 2485 бит · текущ…» — «эту надпись серым текстом в поле строк сверху влево»: сведения поля ушли из полосы «Строки» в само поле — над строками, слева, мелко и серым; полоса кнопок поля осталась как была.
Zazerkalius v0.157 — (1) «пауза и двойной щелчок — воспроизведение по полю»: щелчок по конусу — пауза (как с v0.135), двойной щелчок по конусу — ▶ крутить. Сброс вида (масштаб, сдвиг, в 3D — поворот и наклон), который прежде висел на двойном щелчке, — теперь Ctrl + двойной щелчок. (2) По снимку выделенного треугольника — «выделения символов поправь»: полоса выделения браузера — во всю высоту шрифта (у Roboto Mono ~1.32 кегля), а шаг строк 1.25, в ужатом поле (v0.153) до 0.7 — полупрозрачные полосы соседних строк налезали друг на друга ступенями. Ячейка бит теперь режет всё, что выше и ниже своей строки (overflow-y: clip, по горизонтали — нет), выделение идёт ровными полосами. (3) «В поле конуса кнопки управления для 3D»: в правом нижнем углу холста, только когда включено 3D, — ⟲ ⟳ поворот по 15°, ▲ ▼ наклон по 10° (0…90°, как мышью), − + масштаб к центру, ⌂ вид по умолчанию; держишь — повторяется; в дзене скрыты.
Zazerkalius v0.158 — (1) По снимку текста конуса и лога лазера — «это всё в отдельное окно с полным закрытием, плавающим везде, кнопку в верхнее меню»: текст и лог ушли из окна конуса (справа) и из-под строк (страница «◯ Конус») в своё окно 📝 Текст конуса и лог лазера — поверх всего, на обеих страницах; тянется за шапку (не уходит за край экрана), размер — за правый нижний угол, ✕ закрывает совсем, «📝 Текст» в шапке открывает и закрывает. Открыто ли, место и размер — запоминаются. В дзене скрыто. (2) По снимку кнопки ↩ — «и повтор — слева от всех кнопок»: ↪ Повторить (Ctrl+Y или Ctrl+Shift+Z) возвращает то, что отменил ↩; новая правка строк повторы стирает. ↩ и ↪ — первыми в шапке, сразу за названием.
Zazerkalius v0.159 — снова «div tools — убери фон» (снимок из инструментов разработчика). У самой полосы кнопок конуса фона нет с v0.154 — цвет под ней давала подложка всего окна конуса (цвет панели, #1f2533). На странице «◯ Конус» окно конуса — весь стол, его рамки не видно, поэтому подложка у него убрана: под кнопками — фон страницы. В Zazerkalius окно конуса — как было, с подложкой (оно окно среди окон).
Zazerkalius v0.160 — по снимку колонки у строк — «сначала номера, потом замки, потом кручение»: столбики у каждой строки теперь номер | замок 🔒/🔓 | поворот ↻k | счётчики (прежде замок | ↻ | номер). Так же у строки для заполнения (номер | + | ✕) и у строк за чертой; щелчки по замку и по ↻ — как были.
Zazerkalius v0.161 — по снимку списка кручения: «Всё / Каждое / Встреч Стр / Встреч Бит — так же, как Каждое, но через строку одно направление». Пункты переименованы (всё целиком → Всё, каждое по биту → Каждое, навстречу через одно → Встреч Стр) и добавлен Встреч Бит: каждое кольцо поворачивается на бит за шаг, как в «Каждое», но строки 2, 4, … — в обратную сторону. Всё, что зависит от шага по биту, у него как у «Каждое»: скорость (бит в секунду = скорость / 10), шаги ◀ ▶, лазер и остановка колец на его проходе, счёт цикла (кольцо из n бит на месте через n бит в любую сторону — цикл тот же, НОК длин). Проверено: при фазе 1.5 кольца 1–4 повёрнуты на −1.5, +1.5, −1.5, +1.5 бита (в «Каждое» — все −1.5).
Zazerkalius v0.162 — три снимка. (1) По клиньям «сектора к центру» — «в секторах пиши биты 0 и 1, к центру низом»: в каждом клине — его бит, повёрнутый низом к центру (верх — наружу, к кольцу), на 0.8 радиуса кольца; кегль — по ширине клина там (до 64 px), клин уже 5 px — без цифры. (2) По снимку плоского конуса — «вид сверху на все — пиши 1 и 0 на секторах, на гранях этих»: цифры на секторах колец были и раньше, но только с 8 px и в 0.8 ширины кольца — у колец уже ~10 px их не было. Теперь символ почти во всю ширину кольца (0.95) и с 5 px; повёрнут так же — низом к центру. Проверено подсчётом на холсте 317 px: при ×3 — 613 цифр (кегль 8 px). При луч-часах ячейки по-прежнему пустые — 1 ставит лазер. (3) По снимку «◯ Конус» в шапке — «клик — перезагрузка»: щелчок по названию страницы в шапке перезагружает страницу.
Zazerkalius v0.163 — по снимку текущей строки (подсвечены только биты, у номера и замка — фон) — «выделяй всё со значками». У столбика номера подложка непрозрачная (при прокрутке вбок он стоит на месте, и биты под ним не должны просвечивать), и у текущей строки она была цвета фона, у выделенной — полупрозрачной. Теперь у текущей — тот же сиреневый, что у бит, у выделенной — тот же бирюзовый, у строки под мышью — как у бит, всё непрозрачное: строка подсвечена целиком, с номером, замком, ↻ и счётчиками. После Esc (нет текущей) — снова фон.
Zazerkalius v0.164 — по снимку кнопок 3D на холсте — «сюда же «Всё на места» — значком, зелёным»: в свободной клетке внизу слева — зелёная ↺, то же, что «⟲ всё на места» у кручения (накрутка колец, кручение, счёт, довод строки 1). Панель теперь есть и в плоском виде — там на ней одна эта кнопка на том же месте, кнопки 3D спрятаны.
Zazerkalius v0.165 — по снимку группы «Кручение» — «это всё так же, как менюшка выше, в таком примерно стиле, но цвет другой»: панель кнопок у холста конуса — группой, как «Кручение» (полупрозрачный фон, рамка, скругление), но бирюзовая; кнопки на ней — сплошные, цвета панели. В плоском виде, где на панели одна зелёная ↺, рамки и фона нет.
Zazerkalius v0.166 — по снимку «Кручение · весь: ⟲ ⟳» — «крутить по длине 1 бита нижней строки или выделенной — нижней самой, если несколько»: ⟲ ⟳ поворачивают весь конус не на 15°, а на один бит (360° / длина) самой нижней из выделенных строк, а если ничего не выделено — нижней строки конуса; держишь — дальше тем же шагом (раз в 0.14 с, прежде — плавно по 2°). Внизу пишется, по какой строке шаг и сколько градусов. Правый щелчок — к 0°, как было. Проверено: без выделения, нижняя 34 бит — 10.59°; выделены 4 и 10 — по строке 10 (9 бит) — 40°.
Zazerkalius v0.167 — два снимка. (1) Сведения поля «70 стр. · 2485 бит · текущая 54» — «надпись вправо, над замками — центральный замок (общий)»: сведения прижаты вправо, а слева в той же полоске, ровно над столбиком замков у строк, — общий замок колец (галка «запрет сдвига строк» в «Кольцах»): 🔒 — все кольца без своего замка заперты, 🔓 — открыты; щелчок — как по галке. Место по горизонтали ставится по замку первой строки (колонки номера — в em и мельчают в ужатом поле). (2) Полоса «Строки» — «удалить пустоту и текст, и так всё понятно»: полосы больше нет, её кнопки (⇄ н·м, ◸ 90°, 0·1, 🔓, неподв.) — в конце полосы ввода строки.
Zazerkalius v0.168 — по снимку «◯ к наименьшему» — «рядом с кнопкой — Неподв.» (уточнено вопросом): кнопка «🔴 неподв.» (неподвижные биты в строках и на конусе, щелчок — по кругу) перенесена из полосы ввода строки в группу «Вид» у конуса, сразу за «◯ к наименьшему».
Zazerkalius v0.169 — по снимку «1 поле» и замка под ним — «замок общий — на место «1 поле», его — вправо»: общий замок колец (галка «запрет сдвига строк») — кнопкой первым в полосе ввода строки, на месте списка полей; «1 поле» — в конце той же полосы. Полоска над строками — теперь только сведения, серым, справа.
Zazerkalius v0.170 — по снимку поля «впиши или вставь строку из 0 и 1» — «удали это поле»: поля ввода строки больше нет. Строки по-прежнему вставляются Ctrl+V прямо в поле строк (проверено: две строки встали под текущей, ↩ убрал), грузятся 📂 из файла, правятся двойным щелчком по строке.
Zazerkalius v0.171 — по снимку светлых толстых полос прокрутки (поле строк, окно текста конуса) — «нормальные скролы: чёрные, тонкие»: на всей странице полосы прокрутки тонкие, ползунок — цвета линий (в тёмной теме тёмно-серый), дорожка прозрачная.
Zazerkalius v0.172 — по снимку полоски «70 стр. · 2485 бит · текущая 8» над строками — «текст ниже — пустое устранит»: у сведений больше нет своей полоски — они лежат поверх поля строк, в правом верхнем углу (над вершиной треугольника пусто), на полупрозрачной подложке, мышь проходит сквозь; строки начинаются сразу под полосой кнопок.
Zazerkalius v0.173 — на вопрос о правиле «биты на конусе ↔ строки» — «покажи бит, щелчок с Ctrl — смена бита». В плоском конусе бит под мышью обведён золотом, тот же бит подсвечен золотом в его строке в поле (Highlight API браузера — строки не перерисовываются), в подсказке холста — «строка k, бит m: 0/1». Ctrl + щелчок по сектору меняет этот бит 0 ↔ 1 в самой строке (↩ вернёт, замок строк не пускает). Бит определяется по углу с учётом поворота всего конуса и накрутки кольца. Прежний Ctrl + щелчок (выделить кольцо) — теперь Shift + щелчок; сброс вида (v0.157: Ctrl + двойной щелчок) — теперь Alt + двойной щелчок. Проверено: строка 5, бит 3 — рамка, в строке подсвечен тот самый 0; Ctrl + щелчок — 10000 → 10100, ↩ — снова 10000. И на вопрос «нужен ли второму замку свой значок» — «да»: замок на изменение строк теперь ✎ (открыт) / ⛔ (закрыт), не путается с общим замком колец 🔒/🔓.
Zazerkalius v0.174 — по снимку «снять ↻» и «⟲ всё на места» — «это всё одна кнопка — сброс на начальные биты… или нет, по-другому — цветом отличи»: кнопки остались разными, но «⟲ всё на места» — зелёная (как ↺ на панели у холста), «снять ↻» (только накрутка колец на вид) — бирюзовая.
Zazerkalius v0.175 — «пауза — не один, а двойной щелчок»: одиночный щелчок по конусу или по полю строк кручение больше не останавливает (так было с v0.135); двойной щелчок по конусу — и пуск, и пауза (с v0.157 он только запускал). С Ctrl, Alt, Shift двойной щелчок кручение не трогает. Проверено: двойной — ▶, одиночные по конусу и полю — крутится дальше, ещё двойной — пауза.
Zazerkalius v0.176 — «режим дзен с показом кнопок пульта, по колесику-щелчку вкл/выкл, масштаб, перемещение — всё мышкой» и «кнопками стрелки». В дзене виден пульт у холста (кнопки 3D и зелёная ↺). Щелчок колесом по конусу (не сдвигая мышь) — дзен вкл/выкл; тянуть с зажатым колесом — сдвиг вида, в плоском и в 3D, в дзене и без него. Колесо — масштаб, как было. В дзене стрелки двигают вид (с Shift — шагом вчетверо крупнее), + − — масштаб к центру. Проверено: щелчок колесом — дзен, пульт виден; ← — сдвиг на 40 px; + — ×1.2; перетаскивание колесом — сдвиг, дзен не выключился; ещё щелчок колесом — дзена нет.
Zazerkalius v0.177 — по снимку полосы групп конуса — «возможность перетаскивать каждую группу в любое место, с фоновым перекрытием всех ниже»: группу (Вид, Кольца, Кручение, Лазер) тянут за её подпись — она выходит из полосы и висит поверх холста на непрозрачной подложке (у «Кручения» — со своим золотистым оттенком), с тенью; последняя тронутая — сверху; за край стола не уходит. Двойной щелчок по подписи — обратно на полосу. Места запоминаются (Z.cgrpPos, едут и в «💾 Всё»); меняет их только перетаскивание — сами группы не выравниваются и не переставляются (урок v0.149–0.151). Проверено: «Кручение» утащено на холст — поверх, место запомнено; двойной щелчок — снова на полосе, место стёрто.
Zazerkalius v0.178 — по снимку окна «📝 Текст конуса и лог лазера» — «скролл, места много внизу»: текст конуса был ограничен 60% высоты окна и прокручивался при пустом низе. Теперь он занимает всё свободное место окна, а когда виден лог лазера — они делят окно пополам. Проверено: окно 300 px — текст 265 px из 273 без лога; с логом — 132 и 132.
Zazerkalius v0.179 — по снимку пульта у холста — «перемещаемым»: в пустой клетке пульта — ручка ⠿; за неё (или за фон между кнопками) пульт тянут куда угодно по холсту, за край не уходит; двойной щелчок по ручке — обратно в правый нижний угол. Место запоминается (Z.padPos), меняет его только перетаскивание. Проверено: утащен на 100 влево и 150 вверх — место запомнено; двойной щелчок — снова в углу.
Zazerkalius v0.180 — по снимку группы «Вид» (две строки, список лучей уехал вниз) — «пересобрать, дать значки, сократить текст»: ◯ к мин., 🔴 неподв., 🎨 одинак., 👁 выдел., ◔ сектора, ⬡ многоуг., 🧊 3D, ⧗ зеркало, ↕ (высота), ✨ свет, лучи — ✳ нет / ✳ выдел. / ✳ все. Полные названия — в подсказках (у «одинак.» и «к мин.» дописаны в начало подсказки). На широком экране группа — в одну строку.
Zazerkalius v0.181 — по снимку галок «Вида» — «все галки в кнопки»: все десять галок на полосе конуса (🎨 одинак., 👁 выдел., ◔ сектора, ⬡ многоуг., 🧊 3D, ⧗ зеркало, ✨ свет, запрет сдвига строк, ⌖ луч-часы, ▦ до 256) — кнопками-переключателями: сама галка спрятана, щелчок по кнопке переключает её, как раньше; включённая — как нажатая кнопка, с золотой рамкой (как у других кнопок-переключателей). Логика не менялась — только вид.
Zazerkalius v0.182 — «кнопка пресетов цветовой гаммы»: в шапке, перед ☀ — 🎨 гамма: щелчок — следующая, правый — предыдущая. Семь гамм: Исходная (как было), Янтарь, Океан, Лес, Роза, Огонь, Контраст. Гамма задаёт цвет единиц, нулей и акцент — ими красятся строки, конус и окна; у каждой свой набор для тёмной и светлой темы (переключение ☀ и смена темы системы — подхватывают). Выбор запоминается и едет в «💾 Всё». Проверено: «Океан» — единицы в строках и на конусе #38bdf8, нули приглушённо-синие; по кругу — снова «Исходная».
Zazerkalius v0.183 — по снимку группы «Вид» в одну длинную строку — «в каждой полоске подели длину пополам, расположи в 2 ряда, кнопки ровно друг под другом»: каждая группа конуса — сетка в два ряда: подпись группы слева на оба ряда, дальше столбцы (их — половина видимых кнопок группы, с округлением вверх); кнопки одного столбца — одной ширины, ровно одна под другой. Группа вдвое короче; не влезает в ширину стола — переносится целиком на следующую строку. Проверено замером: в «Виде» левые края кнопок верхнего и нижнего ряда совпадают, ширины в столбце равны.
Zazerkalius v0.184 и Хаб v0.038 — по снимку конуса-октаэдра в дзене — «на обои вместо — в index поставим?» (выбрано: вместо обоев, надпись оставить) и «старые обои — перенести в Обои». Живой фон хаба — теперь конус Zazerkalius: новый режим страницы ?solo=cone&bg=1 — только конус (3D, зеркало вниз, свет, высота ×2.6, наклон 12°), строки — Серпинский на 64, медленно крутится целиком; ни кнопок, ни подсказок, ни сообщений; память не читает и не пишет — настройки и строки страницы «◯ Конус» фон не трогает. Кадр ~20 мс — фоном не чаще 20 кадров в секунду. Надпись Zerkalius ⇄ Зеркалиус прежде рисовали обои — теперь её даёт сам хаб (#hubTitle, переливается, язык меняется, как раньше). Старые обои (Серпинский с дождём) — по кнопке «Обои» в хабе, как и были.
Zazerkalius v0.185, Битмультфильмы v0.006, Хаб v0.039 — «сохранил пресет — как его дальше, например в Мультфильмы? тебе прислать или скрипт сделаем?» (выбрано: живой конус). Файл «💾 Всё» нашёлся сам в «Загрузках». Пресеты конуса: папка zazerkalius/presety/, скрипт dobavit.py <файл.json> <имя> "Название" ["подпись"] кладёт пресет файлом <имя>.js (не .json — чтобы открывался и с диска) без лишнего (раскладка окон, места групп и пульта, свои шаблоны, копия умолчания — 96 КБ → 23 КБ) и дописывает его в spisok.js; --del <имя> — убрать. Страница конуса с ?solo=cone&preset=<имя> показывает пресет как фон хаба: только конус и кручение, память не читает и не пишет. В «Битмультфильмах» — раздел «Конусы — живые пресеты»: карточки строятся сами по списку, конус крутится в карточке, щелчок — на весь экран. Первый пресет — «Октаэдр · 70 строк» (встречное кручение по строкам, лазер, многоугольники, зеркало через центр). Попутно: в дзене на узком экране у конуса был отступ окна 8/16 px — убран. И «может, название не нужно? … мешает — лучше убери»: большой надписи Zerkalius над конусом в хабе больше нет.
Хаб v0.040 — по снимку кнопки «Код» в Черновиках — «сюда напиши Зеркалиус»: кнопка Zerkalius-code.html теперь Zerkalius / Зеркалиус (была Code / Код); язык меняется, как у остальных.
Хаб v0.041 и общий _js/hub-link.js — «oktaedr — лого на сайт, и на значок „в Хаб“ на всех; поменяй расположение кнопки хаб, как тут сделал». Знак Zerkalius (oktaedr/zerkalius-mark.svg, песочные часы в два цвета) стал значком вкладки у хаба и у всех страниц, где своего нет, и заменил ⌂ на значке «в Хаб». Сам значок перенесён из левого нижнего угла в шапку, перед заголовком страницы (#appTitle или первый h1), как в Zazerkalius v0.321. Если заголовка нет или он спрятан, значок стоит в левом верхнем углу. Правка одна, в общем модуле, поэтому страницы своих версий не меняли.
Общий _js/hub-link.js — «Zerkalius-treugolnik — поправь кнопку Хаба» и «кнопка хаба должна быть как в лого, но 3D, и крутящаяся, светящаяся». Значок «в Хаб» на всех страницах теперь не картинка, а знак Zerkalius объёмным октаэдром на тёмной плашке: верхняя пирамида голубая, нижняя золотая, пояс светлый, как в логотипе. Октаэдр медленно крутится вокруг оси, рёбра светятся, свечение дышит; ближние рёбра ярче дальних. Когда значок спрятан (дзен, фон хаба) или вкладка не видна, он не рисуется. Место прежнее — перед заголовком страницы (у Треугольника — в «Zerkalius Треугольник» над левой панелью); щелчок ведёт в Хаб и не перезагружает страницу.
Хаб v0.042 — по снимку кнопки «Зазеркалиус» — «под Треугольник, Битмультфильмы — в Записи, из Черновиков убрать Конус». Главные кнопки хаба теперь Треугольник и под ним Зазеркалиус (из Черновиков). «Битмультфильмы» переехали в «Знак и записи». Стрелки Треугольник → Битмультфильмы сняты: они вели к кнопке, которая уехала. «Конус» убран из Черновиков, но сама страница цела: ссылки из Битмультфильмов (?solo=cone&preset=…) работают.
Zazerkalius v0.538 — по снимку свёрнутой левой панели — «как-то криво стрелка меню лежит». Стрелка ▸ (#bPaneIcons) в столбике значков оставалась со сдвигом из развёрнутого вида, где она стоит в углу панели (right 12 px, top 8 px): с position: relative он сдвигал её на 12 px влево — за край — и на 8 px вниз. В столбике сдвиг снят: стрелка по центру, над 💾 (центры совпали, 18,5 px).
Zazerkalius v0.537 — «здесь заготовка тоже — выбираться вместо 90 и 30, чтобы при растяжении вниз она продолжалась». Список «📋 заготовка…» под чертой — четвёртый способ достройки рядом с 🔺 Серп 90 / 30 / маской: выбор заготовки, как прежде, заполняет поле, и она же становится способом достройки (Z.cutGen = "p:" + значение; «⤒ из-под черты» гаснет, либо-либо как у 90 / 30). Черта вниз достраивает строки по номеру — строка i та же, что дала бы заготовка с нынешним сидом и столбом (cutPresetRows: правила — с фоном за краем, как сама заготовка; последовательности — их продолжением). Выбранная заготовка остаётся в списке и горит золотом; 90 / 30 / маска — список снова «заготовка…». Проверено: R30 16→40, Паскаль 16→33, R18 8→20, Туэ — Морс 10→25 — строка в строку с заготовкой.
Zazerkalius v0.536 — по снимку свёрнутого «Звука» полоской в заголовке окна конуса — «скрылась за заголовком и никак не вытащить; пусть при двойном клике по заголовку группы она сворачивается и перемещается влево вверх поля». Причина: place() держал группу не выше верха окна (wb — само окно, его верх — верх заголовка), и группа могла встать под полосу заголовка, где её не схватить. Теперь верхняя граница — низ заголовка окна (wbTop; в дзене заголовка нет — верх окна); сохранённая выше — сама встаёт под него. Двойной щелчок по заголовку группы на окне конуса: свернулась — уезжает в левый верхний угол, свёрнутые — столбиком одна под другой, прежнюю высоту не держит (Z.cgrpMin = −1); развернул — обратно на своё место (Z.cgrpMinPos, и на поле строк тоже). В дзене и на левой панели — как прежде.
Zazerkalius v0.535 — «534 также» (прыгает и после v0.534). Замер из консоли пользователя (10 с при Аниматрице): ширина группы стоит (341), а у «весь:» основа переключается 3 ↔ 6 сторон, при 6 — «⟳» строкой ниже. Причина — cgbSnap (v0.339, подбор ширины «1 / 2 / 4 кнопки»; при Аниматрице — каждый кадр): подписи .glab2 и заголовку он ставил ширину кнопки (83 px) простым style.width, поверх своей; triTag видел чужую ширину и считал её заданной (round(83 / 2t) = 6), а пересчёт без cgbSnap — снова по тексту, 3. Теперь cgbSnap подписи и заголовки групп из треугольников (конус, левая панель) не трогает — их меряет только triTag. Проверено на экспорте: cgbSnap и triTag поочерёдно и 3 с Аниматрицы — «весь:» всегда 3, ⟳ в первом ряду. Урок: при v0.534 не воспроизвелось, потому что в проверке не было кадров Аниматрицы с cgbSnap — замер у пользователя из консоли нашёл за один заход.
Zazerkalius v0.534 — по двум снимкам «Кручения» (⟳ то в первом ряду, то строкой ниже) — «прыгают кнопки при Аниматрице включённой». У группы с заданным размером (ромб) tzJustify раскладывал ряды при заданной ширине, а под конец подрезал группу до самого длинного ряда (383 вместо 390); следующий пересчёт — их зовут перемены надписей и классов, при Аниматрице постоянно — начинал уже от другой ширины, и раскладка переключалась: «весь:» растягивался то на 3, то на 6 сторон, ⟳ переносился. Перебор ширин 330–426 px на экспорте пользователя: прежде на большинстве ширин два состояния (например 341 / 396), теперь группа ровно своего размера и пересчёт даёт одно и то же (12 подряд; с Аниматрицей и кручением 3 с — без перемен). Группы без заданного размера — как прежде.
Zazerkalius v0.533 — по снимку «Кручения» — «прыгают кнопки при Аниматрице включённой, и перенеси кнопки шагов, поставь по бокам от Крутить». По свежему экспорту: блок «◀ крутить ▶|» стоит после ползунка «бит/с» (перестановка ✎ пользователя), а «◀» рисовался стрелкой-шевроном в 29 px (значок ◀ — признак формы-стрелки, RH_TRI) и сливался с ползунком. Шаг назад теперь «|◀» — обычная полукнопка шириной с «▶|»: |◀ ▶ крутить ▶|. Прыжки при Аниматрице на экспорте не воспроизвелись (1366 и 1600 px, обычный вид и дзен, с кручением и без, первые секунды после загрузки) — ждут уточнения.
Zazerkalius v0.532 — первый шаг по слову «в процессе понемногу исправляй кнопки все под стандарт треугольников, сам смотри по дизайну» (только Zazerkalius). Кнопки в шапках всех окон (? ⛶ ↗ ⧉ – и свои, как «⇄ строки» у октаэдра) — цепочкой из треугольников, как верхнее меню: первая остриём, следующие выемкой на остриё соседки, вплотную (lpWin, вызывается следом за lpTop). Обводка — цветом прежней рамки (⛶ развёрнутого окна — золотом; при «▱» — цветом фона). Высота шапки прежняя (поля сверху и снизу 2 px вместо 4). Правила шапки сильнее общих (:is(.whead.lpt, #zzNo#zzNo)), иначе общие поля t + 2 обрезали значки.
Zazerkalius v0.531 — по снимку «Вида» — «поправь расположение и ширину ползунка, один слишком маленький». Ползунок высоты ↕ был нарисован в «△ Сетке» уже стандарта, и показывался крошечным (v0.523 подрезала только лишнее, а нехватку не добавляла). Теперь ползунок, нарисованный уже 12 сторон, показывается стандартным: столбцы дорисовываются справа (на чётное t), а кнопки правее в тех же рядах сдвигаются ровно на нехватку места (стоят с просветом — не двигаются). Рисунок не меняется; сдвиг учтён в виде «Сетки» (_tzcSh).
Zazerkalius v0.530 — по снимку ↩ ↪ — «сделай обе шире и одинаковой ширины, тут сделай пропуск между ними — ромб, стрелка влево, вправо». ↩ — стрелка влево (остриё слева, выемка справа), ↪ — вправо (выемка слева, остриё справа); стоят встык уголками, между ними ромб фона; обе шире ещё на ромб (data-tzw=2) и одной ширины. Кнопка заходит на соседку, только если у той справа остриё (выемка к выемке — встык); «📝 Текст» по-прежнему заходит на остриё ↪.
Zazerkalius v0.529 — по снимку «📌 ✦ Развёртка» — «дальше кнопки вогнутые (внутрь), и прижми кнопки, и так везде, чтоб не было пустот». Шапка — цепочка «остриё в выемку», как в группах конуса: у каждой кнопки справа остриё, у следующей слева выемка, и она заходит на соседку на t (прежде — выемка к выемке, ромбик фона между, и пары 📌 / ↩ ↪ стояли отдельно с промежутком). Цепочки по-прежнему делятся только надписью и распоркой. ↩ — первая в своей цепочке (остриё с обеих сторон), ↪ — стрелка вправо, как и все следующие. Перенеслась на новую строку — начинает её остриём. На 1600 px шапка входит в строку без уменьшения шрифта.
Zazerkalius v0.528 — по снимку 📌 в шапке — «тут у кнопки стрелки обе наружу сделай». 📌 (закрепить наверху) — шестигранник: остриё и слева, и справа (data-tzl / data-tzr, v0.527); стоит отдельно от закреплённых кнопок, с промежутком.
Zazerkalius v0.527 — по снимку ◂ у «Страница целиком» — «высота стрелки не как у кнопки: у кнопки обводка съедает высоту, у стрелки так же надо»; и по снимку стрелок шапки — «вправо стрелка — надо форму кнопки так же стрелкой вправо». ◂ (свернуть панель): светлая обводка шла по самому краю, и стрелка казалась выше заголовка; теперь край — тёмный, как у заголовка (та же заливка, те же 24 px), а светлая обводка — внутри, в 1,5 px от края (::before — обводка, ::after — сердцевина). Шапка: ↩ — кнопка-стрелка влево (остриё слева, выемка справа), ↪ — вправо (выемка слева, остриё справа); пара стоит отдельно от соседних кнопок (data-tzl / data-tzr в lpTop — свой край кнопки).
Zazerkalius v0.526 — по снимку стрелок шапки — «стрелки пошире на 1 ромб, правую сделай стрелкой вправо, а не как сейчас, и перемести их правее, перед кнопкой Текст». ↩ отменить и ↪ повторить (v0.158, были первыми в шапке) стоят теперь прямо перед «📝 Текст» и шире на ромб (data-tzw — сколько ромбов прибавить к ширине по надписи, lpTop). Повтор — та же стрелка ↩, отражённая вправо (прежний знак ↪ в шрифте выглядел не парой к ↩). Шапка на 1600 px по-прежнему в одну строку.
Zazerkalius v0.525 — «убери изначальную прозрачность в группах Конуса у кнопок». Кнопки, поля и галки, что не действуют в нынешнем режиме («Лазер» в 3D, ↔ без «⁑ авто» и т. п., v0.208 / v0.373), были прозрачными целиком (35 %) — сквозь них просвечивал конус. Теперь они непрозрачные — фон и обводка как у всех, а неактивность видна по бледной надписи. Проверено: 31 такой элемент — непрозрачные, других прозрачных в группах нет.
Zazerkalius v0.524 — по снимку шапки — «либо текст сократи, либо кнопки увеличь — не помещается». Ширина кнопки шапки считалась без выемок на стыках (они съедают место у надписи с обеих сторон) — надпись упиралась в края. Теперь кнопка — надпись, поля и выемки. Кнопки от этого шире, и на узком окне шапка может не влезть: тогда шрифт её кнопок мельче (до 10 px), а если и так тесно — поля у надписей уже. Проверено: 1600 px — 12 px и широкие поля; 1366 px — 10 px, узкие поля, вся шапка в окне, ни одна надпись не обрезана.
Zazerkalius v0.523 — по снимку «Вида» — «ширина кнопок — стандарт». Рисунок группы конструктора снимали, когда ряды растягивались до края, — кнопки в нём шире своих (у пользователя «👁 выдел.» — 141 px, список лучей — 147, ползунок — 231). Теперь кнопка, нарисованная шире стандартной (полкнопки 3 стороны, кнопка 6, двойная и ползунок 12, tzcStd), показывается стандартной: лишние столбцы справа не в счёт; рисунок не меняется. Заодно кнопка из разнесённых кусков — только левым: громкость «Звука» (клетки вперемешку с темпом) — снова полной длины. Проверено на настройках пользователя: в «Виде» и «Звуке» — 92 и 175 px.
Хаб v0.074 и Zazerkalius v0.522 — «не видно бегающего бита по треугольнику» и «убери выделение текста кнопок». Хаб, открытый файлом (file://), не может читать фон напрямую — страницы-файлы для браузера разные «адреса», и звучащие биты (zzSndHeads), по которым на треугольнике горит бит, до хаба не доходили (звук шёл — команды фону уходят сообщениями). Теперь фон сам шлёт хабу звучащие биты сообщением { zerkHeads } на каждом шаге. На компьютере треугольник был вполсилы целиком (с бегущим битом); теперь бледнее только его биты, бегущий — во всю яркость. Текст хаба больше не выделяется (щелчками по кнопкам выделялась надпись «Треугольник»). Проверено: «Ми» — за 2 с пришло 11 сообщений, жёлтый бит виден на треугольнике.
Хаб v0.073 — «убери включение по щелчку 7 нот; изначально пусть все неактивны, и только при нажатии начинает играть та, на которую нажал». Первый щелчок по хабу больше ничего не включает (v0.072 включал все семь). Нота включает и выключает только себя; кнопка меню просто ведёт дальше; щелчок по пустому месту — пауза / дальше, только когда что-то звучит (из тишины ничего не включает). Правый щелчок по пустому месту — сброс, как был (все семь с начала). Проверено: пустое место — ноты не горят; «Ми» — горит и звучит только она; пустое место — пауза.
Zazerkalius v0.521 — по снимку шапки — «сделай меню верхнее в стиле треугольников также». Кнопки шапки — из тех же треугольников (lpTop, вслед за левой панелью): стоящие рядом — одна цепочка, как ряд левой панели (по краям острия, на стыке выемка к выемке — ромбик фона): ↩ ↪ 📌 и закреплённые окна — одна, «📝 Текст … 📖 Подсказки» — другая. Длина — по надписи, поля 4 px (надпись заходит в острия — шапка не шире прежней). Обводка — цветом прежней рамки кнопки: включённые «⤒ К верху», «⇆ строки…» — золотом, «📝 Текст», «🎨 Гамма» — своим. Свои же правки шапки наблюдатель изменений не принимает за повод пересчитать (takeRecords) — без зацикливания.
Zazerkalius v0.520 — по снимку «Заготовок» — «выровняй все кнопки под стандарт ширин». Кнопки одного ряда левой панели — одной ширины: две в ряд — ровно пополам (121,8 px при панели 261), во всех разделах одинаково, одна — во всю ширину; ширина делится по самой ширине, а не по числу сторон (у кнопок края разные — остриё и выемка). Если какой-то надписи доля мала — как прежде, лишнее по стороне по кругу.
Zazerkalius v0.519 — по снимку «Страница целиком ▷ ‹» — «наверное, надо обводку стрелки сделать, чтобы по высоте с заголовком стала стрелка». Стрелка ◂ (свернуть панель) уже стояла вровень с заголовком и его высоты (24 px), но светлой заливкой без края казалась крупнее. Теперь она — как заголовок: та же тёмная заливка, по краю — светлая обводка (внутренняя стрелка на 1,5 px меньше); наведение — ярче. У свёрнутой панели — то же, стрелкой вправо.
Zazerkalius v0.518 — «при скрытии невозможно потом развернуть левое меню». Кнопка ◂ / ▸ (v0.516 — «стрелка» из треугольников, значок спрятан) в панели значками стоит в колонке, и пустая кнопка сжималась по высоте в 0 — развернуть было нечем. Теперь у неё высота ряда, не сжимается; проверено: свернул — стрелка вверху колонки значков, нажал — панель развернулась.
Zazerkalius v0.517 — по снимку списка заготовок и полосы под чертой — «эти заготовки перенеси под горизонт строк, вот сюда», и «здесь значки удали из заголовков». «📋 заготовка…» (из «Аниматрицы») с её «стр.» и «сид» — под чертой поля строк, за «Серп 90 / 30 / маска» (▦ 256 осталась в «Аниматрице»). Заголовки левой панели — без значков: «Страница целиком», «Треугольник из строки», «Нарезать треугольник», «Группы конуса»; свёрнутость, записанная под прежним текстом, переходит на новый. Ширина панели уже заголовков больше не записывается своей — это ширина по умолчанию (по заголовкам).
Zazerkalius v0.516 — по снимку узкой левой панели — «помести текст в минимальную ширину и сделай её по умолчанию; цвет серый слишком яркий для кнопок-заголовков, а у подкнопок наоборот слишком незаметно — выровняй дизайн», и по рисунку из «Сетки» — «эту кнопку сделай из треугольников». Ширина левой панели — не меньше той, в которую входит самый длинный заголовок раздела целиком (lpMinW: текст, поля, значок, у первого — место под ◂), она же по умолчанию (прежде 250 px); тянуть уже нельзя, сохранённая уже — поднимается. У первого заголовка снято старое поле в 44 px под ◂ (место уже вычтено из ширины). Заголовки — тусклее (13 % акцента на фоне панели), кнопки — заметнее (16 % акцента на своём фоне, светлая надпись). ◂ (свернуть панель) — «стрелка влево» из четырёх треугольников, у свёрнутой — вправо; ▾ / ▸ у заголовков — равносторонние треугольники ▽ / ▷.
Zazerkalius v0.515 — по двум рисункам из «Сетки» — «боковое меню сделай так: для заголовков — 2-й рисунок, для 2 кнопок в ряд — 1-й», и «убери пустоту по вертикали, выровняй кнопки по ширине с краями заголовка». Заголовок раздела — шестигранник во всю ширину (острия с обеих сторон). В ряду кнопок края ряда — остриём, на стыке у обеих кнопок выемки: кнопки касаются уголками, между ними ромбик фона; ряд из одной кнопки — шестигранник во всю ширину. Ряды теперь раскладываются по расчётной ширине (прежде — как ляжет перенос, и после растяжки кнопки перескакивали в другой ряд, края путались, в «Нарезать» ✂ и ▲ раздувались); поле «16» стоит в ряду своей шириной. Ряд дотягивается до края заголовка точно: остаток меньше стороны треугольника отдаётся кнопке дробной долей. «Заготовки» больше не растягиваются на всю свободную высоту (пустота до «Окон» ушла), их кнопки снова в общем виде (обёртки .tpl растворены — проверка видимости их отбрасывала).
Хаб v0.072 и Zazerkalius v0.514 — «индекс: убери блокировку кнопок, и при любом нажатии запускай все ноты сразу, и в комп. версии не видно треугольника почему-то». Замок меню (v0.055 — притушено и не нажимается, пока не загорятся все семь нот) снят: меню живое сразу. Первое нажатие где угодно — по пустому месту, по ноте или по кнопке меню — включает все семь нот разом: фон (Zazerkalius) на включение и на щелчок из тишины теперь включает все семь головок, а не До и Ре; нота при первом нажатии не переключается сама. Серпинский из ромбов прежде был только на сенсорном узком экране; теперь и на компьютере — один, по центру во всю высоту, фоном за нотами и меню, приглушённо; звучащие биты горят цветом своих нот. Проверено: щелчок по пустому месту и по «Ми» — горят все семь; на телефоне хаб как был.
Zazerkalius v0.513 — «посмотри мобильную версию» (проверено на 375 × 812 с настройками пользователя). Окно конуса на телефоне схлопывалось до 60 px: холст лежит в нём поверх (absolute), а группы — по своим настольным местам; теперь на узком экране (≤ 760 px) холст сверху квадратом во всю ширину окна, группы под ним стопкой своим ходом. Ширина группы, заданная ромбом на большом экране, на телефоне — не больше ширины окна (tzSzW: и обычные группы, и группы конструктора — «Звук» раскладывал рисунок под 681 px и обрезался). Блоки шире экрана («🎵 музыка × щель …» в «Лазере», 381 px) переносятся внутри себя. Шапка — в несколько строк (уходила вправо за край). Ручка ширины левой панели на телефоне спрятана (вылезала на 3 px). Полоса над строками по-прежнему одной строкой с прокруткой вбок — так решено в v0.217. Страница больше не шире экрана.
Zazerkalius v0.512 — по снимку «Аниматрицы» — «дёргается ширина при нажатии некоторых кнопок». Ширина группы шла по самому длинному ряду, а кнопки, которые показывают и прячут поля (▮ Столб — «8» и «0»), меняли самый длинный ряд — и с ним ширину всей группы. Теперь у группы с размером, заданным ромбом, ряды дотягиваются до самого размера, и ширина от показанного почти не зависит: «Аниматрица» (375) — 369 px и с полями, и без. Группа без заданного размера — по-прежнему по самому длинному ряду.
Zazerkalius v0.511 — по снимку «Кручения» — «тут прыгают все кнопки при смещении ползунка, и перемести кнопку Крутить между стрелками шагов, и последняя нажатая шаг задаёт вращение направление, и кнопка Против — лишняя»; по снимкам левой панели — «не работает скрытие, тут кнопка наложилась, сделай фон менее заметным». Блок шага теперь ◀ ▶ крутить ▶| (один неразрывный блок, .cunit — сохранённая перестановка «Встреч Стр» перед «крутить» встаёт перед ним), ползунок скорости — следом. ◀ ставит направление кручения против часовой и шагает, ▶| — по часовой и шагает; горит стрелка нынешнего направления. «↻ по часовой / ↺ против» скрыта (пульт ↻ работает через неё). Раскладка «Кручения» проверена с включёнными фоновыми пересчётами при движении ползунка — одна, 341 × 72. Левая панель: свёрнутый раздел снова скрыт (display:flex блока перебивал скрытие), первый заголовок не заходит под ◂, заголовки — приглушённый акцент со светлой надписью, в одну строку и не сжимаются.
Zazerkalius v0.510 — по снимку левой панели — «в этом же стиле попробуем тут». Разделы левой панели (Страница целиком, Шаблоны, Построения, Треугольник из строки, Нарезать, Заготовки, Окна) оформлены как группы конуса: заголовок раздела — залитая «стрелка вправо» цветом акцента с тёмной надписью (свёрнутый раздел — бледнее), кнопки и списки — из тех же треугольников, цепочкой «остриё в выемку», вплотную. Длина кнопки — по надписи (значок — полкнопки), и каждый ряд дотягивается до правого края панели, по стороне на кнопку по кругу. «Окна» — по одной кнопке в ряд во всю ширину. Раскладку ведёт lpTag (после triTag, при изменении размера и состава блоков). В режиме «панель значками» (◂) всё как было.
Zazerkalius v0.509 — «так меняет высоту при изменении ползунка» (снимки «Кручения» в своём порядке кнопок), «сделай норм стрелки и кнопку плей и пауза по стандарту» (блок ◀ ⏵ ▶ «Звука»), «у звука ползунок громкости». Добивка ряда дотягивала ряд до края впритык, и доли пикселя то влезали, то нет — ⟳ перескакивал строкой ниже при каждом пересчёте. Теперь перед растяжкой у группы запас в 1 px; проверено при 360…400 px на всех значениях ползунка — высота одна. ◀ ⏵ ▶ в группах — обычные значковые кнопки (полкнопки) со значками ◀, ⏵ / ❙ / ⏸, ▶: прежде стрелки были формой без значка (значок прозрачный), со своей чертой-разделителем. Ползунок громкости короткий из-за рисунка конструктора: клетки ♩ и 🔊 в нём перемешаны через полосу (♩ — столбцы 0–22 и 32–37, 🔊 — 23–31 и 38–46) — так рисунок сняли раньше, когда число и значок ползунка стояли поверх соседнего. Свежий снимок даёт каждому ползунку один кусок.
Zazerkalius v0.508 — по снимку «Вида» — «ромб растяжки, который внизу должен быть, где-то гуляет». В v0.507 ромб садился на нижнюю из кнопок, доходящих до правого края, — у группы конструктора это мог быть средний ряд. Теперь ромб всегда в нижнем ряду, у правого края группы: на последней кнопке ряда, если она дошла до края, а у короткого ряда — на рамке справа. Проверено на всех группах с настройками пользователя: ромб в правом нижнем углу.
Zazerkalius v0.507 — по снимкам «Вида» — «ширина огромная» — и «Кручения» — «прыгает высота при ползунке». Три причины. (1) В рисунке конструктора элемент без id помнится по номеру среди детей блока («@18»), а номер считался вместе со служебным слоем обводки (.tzco): «👁 выдел.» перенесли в конец, слой встал на её номер и растягивался как кнопка на 596 px, а сама кнопка терялась — группа раздувалась. Слой и ручка в счёт номеров больше не идут. (2) Ромб-ручка стояла на последней кнопке нижнего ряда — у группы конструктора нижний ряд короткий, ромб оказывался у левого края, и сузить группу им было нельзя. Теперь ромб — на самой нижней из кнопок, что доходят до правого края. Ширина рисунка при переносе — не меньше самого широкого блока (прежде группа ужималась уже ползунка). (3) Нижняя граница ширины обычной группы считалась по блоку «◀ ползунок ▶|» вместе с уже растянутым ползунком — растяжка поддерживала сама себя, группа не сужалась, ряды перескакивали. Теперь растяжка кнопок внутри блока вычитается: «Кручение» при 355 px — 340 × 96, высота при любом значении ползунка одна.
Zazerkalius v0.506 — по снимку «Звука» — «ползунок не там ставит цифры своего значения», «и Вид так же». В группах, собранных в конструкторе, у ползунков не был задан размер треугольника --t (его ставит только раскладка обычных кнопок), и правило места числа и значка (calc с var(--t)) становилось недействительным: число прилипало к левому краю ползунка, значок терял ширину. Теперь --t задан на все группы сразу. Число, которому нет места ни справа, ни слева от бегунка, остаётся справа, а не уходит за левый край. Проверено на настройках пользователя: во «Виде», «Звуке» и других группах число стоит сразу за бегунком, значок — в нём.
Zazerkalius v0.505 — по снимку «Вида» в одну строку — «ширина съехала» (и «у звука»). В настройках пользователя у «Вида» (группа конструктора) был размер 3922 × 48 px. Ромб-ручка при отпускании запоминала видимую ширину группы, а группа конструктора при переносе рисунка бывает шире заданной — каждое касание ромба прибавляло (проверено: сдвиг на 3 px записал 492 вместо 350). Теперь запоминается не больше того, что задано ручкой. Размер шире экрана считается сбоем и при загрузке снимается — группа встаёт по своему рисунку («Вид» — 513 × 120). «Звук» прицеплен под «Видом» (v0.502) и встаёт под ним.
Zazerkalius v0.504 — «проверь подсказки кнопок у всех групп», «внутри ползунков покажи сетку» (по рисунку) и «ползунки раздолбались — надписи и значки ушли». Подсказки проверены у всех элементов групп: своя есть у всех, у кого нет (стрелки ◂ ▸ и поле ползунка, кнопки внутри блоков) — берётся подсказка блока. Устаревшие поправлены: у «Звука» (кнопок «♫ звук» и «■» больше нет — ⏵ играть, ❙ пауза, ⏸ стоп; ⏺ пишет то, что играет ⏵), у скрытого «запрета сдвига» (служебная пометка «v0.212: скрыта»), у «Своей» и цветов 1 / 0 / а (показывают цвета выбранной гаммы, правка — в «Свою»). В поле каждого ползунка — сетка из тех же треугольников (косые под ±60° и средняя черта), бледно, цветом группы. Бегунок (v0.501) на малых значениях был тёмным, и тёмный значок в нём пропадал — теперь он не темнее 82 % цвета группы.
Zazerkalius v0.503 — по снимку «Звука» — «поправь все кнопки у звука». Блок ◀ ⏵ ▶ (сцепка, v0.419) в группах рисовался по-старому: своей формой и с косой сеткой внутри — отсюда крестики между кнопками. Теперь его кнопки — в общей цепочке из треугольников, как все (◀ и ▶ — стрелки, ⏵ — полкнопки), старая сцепка в группах не применяется. В группе, собранной в конструкторе (△), ползунки, поля, списки и подписи не получали общего оформления (только кнопки) — ползунки оставались браузерными, с синим кружком. Теперь у всех элементов рисунка общее оформление: бегунок-стрелка цветом группы, без рамок браузера.
Zazerkalius v0.502 — по снимку «Вида» и «Аниматрицы» рядом — «примагничивать к левой группе, размагничивать при перемещении правой», и «верхняя — нижняя так же, верхняя главная». Группа, поднесённая к соседней сбоку, входит в неё зубцами: выемки левого края — на острия правого края соседки (заходит на глубину зубца), ряд в ряд. Поднесённая снизу (или сверху) встаёт рамка на рамку, левые края вровень, если близко. Отпустил так — группы сцеплены (Z.cgrpLink): правая — к левой, нижняя — к верхней. Главную двигают, растягивают, перестраивают — прицепленная едет следом, цепочкой через несколько групп. Прицепленную потянул — отцепилась. Окно конуса по-прежнему держит группу целиком внутри: если справа места нет, прицепленная упрётся в край окна.
Zazerkalius v0.501 — по снимку ползунка — «бегунки цвета группы, наверное, и может как-то градиентом менять». Бегунок («стрелка вправо») теперь цветом своей группы, а не акцентом гаммы, и с градиентом: от хвоста к острию светлее. Насыщенность меняется со значением: у левого края ползунка бегунок тусклее (55 % цвета группы), у правого — во весь цвет (--thp, считает tzSliders).
Zazerkalius v0.500 — по снимку «Гаммы» — «тут цвета менять при нажатии на другие, а при нажатии на Своя — вернуть свои; но если изменить цвета, то это всё сохр. в Своя». Цвета 1 / 0 / а рядом со «Своей» показывают цвета выбранной гаммы (прежде всегда цвета «Своей»): выбрал «Янтарь» — в них цвета «Янтаря», «Своя» — снова свои. Если поменять цвет, когда выбрана другая гамма, её три цвета с этой правкой становятся цветами «Своей» (прежние свои заменяются), и выбирается «Своя».
Zazerkalius v0.499 — по снимку «Кручения» — «наладь тут размеры». Блоки внутри групп (режимы кручения, шаг «◀ ползунок ▶|», «Своя» с цветами) получали ширину по сетке --bu: режимам — 2 клетки, и они вставали по одному в строку; шагу — 4 клетки, с пустым хвостом. Теперь блок — по своему содержимому и не переносится. Добивка ряда тянет и кнопки внутри блока, если он стоит одной строкой. Значки (◀ ▶| ⟲ ⟳) тянутся, только если в ряду больше нечего тянуть. Подписи («весь:», «↻ бит») — по длине текста, от 3 сторон. Группа сразу не уже самого широкого блока, а посчитанную ширину браузер больше не ужимает: прежде доли пикселя переносили последнюю кнопку ряда. «Кручение» теперь в 4 ряда вместо 7: заголовок, «весь:», ⟲ ⟳ / четыре режима / ▶ крутить, ↻ по часовой / ◀ ползунок ▶| — все ряды до правого края.
Zazerkalius v0.498 — «сделай её толще, а обводку всей группы сделай цветом». При «▱» обводки кнопок цветом фона холста теперь вдвое толще: 2 px с каждой кнопки вместо 1. То же у стыков в группах конструктора и у колец. Рамка группы снова цветом группы (её заголовка) и лежит поверх швов: по краю группы — цветная линия, внутри — тёмные швы между кнопками.
Zazerkalius v0.497 — «сделай её в цвет фона холста». При включённой «▱ обводке» обводки в группах уже не прозрачные, а цветом фона холста (--bg): между кнопками и по краю групп — тёмные швы, будто кнопки вырезаны из фона. Это обводки кнопок, ползунков, заголовков, колец, стыков в группах конструктора и рамки групп. Цвет берётся из темы, так что в светлой теме швы светлые. Щелчок по «▱» — обводки снова цветом группы.
Zazerkalius v0.496 — «тест: вообще убрать обводку — прозрачной сделать». Новая кнопка «▱ обводка» в шапке переключает обводки в группах: кнопок, ползунков, заголовков, рамок групп, колец и стыков в группах конструктора. По умолчанию теперь прозрачные; щелчок — вернуть как было (Z.noLn). Кнопки различаются только заливкой и нажатые — цветом группы.
Zazerkalius v0.495 — по снимку «Колец» — «нет верхней обводки, и переделай — у каждой группы независимый цвет фона нажатой кнопки свой пусть». Рамка группы шла линией ровно по краю, и видна была только её внутренняя половина, 1 px; при дробной координате группы верх сглаживался до невидимого. Теперь верх и низ рамки на полпикселя внутри края. Фон нажатых кнопок (и галок, и наведения) больше не общий акцент гаммы (v0.471), а цвет самой группы — тот же, что у заголовка и обводок. В заголовке появился ◆, закрашенный этим фоном: щелчок — выбрать группе свой цвет, правый щелчок — снова цвет группы (Z.cgrpOnC).
Zazerkalius v0.494 — по снимку «Гаммы» в одну строку с заголовком во всю длину — «ширина у заголовка — поправь». При снимке в редактор заголовок стоял в ряду один, и добивка ряда (v0.484) растянула его до края — так он и попал в рисунок. Теперь заголовок добивкой не тянется никогда; а если в рисунке он уже шире своего, эти клетки не в счёт: заголовок своей обычной ширины стоит первой кнопкой (рисунок не тронут — лишнее можно стереть в «Сетке»). Первая строка рисунка садится выемкой на остриё заголовка; если не сходится по чётности сетки — заходит на него на полтреугольника, а не оставляет щель.
Zazerkalius v0.493 — по снимку режимов «Кручения» во всю ширину — «проверь ширину». Добивка ряда до края (v0.484) тянула кнопки и внутри блоков — режимы кручения стоят в своём блоке по одному в строке, и каждый растягивался на всю группу. Теперь тянутся только кнопки, стоящие прямо в группе, и недостающее место делится между ними поровну (по стороне на кнопку по кругу), а не уходит одной кнопке: «🔮 просчитать» — 202 px вместо 326.
Zazerkalius v0.492 — «горизонт у ползунков убери вообще»: линии оси у ползунков в группах больше нет — только стрелки, бегунок и обводка по контуру.
Zazerkalius v0.491 — «проверь двойной высоты обводки, чтоб не было нигде» (снимок «Гаммы», шов между «Своя» и «Янтарём») и «кн. свет между ползунками». В группе конструктора кнопки сходились краями ровно на границе, и сглаживание оставляло тёмный шов рядом с линией стыка — выглядело двойной обводкой. Теперь треугольники каждой кнопки чуть больше (на 0,6 px), коробка кнопки на 1 px шире со всех сторон — соседи перекрываются, шов закрыт заливкой; линия стыка — 1 px ровно по пикселю (прежде 1,5 px посередине границы). В обычных группах проверено при увеличении — между рядами одна линия. «✨ свет» в «Виде» — между ползунками «↕» и «▬».
Zazerkalius v0.490 — по снимку «🔴 неп. ⇄» и «🟢 неп. ⇄🔁» — «эти кнопки как все сделай размером». У них надписи длиннее обычной кнопки, и замер делал их двойными. Теперь они помечены data-w1: всегда обычного размера (6 сторон), надпись чуть плотнее (11 px) и влезает целиком. И дотягивание ряда до края (v0.484) берёт самую правую из кнопок, которые можно тянуть; стрелки, цвета гаммы и такие кнопки не тянутся.
Zazerkalius v0.489 — «сам ползунок тоже стрелкой — прибавь ему треугольника 2 слева». Бегунок ползунка — «стрелка вправо» из восьми треугольников (выемка слева, остриё справа, ширина 5t; прежде шестигранник из шести); значок в нём и число рядом подогнаны под новую ширину.
Zazerkalius v0.488 — по рисунку двух «>» — «левый край ползунков как у кнопок надо». Левая стрелка ползунка — тоже «>» (выемка слева, остриё справа), как у всех кнопок; прежде (v0.485) была «песочными часами».
Zazerkalius v0.487 — «у ползунков горизонт тоньше линию, и верни им обводку». Линия оси ползунка — 1 px (была 2); обводка по контуру ползунка — снова, как у кнопок (снята была в v0.464); своей заливки у ползунка по-прежнему нет.
Zazerkalius v0.486 — по рисунку «стрелки вправо» — «Своя также сделай, и эта группа в редактор не идёт почему-то». «Своя» и цвета 1 0 а теперь тоже «стрелки вправо» цепочкой (прежде «Своя» была остриём слева и выемкой к цветам, а просветы между цветами закрашивались её цветом — это снято). Редактор: с v0.473 блок кнопок растворён в группе (display: contents), его прямоугольник нулевой, и снимок для конструктора выходил пустым — «группу не видно». Теперь снимок меряется по самой группе, а заголовок идёт в рисунок как обычная кнопка (своя кисть, место и форма по рисунку). Найдено при проверке: снимок точками экрана молча терял кнопки, закрытые другим окном (у меня — «Сеткой») — на миг снимка окно конуса и группа поднимаются поверх всего, а если кнопка всё равно не попала, конструктор об этом говорит; и общая чистка формы снимала её с заголовка (он вне блока кнопок).
Zazerkalius v0.485 — «заголовки жирным текстом, все кнопки пусть по умолчанию, если не редактировать, — стрелки вправо, вот такие, и у ползунков» (рисунок: длинная кнопка с выемкой слева и остриём справа, «песочные часы» и «>»). Все кнопки, галки, списки, поля и подписи групп теперь «стрелки вправо»: слева выемка, справа остриё — остриё соседа всегда входит в выемку. Кнопки ◀ и левая стрелка ползунков — «песочные часы» (выемки с обеих сторон: слева — в стрелку соседа, справа — под бегунок), правая стрелка ползунков — «>». Заголовки групп — жирным. Группы, переделанные в конструкторе △, — как нарисованы.
Zazerkalius v0.484 — по снимку «Гаммы» с пустым местом справа — «пустой длины не должно быть, а нижний ромб-размер накладывай на кнопку». В обычных группах последняя кнопка каждого ряда дотягивается до правого края целыми сторонами, а группа подрезается по самому длинному ряду; ромб-ручка встаёт на правый конец последней кнопки нижнего ряда. У группы конструктора кнопки нарисованы — там группа только не шире рисунка, ромб тоже на последней кнопке. Найдено при проверке: (1) минимум ширины группы считался по уже растянутым кнопкам — исправлено; (2) старая ловушка: правило «на время замера — ширина по содержимому» проигрывало правилам «двойная/четверная кнопка», и «двойная» при нулевых зазорах (её ширина 2 кнопки + 3 px) мерилась шире двойной и навсегда становилась «четверной» — правило замера сделано сильнее. Осталось: ряд с блоком, у которого своя ширина (в «Лазере» «◎ до строки»), дотягивается не до конца.
Zazerkalius v0.483 — по снимку «Колец» во весь экран — «длина сама вытягивается у этой». Самоподпитывающийся цикл: ширину подписи («↻ бит») и заголовка я брал из их же ширины; с v0.479 первая кнопка ряда шире на t (выемка), и это давало n + 0,5 стороны, а округление — n + 1, так что при каждом пересчёте (у «Колец» он частый) подпись прибавляла по стороне. Теперь своя ширина (её ставит сам конструктор форм) за «заданную» не принимается, а нужное место заголовка считается без своих краёв. Проверено: 50 пересчётов подряд — ни одна ширина не сдвинулась. Размер группы, уже сохранённый растянутым, сам не сжимается — его сужают ручкой-ромбом.
Zazerkalius v0.482 — по снимку полосатого уголка — «это замени: последний ромб сделай цветом группы, и за него тянуть». Ручка размера группы теперь — ромб из двух треугольников (▲ над ▼) цветом группы в правом нижнем углу, ровно в последнем острие рамки. Найдено при проверке: рамка пересчитывалась на долю секунды позже размера, и угол с ромбом на миг оказывался вне неё — ромб не хватался; теперь рамка пересчитывается сразу.
Zazerkalius v0.481 — по снимку «Гаммы» — «нижняя обводка потерялась». Кнопки с v0.478 на 1 px выше ряда (чтобы между рядами была одна линия), и нижний ряд закрывал нижнюю линию рамки группы. Рамка теперь рисуется поверх кнопок — она тонкая и идёт только по краю группы.
Zazerkalius v0.480 — по снимку суженной «Гаммы» — «группа не может быть короче, чем самая длинная группа кнопок; тут Своя + 3 цвета — это совмещённая кнопка». Кнопки одного блока-обёртки (как «Своя + 1 0 а») в конструкторе теперь одна единица переноса — переносятся только целиком. И группу уже не сузить ручкой меньше её самой широкой неразрывной части: у конструктора — самого широкого блока переноса, у обычной группы — самой широкой кнопки или блока (заголовок тоже). Проверено: «Гамма» и «Вид» при попытке сузить до 100 px встают на 167 и 176 px, ничего не вылезает за край.
Zazerkalius v0.479 — «левая граница у групп пусть будет стрелкой вправо всегда — кнопку дорисовывай, если надо, при изменении положения» и «у всех заголовков убери прозрачность». Левый край группы теперь выемкой (стрелка вправо, правый край — остриём, как был); первая кнопка каждого ряда (в том числе заголовок) получает выемку слева и ложится в край вплотную; ряды перестроились (ширина, перенос) — первые кнопки пересчитываются сами. Заголовки — сплошь цветом группы с тёмной надписью (прежде заливка была на четверть, и значки 🧘 △ ✕ полупрозрачные); 🧘 у не отмеченных для дзена — серым. Найдено при проверке: у галок ширина держалась ещё и через flex, и замер «сколько нужно места» брал прежнюю ширину — выемка (+t) раздувала их до 4 кнопок; теперь на замер снимается и flex. И цвет группы читается из цвета надписи заголовка, поэтому тёмную надпись даёт заливка букв, а не color.
Zazerkalius v0.478 — по снимку «Вида» — «когда кнопки одна под другой — обводка у них одна пусть будет, между ними не двойная» и по снимку «Лазера» под другой группой — «магнитить только там, но без щелей — обводка на обводку ложить». Всё в группах теперь на 1 px выше ряда и заходит на ряд ниже (шаг рядов по-прежнему 24 px): нижняя кнопка рисуется поверх и своей верхней линией закрывает нижнюю линию верхней — между рядами одна линия; у нижнего ряда лишний 1 px срезает рамка группы. Магнит: группа к группе встык заходит на 1 px — их рамки ложатся одна на другую; к краям окна и полю строк — как было.
Zazerkalius v0.477 — по снимку края «Вида» — «убери боковые отступы у групп». Поля слева и справа у групп сняты: острия крайних кнопок теперь прямо в зубцах рамки — у них та же форма (остриё 120° на каждый ряд), так что край кнопки и рамка группы совпадают.
Zazerkalius v0.475–v0.476 — по снимку «Гаммы», где заголовок висел строкой над рисунком, — «заголовок — это как кнопка, в её строке надо их ставить», и «убери вообще жирность обводки». У группы конструктора заголовок теперь тоже шестигранник и стоит первой кнопкой первой строки: рисунок первой строки сдвигается вправо на его ширину, а у группы с заданным размером, если тесно, первая строка уходит под заголовок. Ширина заголовка — по надписи со значками, кратно полкнопке (короткие — 6 сторон, длинные — 9), прежде длинные надписи обрезались. Жирной обводки больше нет нигде: у нажатых кнопок и галок её убрал совсем — нажатую видно по заливке гаммы, обводки «⬚» из редактора всегда тонкие.
Zazerkalius v0.474 — по снимку ползунка «Аниматрицы» — «какая-то лишняя обводка». Сверху и снизу дорожки шли две линии: у самого поля ползунка осталась рамка 1 px от общего правила для всех полей ввода (края прятались под стрелками). У ползунков в группах она снята, заодно и рамка фокуса после щелчка.
Zazerkalius v0.473 — «заголовок группы — это самая первая кнопка, и все следующие размещать на её же строке, если размер позволяет» (рисунок — длинный шестигранник) и «ползунки так поправь» (рисунок: «<» ⬡ «>», у края шестигранник входит в выемку стрелки). Подпись группы теперь — шестигранник в начале цепочки, залитый цветом группы; блок кнопок растворён, и заголовок с кнопками текут одним рядом с переносом под заголовок. Группа без заданного размера — не шире 520 px. У групп конструктора △ заголовок прежний — их раскладку задаёт рисунок. Бегунок ползунка — шестигранник из шести треугольников (значок в нём), у краёв заходит остриём в выемку стрелки; число по-прежнему едет рядом. Рисунок рамки с ромбом внутри — на заметку, пользователь пока не просил.
Zazerkalius v0.472 — по снимку «Своя 1 0 а Янтарь» — «тут жёлтая обводка не в тему, это те кнопки, что в редакторе делал, — надо там не разрешать другого цвета». Обводки из редактора — и «⬚», и линии ╱ — рисуются только цветом группы: на странице, в живом виде и в сетке; прежние, сделанные своим цветом, тоже. Поле выбора цвета у «⬚» убрано. Попутно: при правке два `//`-комментария легли посреди строки и закрыли остаток кода — заменены на /* */ до коммита (поймал node --check).
Zazerkalius v0.471 — по снимку «Гаммы» — «у всех кнопок должна быть обводка цвета самой группы, а фон выделенной задаётся Гаммой», «гамма — на все кнопки любой группы, фон выделенной». Контур каждой кнопки, галки, списка, поля и подписи — цветом заголовка своей группы (как её рамка); толстая обводка нажатой — тоже цветом группы; в конструкторе цветом группы и линии стыков, и живой вид. Фон нажатой кнопки и включённой галки во всех группах — акцент текущей гаммы (смешанный с фоном кнопки, чтобы читалась надпись), в том числе в сцепке «Звука»; прежде был золотой.
Zazerkalius v0.470 — по снимку «Гаммы» — «после редактирования жирность не уходит у обводки, которую сделал в редакторе; жирная — только у выделенной кнопки». Правило для всех обводок «⬚» стало одним: видна всегда, но тонкая, 1 px; жирная (своей толщиной «═», не тоньше 2 px) — пока нажата хоть одна из её кнопок. Это заменяет правило v0.468, где обводка вокруг одной кнопки пряталась, а вокруг нескольких всегда была жирной.
Zazerkalius v0.469 — по снимку свёрнутой «Гаммы» — «лишняя высота». Высота группы теперь ровно ряды по 24 px: поля сверху и снизу у группы и у её кнопок — 0, подпись без отступа, ряды внутри блоков (режимы кручения) тоже вплотную. Так зубцы рамки идут ровно по рядам кнопок. Свёрнутая группа — высотой ровно в заголовок, 24 px; прежде она держала свою прежнюю высоту (v0.207). Проверено: все группы конуса — кратны 24 (96, 120, 192, 216, 240).
Zazerkalius v0.468 — по снимку «Гаммы» — «Роза нажата, но смотри — жирная обводка у других есть». Нажата была одна «Роза»; красная вокруг «Своя» и жёлтая вокруг «Янтаря» — обводки «⬚», сделанные раньше вокруг одной кнопки. Удалять их молча нельзя, поэтому смысл у них теперь такой: обводка «⬚» вокруг ОДНОЙ кнопки — знак «нажата», видна, только пока эта кнопка нажата (горит или галка включена), своим цветом. Обводки вокруг нескольких кнопок (блоки) видны всегда. Кнопки загораются и гаснут и сами (гамма, режимы), поэтому сверка идёт раз в 300 мс.
Zazerkalius v0.466–v0.467 — «значок прямо в ромбе ползунка, а числа бегают с ним справа или слева» и, на «жирная обводка была только у нажатых кнопок», — «так и надо». Ползунки в группах: значок (↕, ▬, ⚡…) стоит в ромбе-бегунке, число едет рядом с бегунком — справа, а если справа тесно, слева. Они двигаются вместе с бегунком и при перетаскивании, и когда значение меняет сама страница (сверка раз в 300 мс). Нажатые кнопки и включённые галки: толстая обводка внутри своей формы (видна половина линии, 2,5 px), на соседей не заходит; цвет — подсветка кнопки (у гаммы — свой цвет гаммы, у прочих — золото). Так и в обычных группах, и в конструкторе — там обводка идёт по границе своих треугольников.
Zazerkalius v0.465 — по снимку широкой «Гаммы» в две строки — «не даёт в одну строку размер группы» и «жирная обводка — и перекрывает обводку других кнопок». Перенос в конструкторе работал только на сужение. Теперь группа, которой задан размер, течёт, как текст, в обе стороны: следующая строка рисунка подтягивается на текущую, если влезает, иначе переносится. Без заданного размера рисунок стоит, как нарисован. Обводка «⬚» лежала посередине границы, и половина линии заходила на соседние кнопки; теперь она рисуется только внутри своей области (линия двойной толщины, обрезанная по области), так что видимая толщина ровно «═», а соседей она не задевает. Найдено при проверке: если группы не видно на экране, △ снимал пустой рисунок — теперь группа сперва прокручивается в вид, а если её всё равно не видно, конструктор не открывается и говорит об этом.
Zazerkalius v0.464 — четыре просьбы подряд. «Пусть у группы обводка цветом, как у её текста»: рамка-зубцы группы теперь цветом её заголовка. «Обводка — толщина почему-то только толстая»: у обводки «⬚» своя толщина — из поля «═» в момент создания (прежние стали 1,5 px вместо 2,5); рамка группы тоньше, 1 px. «Стрелки у ползунков», «сам ползунок», «и тонкая линия по оси» (рисунок: «<» —◆— «>»): у ползунков в группах стрелки ◂ ▸ — шевроны из четырёх треугольников во всю высоту ряда, остриями в концы ползунка, цветом группы; между ними — тонкая линия по оси того же цвета; бегунок — вертикальный ромб из двух треугольников цветом акцента; своей заливки и рамки у ползунка нет. Значок и число остались на месте.
Zazerkalius v0.463 — «вообще переделай сам у всех групп кнопок, включая ползунки и выпадающие списки, чтоб всё было стандартно», «и края самих полей групп теми же ромбами надо», «не переспрашивая, делай как знаешь». Из треугольников теперь всё, что стоит в группах окна конуса и левой панели: кнопки, галки-кнопки, выпадающие списки, ползунки, поля чисел, подписи вроде «весь:» и «↻ бит». У всех один вид — заливка, без рамки, края-острия, обводка по контуру — и одна цепочка «остриё в выемку». Длина — целое число сторон: полкнопки 3, кнопка 6, двойная и ползунок 12, подпись — по своей ширине. Галка горит, как включённая кнопка; у списка своя стрелка ▾. Ряды кнопок стоят вплотную, без зазора, как и кнопки в ряду. Бока каждой группы — зубцами из тех же треугольников, по острию на каждые 24 px (ряд кнопок); рамка прежнего цвета группы. Левая панель — так же: та же мерка (кнопка 6 сторон) и без зазоров.
Zazerkalius v0.462 — на «после этого раскладка с переносом становится самим рисунком» — «а на те, что были, нельзя?». Впечатывание v0.461 снято. Рисунок группы теперь всегда исходный, длинными рядами, а в сетке — ВИД, как на экране: каждая кнопка сдвинута так, как её сдвинул перенос. Правка в сетке записывается в рисунок с обратным сдвигом той кнопки, чьей кистью закрашено; линия ╱ — по кнопке с одной из сторон ребра. Шире группу — кнопки снова собираются в длинные ряды, уже — переносятся, и сетка сама следует за этим, в том числе пока тянут ширину. Найдено при проверке и исправлено: обратный перевод брал новые сдвиги к старому виду и портил рисунок; теперь сетка помнит, по каким сдвигам построен её вид. После «↺ как было» у группы оставались сдвиги прежнего рисунка — теперь сбрасываются; треугольники с битыми номерами вычищаются.
Zazerkalius v0.461 — по снимку «Гаммы», перенесённой в четыре ряда, — «пусть в редактор попадает в таком расположении, в каком нажата кнопка в редактор». Прежде сетка показывала исходный рисунок, а страница — его же с переносом рядов под ширину группы. Теперь при △ перенос впечатывается в рисунок: треугольники, линии ╱ и свои цвета переезжают туда, где кнопки стоят на экране. Сетка показывает ровно то, что видно, кнопки на странице не сдвигаются. Дальше рисунок уже такой: если расширить группу, он сам обратно в длинные ряды не развернётся.
Zazerkalius v0.460 — по снимку «Своя 1 0 а» — «обводка как-то криво работает, пусть просто берёт крайние выделенные кнопки и общей обводкой их». Обводка «⬚» шла по границе самих треугольников выбранных кнопок, поэтому между ними (в просветах «Своя») появлялись линии вокруг каждой кнопки. Теперь в каждом ряду обводка охватывает всё от первого до последнего треугольника выбранных кнопок, включая просветы и то, что между ними, и идёт одной линией по внешнему краю. Так же выглядит и пунктир выбора.
Zazerkalius v0.459 — «обводка в редакторе кнопок: нужен режим, когда группы кнопок только выбираются, и потом, когда снова нажать кнопку режима, — всё объединит одной обводкой, и цвет обводки разный, чтоб задавать». В строке конструктора — «⬚ обвести» и поле цвета. Включил — щелчки по кнопкам в сетке их выбирают (ещё щелчок — снимает), выбранные обведены пунктиром, закраска не меняется. Нажал «⬚» ещё раз — выбранные кнопки получают одну общую обводку по границе своих треугольников, цветом из поля. Обводок сколько угодно, у каждой свой цвет; список обводок — рядом, щелчок по обводке её снимает. Обводка видна на странице, в живом виде и в сетке. Обведённые вместе кнопки при переносе рядов держатся одним блоком. Есть своя обводка — автоматическая общая граница не рисуется.
Zazerkalius v0.458 — по снимку квадратов с щелями — «квадраты вплотную надо бы, по общим граням сетки квадратной». В виде «■ квадраты» квадрат теперь во всю ячейку, а шаг рядов подогнан под ширину символа, так что ячейка квадратная и соседи делят грани. У строк, сдвинутых на полсимвола (треугольник 1, 2, 3… бит), получается кладка «кирпичом»: в ряду — целые общие грани, между рядами — половинки.
Zazerkalius v0.457 — по снимку «Своя 1 0 а» — «обводку не могу нормально положить для третьей кнопки, похоже, обводку надо отдельно рисовать». Общая граница v0.454 строится по правилу «всё между крайними кусками кнопки», и третью кнопку оно не всегда захватывает так, как задумано. Теперь обводку можно рисовать руками: в конструкторе инструмент «╱ линия по ребру» рисует обводку самой группы, у каждой группы она своя. Цвет — любой из палитры или кисть кнопки: щёлкни кисть, пока горит ╱. Толщина — «═». Линии сразу появляются на странице и в живом виде; при переносе рядов линия едет с кнопкой, к которой прилегает. Как только в группе есть хоть одна своя линия, общая граница сама больше не рисуется. Свои линии, что были в сетке до конструктора, откладываются вместе с закраской и возвращаются по «✓ готово».
Zazerkalius v0.456 — по снимку поля строк — «добавь отображение квадратами вместо бит и ромбами; ромбами — только когда чёт-нечет строки длиной идут, чтобы ромбы вкладывались друг в друга». На полосе поля, рядом с выравниванием, — список вида бит: «01 цифры», «■ квадраты», «◆ ромбы». Цифры остаются на месте, только прозрачные, поэтому выделение, щелчок по биту, Del и вставка работают как прежде; фигура рисуется поверх цветом бита, нули — бледно. Ромб шириной в символ и высотой в два ряда. У строк, чья длина отличается от соседней на нечётное, ряды сдвинуты на полсимвола, и ромбы соседних рядов входят друг в друга сплошной решёткой: треугольник 1, 2, 3… бит становится решёткой ромбов. У прочих строк и при выравнивании не по центру — квадраты. В этом виде у рядов нет обрезки и фона, иначе ряд ниже закрывал бы кончики ромбов ряда выше.
Zazerkalius v0.455 — «кнопки под одной обводкой — не переносятся на другие строки». Кнопки под общей границей — кнопка из нескольких кусков и те, что стоят между её кусками (как «Своя» с цветами 1 0 а), — теперь один блок. При сужении группы блок переносится целиком, а не рвётся посреди. Если блок шире заданного размера группы, группа расширяется по нему, чтобы его не обрезало.
Zazerkalius v0.454 — конструктор, четыре просьбы подряд. «Как-то надо указывать, что это относится к кнопке такой-то; у каждой кнопки пусть свой цвет»: у каждой кнопки группы теперь своя кисть — свой цвет и её надпись, кисти стоят в строке конструктора. Закрашенное кистью кнопки принадлежит ей, где бы ни стояло, куски не обязаны касаться. Обычные цвета палитры — просто рисунок. Надпись кнопки в сетке одна, на самом большом куске; прежде символ стоял на каждом куске. Старый рисунок (v0.452–0.453) переводится в кисти сам, и при открытом конструкторе тоже: сетке подставляется тот же рисунок, иначе она записала бы поверх старый, и кнопки потеряли бы хозяев. «Номера закрашенных скрывай»: номер в сетке остался только у пустых треугольников. «Каждой кнопке, если между её гранями другие, — общую границу цвета»: кнопка из нескольких кусков, между которыми стоят другие (как «Своя» с цветами 1 0 а), обводится общей границей своим цветом. Граница видна на странице, в живом виде и в сетке. «Правой кнопкой по закрашенному — берёт его при следующем клике»: правый щелчок — пипетка, берёт цвет треугольника (в конструкторе — кисть его кнопки). Раньше правый щелчок стирал; стирать теперь — ластиком или тем же цветом ещё раз.
Zazerkalius v0.453 — по снимку «Гаммы» в конструкторе — «потерялись надписи и не перестраиваются при изменении длины группы» и «при редактировании покажи кнопки с надписями онлайн — как будет выглядеть». Надписи: блок «Своя + цвета» держало своё сильное правило (inline-flex !important). В конструкторе он схлопывался в точку, и его обрезка шестигранником (v0.450) срезала «Своя» и все три цвета. Теперь обёртки в конструкторе сильнее — без своего места, обрезки и фона. Перенос: группа, которой задан размер (ручка в углу), переносит ряды рисунка целыми кнопками. Что не влезло, уходит строкой ниже к левому краю; сдвиг — на чётное число шагов, чтобы треугольники не переворачивались. Без заданного размера рисунок стоит, как нарисован. Живой вид: в «△ Сетке» под строкой конструктора — кнопки группы в настоящую величину, ровно по рисунку, с цветами и надписями как на странице. Перерисовывается с каждой правкой.
Zazerkalius v0.452 — по снимкам «Гаммы» и «△ Сетки» — «сделай кнопку рядом с заголовком, маленький значок: при нажатии данная панель отображается конструктором; здесь и тут я правлю руками кнопки». У заголовка каждой группы конуса — △. Щелчок открывает «△ Сетку», привязанную к этой группе: каждая кнопка (и цвет, поле, список) нарисована своей фигурой из треугольников своего цвета, с подписью. Соседние кнопки — разных цветов, горящая — золотая. Рисунок снят с самой группы: страница опрашивает точку в центре каждого треугольника и смотрит, какая кнопка под ней. Дальше правишь в сетке, а кнопки на странице сразу встают по рисунку: место и форма — ровно те треугольники, что за кнопкой числятся. Фигура одного цвета принадлежит той кнопке, за которой большинство её треугольников. Если закрасить кусок цветом соседки, он отходит ей. Кусок без хозяина отходит ближайшей кнопке того же цвета, поэтому кнопка может состоять и из нескольких кусков (подпись — на самом большом). Обводка рисуется одной линией на каждый стык. Что в рисунок не попало, стоит ниже обычным рядом. Пока идёт конструктор, своё содержимое сетки откладывается в сторону; «✓ готово» его возвращает, раскладка группы остаётся. «↺ как было» снова делает группу обычным рядом.
Zazerkalius v0.451 — по снимку «Янтарь ❯ Океан» — «убери двойную обводку между кнопками». Каждая из сцепленных кнопок обводила общий край со своей стороны, а между двумя линиями просвечивал тёмный шов: оба края сглаживаются, и фон проступает сквозь них. Теперь следующая кнопка заходит на соседку ещё на 1 px, её край ложится прямо на линию соседки, и на стыке остаётся одна линия. Шаг кнопок не изменился.
Zazerkalius v0.450 — по снимку трапеций и рисунку 215…302 — «три цвета короче; Своя и цвета — между цветами цвет фона Своя, и далее другие». «Своя» начинается остриём, а заканчивается выемкой; в неё входит цвет единиц, за ним цвет нулей и акцент. Все три — маленькие шестигранники из 6 треугольников, остриё к острию. Треугольные просветы между ними закрашены цветом «Своя», и блок читается как одна кнопка с тремя окошками цвета. Блок снова шириной в две кнопки. Дальше «Янтарь» и другие — как были. Трапеции v0.449 сняты.
Zazerkalius v0.449 — по снимку «Своя 1 0 а» — «что за квадраты 3?? вот так их можно» (рисунок: после стрелки — голубая, сиреневая и красная трапеции встык). Квадраты — это выбор цветов своей гаммы: единиц, нулей и акцента. Теперь в конусе это трапеции из целых треугольников, по 4 стороны: первая и третья узкие сверху, вторая — снизу. Так они ложатся полосой без щелей. Заливка — сам цвет, граница — та же светлая обводка. Сцепка стала общей для любых краёв: остриё, выемка, скос / или \. Соседи сходятся серединами краёв, если края не лезут друг на друга. Кнопка берёт выемку, когда слева от неё остриё, иначе начинается остриём. Соседом считается и крайний элемент блока, поэтому «Янтарь» прижат к последней трапеции, а первая трапеция — к «Своя».
Zazerkalius v0.448 — по снимку «Своя» (сквозь кнопку видна сетка) и рисунку цепочки 215…303 (сиреневая, зелёная, розовая, серая — одна за другой) — «внутри кнопок не надо сетку, все кнопки без зазора — прижать друг к другу, разделяй их обводкой». Сетки внутри кнопок больше нет. Кнопки ряда сцеплены, как на рисунке: первая в строке начинается остриём, каждая следующая — выемкой, в которую входит остриё соседки (заходит на t, как в сцепке «Звука»). После поля, списка или подписи кнопка снова начинается остриём. Граница между кнопками — светлая обводка по контуру каждой, у соседей она общая. Сцепка считается по раскладке: кто в одной строке, тот сцеплен. Длина кнопки от этого не меняется — шаг по-прежнему 3s / 6s / 12s.
Zazerkalius v0.447 — по рисунку из «△ Сетки» (шестигранники и ромбоиды из целых треугольников) — «можем все кнопки привести к такому ромбовиду?»; выбрано: «как на рисунке», «пока только в группе Конус»; стрелки — по второму рисунку (46 47 / 102 103). Кнопки групп окна конуса теперь рисуются, как сцепка «Звука»: заливка и сетка треугольников внутри, без рамки; наведение — сиреневая заливка, включённая — золотая, «идёт само» (▶ волна, ▶ крутить) — мигает заливка, а не рамка. Обычная кнопка — шестигранник с остриями 120° на концах, длиной в целое число сторон s: полкнопки — 3s, кнопка — 6s (≈ 83 px, прежде 99), двойная — 12s; ◀ ▶ — шеврон из четырёх треугольников (3t), а не из шести. Зазоров по горизонтали нет: по правилу «всё по сетке t» кнопки встают вплотную. Левая панель и ▲ ▼ — как были. Ромбоиды (скошенные в одну сторону) пока не назначены ни одной кнопке — ждут, каким кнопкам их дать.
Zazerkalius v0.446 — «лазеры должны крутиться и двигать биты». С v0.443 головки 🎵 стояли на своих углах, и двигались только кольца. Теперь головки снова идут по кругу по часовой — за шаг на 1/T круга (T — бит в самой длинной строке), и в пути, и на кольце. Кольцо, на котором стоит головка, едет ей навстречу на 1 − n/T бита за шаг (n — бит в его строке). Вместе это ровно бит за шаг: головка проигрывает кольцо целиком, ни одного бита не пропуская, а на экране движутся и головка, и биты. У самого длинного кольца оно почти стоит — головка бежит по нему сама; у внутренних бегут биты. Если бы кольцо ехало на целый бит, как в v0.443, головка вместе с ним проходила бы по два бита за шаг и пропускала каждый второй. Бит под головкой теперь считается от бита входа и числа шагов, а не пересчётом угла, — так дробные сдвиги колец не сбивают счёт. Головки в пути, крутясь, сами находят щели — «граница» больше не ждёт «▶ крутить».
Zazerkalius v0.445 — по снимку центра конуса — «всё встало тут»: все головки 🎵 бились о кольцо строки 1 красными точками. Это щель «граница» (v0.444) зациклилась. У строки 1 из одного бита граница одна, наверху, а кольцо само не двигается. Головка, упёршись в «0», стояла и писала «1»; на следующем шаге эта «1» была стеной — гасла в «0», головка отражалась сквозь центр и упиралась снова. Через центр не проходил никто. Теперь, упёршись в «0», головка сама подвигает кольцо, пока граница перед этим битом (против часовой от неё) не встанет под головку, и встаёт на кольцо — то самое «встаёт в щель и двигает её». При «пишет» этот «0» становится «1» и звучит первым. «1» по-прежнему стена. Заодно кольцо, которое крутит головка, больше не округляется до целого бита: иначе подвинутая к головке граница уезжала бы из-под неё на первом же шаге.
Zazerkalius v0.444 — на «щель: сейчас «0», другой вариант — граница между битами, как у луч-часов; вход в щель: головка ставит там «1»» — «делай». У 🎵 музыки щель теперь выбирается: щель 0 (как в v0.443) или граница. При границе головка встаёт на кольцо, только когда под ней граница бит — в пределах половины ползунка «щель», ровно как луч-часы, — и крутит кольцо, стоя на ней; звучит бит по часовой от границы. Не на границе головка упирается в бит: «1» — стена (гаснет, отражение сквозь центр), перед «0» головка стоит, а при «пишет» этот «0» становится «1», и на следующем шаге это уже стена. Головки при границе стоят ровно на 360° / число, без сдвига на полбита: головка на 0° видит границы всех неповёрнутых колец. Умолчанием осталась «щель 0»: при границе свободные кольца стоят, и без «▶ крутить» (по биту / навстречу) щели почти не приходят к головкам. У строки 1 из одного бита граница вообще одна, наверху, — остальные головки бились бы о центр. Вход в щель по умолчанию ставит «1» — это подтверждено тем же «делай».
Zazerkalius v0.443 — «пусть лазер, попадая на строку, занимает её, пока всю по кругу не пройдёт; остальные проходят мимо неё; как проиграл — к следующей идёт; встаёт на строку только в щель и двигает её; при выходе идёт дальше; если 1-ца — отражается и идёт в другую сторону, сквозь центр даже; 1 при этом становится 0». Головки 🎵 музыки больше не бегут по кругу: каждая стоит на своём угле (через 360° / число) и идёт из центра наружу, кольцо за кольцом. Щелью здесь считается «0» под головкой, как в «☀ Без щелей», где «0» — проход, а «1» — стена. Граница между битами, как у луч-часов, не годится: головки стоят на месте, и на границу бита они почти никогда бы не попадали — музыка вставала бы. В щели головка встаёт на кольцо, занимает его и двигает на бит за шаг; «1» под ней звучит её нотой. Полный круг (шагов столько, сколько бит в строке, и кольцо вернулось на место) — головка выходит к следующему кольцу. Занятое кольцо другие проходят мимо. «1» — стена: она гаснет в «0», а головка отражается сквозь центр на противоположную сторону (угол + 180°) и снова идёт наружу. Щель, в которую встала головка, по умолчанию становится «1» (пишет) — то самое «в 0 стреляет — 0 переворачивается в ноту» из v0.441. Без этого единицы только гасли бы от отражений, и музыка затихала бы; режим читает оставляет её «0». Правило «счёт / копит» ушло вместе с бегом по кругу. Кольцо двигается «на вид» (накрутка кольца, как у запертого мышью), строка не сдвигается. Прошедшая все строки головка по-прежнему пишет в строку для заполнения 1-0-1-0 и возвращается в центр. На конусе занятое кольцо обведено цветом своей головки, отражение — красной точкой и бледным отрезком.
Zazerkalius v0.442 — «7 лазеров пусть — у каждого своя нота, по углу 360 на 7; и если на последней строке 0, то продолжаем — пишем в неё биты 1-0-1-0». У 🎵 музыки головок теперь несколько: поле «×» рядом, 1…12, по умолчанию 7, через 360° / число, идут по кругу вместе. У каждой своя нота — ступень лада «Звука» от До (в мажоре ровно До Ре Ми Фа Соль Ля Си, отсюда и семь), свой тембр и свой цвет луча (радуга нот, как у головок хаба). Высоту раньше давала строка; теперь нота — за лазером, а строка задаёт только октаву (внутренняя треть колец — низ, средняя — середина, внешняя — верх), иначе «своя нота у лазера» потерялась бы в разбросе по строкам. Луч, прошедший все строки, больше не уходит за край, а продолжает в кольцо для заполнения (оно же строка под чертой в поле): там ячейка всегда перещёлкивается 1 → 0 → 1 → 0 при любом правиле, «1» звучит. Строку для заполнения лазер только пишет; в поле её по-прежнему отправляет +. Головки за шаг идут по очереди, и общая ячейка (у строки 1 она одна на весь круг) достаётся им цепочкой — каждая видит то, что оставила предыдущая. Одинаковые ноты за шаг звучат один раз, голосов разом — до 12. Лучи рисуются поверх кольца для заполнения, чтобы головку в нём было видно.
Zazerkalius v0.441 — «конус — сделай музыкальный инструмент, автомузыкальный: лазер — это головка, ходит по кругу — музыкальный режим лазера; на битах ноты, биты сам делает: в 0 стреляет — 0 переворачивается в ноту, в следующий раз попадает в неё — там уже 1 — нота; нота — в зависимости от строки». В «Лазере» конуса — 🎵 музыка. Головка — луч из центра — идёт по кругу по часовой, за шаг на 1/T круга (T — бит в самой длинной строке), темп — ♩ «Звука». На каждом шаге луч идёт наружу кольцо за кольцом: «1» под ним звучит нотой своей строки, и луч идёт дальше; «0» становится «1» (нота записана), и луч здесь стоит. Правило для «1» после звука выбирается рядом: счёт (по умолчанию) — она снова «0». Так каждый луч работает как двоичный счётчик с младшим битом в строке 1: строка 1 звучит через шаг, строка 2 — реже и так далее, и ритм складывается сам, как в драм-машине — отсюда и имя репозитория. Буквальное «1 остаётся» (копит) тоже есть, но в нём рисунок только растёт, пока каждый луч не станет сквозным аккордом всех строк, — поэтому это не умолчание. Высота — по строке: строка 1 ниже всех, дальше вверх по ладу «Звука» (три октавы по кругу). Тембр «🎨 разные» у каждой строки свой, голосов разом не больше 8. Биты пишутся прямо в строки поля, а не в отдельный слой краски, как у луч-часов: так новый рисунок сразу виден и в поле, и на конусе, и с ним работают все прочие окна. При пуске ставится точка отмены (↩ вернёт строки), а луч-часы и солнце выключаются: у них ячейки колец пустые. ∅ обнуляет все строки той же длины, и лазер набирает ноты с нуля. Головку на конусе видно золотым лучом до записанной ноты, звучащие биты — обводкой «◉ показать».
Zazerkalius v0.440 и Гранидус v0.069 — «самое главное — натянуть Аниматрицу на ТриРамидус», «ромбы из кадров», «раскадровка — развёртка есть», «на html — Зазеркалиус»; на вопрос выбрано: кадры листаются, видеть и на развёртке, и на 3D-теле. В «✦ Развёртке» — ◇ ромбы из кадров, высота ромба (8 / 16 / 32 / 64 строки поля, как шаг ◇ сетки в Code), ⏱ мс на кадр и ⏸. Поле строк режется на ромбы в своих координатах (строка r, место q, в строке r + 1 бит): ромб высотой 2h с вершиной (e·h, j·h) — стороны вдоль двух диагоналей треугольника, ряд e — e + 1 ромб, как в Code. Горизонтальная диагональ режет ромб на две грани тела: верх — на Ui (ряд k от T), низ — на Di (ряд k от B, место 0 у того же угла экватора, что у верха), так что на ребре экватора половины сходятся; пара Ui + Di — это и есть ромб развёртки «В». Пары граней берут ромбы подряд, кадр сдвигается на один каждые N мс; при идущей Аниматрице ромбы меняются вместе с волной. Низ ромба — настоящий низ картины, а не инверсия верха, поэтому Гранидус научился держать у нижних граней свои биты (botBits): их приносит новое сообщение zz-rhombs; любая другая новая картина (строки, свои биты, ↻) снимает их — низ снова зеркало. В Гранидус ромбы уходят при «⇄ строки → грани», по одному на пару граней (у Зеркалидуса три, у октаэдра четыре). На развёртке ромбы — только на крупной; малые картинки — как были.
Просмотр GIF v0.002 — «вооот, супер; тут надо масштабировать колёсиком, а также клик — выбор определённого набора GIF и его раскладки, и т. д., так же с размерами ромбов и треугольников». Колесо над картинкой — масштаб к курсору (точка под курсором стоит), мышью — тянуть, когда картинка больше окна, клавиша 0 — вписать. Галка у GIF в списке — в набор (☑ все / ☐ никого); набор играет разом, кадр в кадр (короткие — по кругу), раскладкой: ⇢ в ряд, ⇣ столбиком, ▦ сеткой, △ треугольником (ряды 1, 2, 3 …), ◇ ромбом (1, 2 … n … 2, 1). Клетка — самый большой GIF набора, GIF по центру, между клетками тёмная щель; у треугольника и ромба — размер в рядах (0 — наименьший, куда влезает набор), клетки заполняются GIF набора по кругу — так один ромб складывается в большой треугольник или ромб. 💾 раскладку GIF — все кадры с выбранным шагом одним файлом, 🖼 PNG — то, что на экране.
Треугольник v0.044 — по снимку «🔺 Формы → Правило 90» — «разве это 90? каждая строка же на 1 бит должна быть больше» и «да, добавь Паскаль mod 2». Правило 90 нарисовано верно: строка растёт на 2 бита (клетка смотрит на левого и правого соседа, узор за шаг расходится на клетку в обе стороны), а половина её нулей — клетки чужой шахматки, пустые всегда. Без них остаётся треугольник Паскаля по модулю 2, где строка растёт ровно на 1 бит. В «Генератор Форм» добавлен пункт 🔺 Паскаль mod 2 (+1 бит): от сида (любая строка из 0 и 1, иначе «1») каждая следующая строка — обкладка нулями по краям и XOR каждой пары, n бит → n + 1, как 🔺+1 в Zazerkalius. Строки разной длины и рисуются по центру, каждая следующая — со сдвигом на полсимвола. Без «Обрезать фон» строки дополняются нулями с обеих сторон почти до прямоугольника: длины через одну отличаются на 1, иначе полусдвиг пропал бы. При «Вживить» строки встают по центру фигуры, а не от левого края. В «◆ ромбах» у таких строк шахматки нет: каждый бит — ромб шириной в символ и высотой в две строки, ряды вкладываются друг в друга. Распознаётся по длинам первых двух строк разной чётности.
Треугольник v0.043 — «в режиме ромбов нужно строки вкладывать как бы друг в друга: нижний треугольник ромба на уровне верхнего треугольника следующей строки». Биты «◆ ромбы» на главном холсте были ромбами, вписанными в свою клетку (ширина символа × интервал): клетки треугольника стоят шахматкой, и между рядами оставались пустые ромбические щели. Теперь у клетки на шахматке вершины (x + y той же чётности, что вершина) ромб на две строки и два символа — полудиагонали равны интервалу и ширине символа; соседи по диагонали делят с ним ребро, и нижняя половина ромба стоит вровень с верхней половиной ромбов следующей строки — сплошная ромбовая решётка. Клетки вне шахматки (в тексте бывают, например «1 10101 1») рисуются маленьким ромбом в клетке поверх, в узле, где сходятся четыре больших, — иначе большие налезали бы друг на друга (так было в Просмотре GIF v0.013). Обводка клеток и мелкий кегль (запись в буфер) — тем же размером. Прежний вид — пунктом «◇ ромб в клетке». При 🔝 закрепе первая строка опускается ещё на полстроки, чтобы верхний ромб не срезался. Следом — «эти режимы вынеси кнопками прямо на холст»: 10 ■ ◆ ◇ строкой по центру холста, сразу под полосой вкладок (у краёв холст обычно закрыт плавающими окнами — первая попытка поставить их у правого края и у столбца круглых кнопок пряталась под «Движением» и «3D»). Кнопка ставит значение списка «Биты» и шлёт ему change — выбор запоминается так же; выбранная подсвечена. Место под полосой меряется наблюдателями; 🔝 закреп опускает строки и под кнопки. В дзене кнопки прячутся вместе с прочими.
Треугольник v0.042 — по снимку верха холста (полоса «👁 Вид · 🎨 Цвет · ◇ Сводка · 🔍 Крупно» поверх вершины треугольника) — «когда прижат к верху 1 строка — опусти ниже, меню закрывает биты». Полоса вкладок висит поверх холста (fixed, 8 px от верха), а при 🔝 закрепе первая строка рисовалась у самого края холста — прямо под ней. Теперь при закрепе строки начинаются под полосой: отступ — её низ от верха холста + 4 px. Меряется не на каждом кадре (getBoundingClientRect заставляет браузер пересчитывать раскладку — то, от чего Code уже уходил), а наблюдателями: размер полосы и холста, окно, класс body. В дзене полосы нет — отступ 0, первая строка снова у края. Выбор щелчком в «🔍 Крупно» берёт тот же startY, сдвиг его не сбивает.
Просмотр GIF v0.020 — по снимкам ромба 4 в «■ квадратах» и «◆ ромбах вплотную» и снимку холста Треугольника — «тут нужно только ромбы, почему вместе с квадратами? Вот так надо, как в Треугольнике». При нарезке всё, что в рамке ромба, но вне его, заливалось серой щелью раскладки (16, 18, 24). У форм клеток щели рисуются квадратами поверх, чтобы ромбы в раскладке набора резались по рамке клетки, — и вокруг ромба вставали серые квадраты, а крайние ромбы-клетки обрезались по ним. Теперь вокруг ромбов нарезки — свой фон: на вид чёрный (0, 0, 1), для поиска нулей он граница куска, как щель, но квадратами не рисуется. Так же чёрным — лента кадров «по одному» и 💾 GIF нарезки. Сцене нарезки дано поле в одну клетку: штамп ромба вплотную выходит за свою клетку на полклетки, и на вершинах большого ромба его обрезал край холста.
Просмотр GIF v0.019 — по снимку «🔍 Крупно» Треугольника — «неправильно режет ромбы, смотри как в Треугольнике все норм». Сетка ромбов в нарезке та же, что в Треугольнике (вершина и наклон из кадра: у GIF 526–781 — клетка в 1 px, вершина (512, 18), наклон 1), отличалась граница. В Просмотре ромб был полуоткрытым: клетка на ребре доставалась одному ромбу — тому, у кого это верхнее ребро, так что у каждого ромба оставались верх и боковые верхние рёбра, а нижние рёбра и нижняя вершина уходили соседям; высота — s строк вместо s + 1. В Треугольнике ромб замкнутый (строки 0 … S, полуширина min(d, S − d)): все четыре ребра его, соседи делят общее ребро. Теперь и в Просмотре так же; проверено функциями страницы — у ромбов 2, 8, 64 каждая клетка каждого ромба совпадает с формой Треугольника. Нижний ряд ромбов берётся, только если нижняя вершина внутри кадра: у 1025 × 530 ромбов 64 стало 105 (ряды 0 … 13), как в «Сводке» Треугольника, а не 120.
Просмотр GIF v0.018 — «каждый второй ромб всё равно так же». Разобрали сам GIF 526–781: нечётные проходы (526, 528 …) — редкая шахматка, как положено; чётные (527, 529 …) — тот же узор, нарисованный дважды со сдвигом на одну клетку («двойная экспозиция»): заняты обе шахматки, клетки стоят парами и столбиками. Каждая шахматка по отдельности — чистый узор; вторая почти совпадает со следующим проходом, сдвинутым на строку вниз (расхождение ~10 %), — похоже, Code писал GIF с включённым зеркалом или вторым слоем. Значит, наложение — не от формы клеток: любая форма на таком кадре налезает. Переключатель шахматка рядом с формой: ◇ вершины (по умолчанию) / ◆ вторая / ▦ обе — гасит клетки другой чётности x + y на холсте, в ленте кадров «по одному» и в PNG (GIF-файлы — исходными пикселями). С одной шахматкой даже «◆ ромбы вплотную» дают чистую ромбовую сетку без «сердечек».
Просмотр GIF v0.017 — по снимку ромба 128 (белые поля, тёмные ромбы-«сердечки» с откусанными углами) — «как так накладывается?». Воспроизведено функциями страницы: это «◆ ромбы вплотную» на чётном кадре, где в GIF заполнены обе шахматки — ромбы одной сливаются в белые поля, точки другой рисуются узлами и откусывают углы у ромбов-нулей. А вплотную стояло само: до v0.013 значение «rh» было у «◆ ромбов», с v0.013 — у «вплотную», и Chrome при F5 восстановил выбор по значению. Урок: меняя смысл значения в списке, браузерное восстановление формы подставит старое. Списку формы клеток — autocomplete="off": после обновления всегда ◆ ромбы в клетке.
Просмотр GIF v0.016 — по снимку «◇ Нарезка по ромбам · Резать · ромб 512» — «при включённой кнопке чтобы сверху на холсте появилось меню всех размеров сразу, ромбы от 2, 4 … до 512 (максимум определить по размеру самого GIF), при нажатии на один — показать внизу кадр за кадром в строку, а на холсте в центре одну, и когда проигрывать — внизу выделять текущий». При «◇ Резать» поверх холста — полоска размеров 2, 4, 8 … (до наибольшего, что влезает от вершины до низа GIF; у 1025 × 530 — 512). Щелчок — раскладка «по одному»: в центре холста один ромб (первый, сверху), под холстом — лента его кадров (высота 56 px; мелкий ромб — крупными клетками, крупный — уменьшенным), подпись — номер кадра, текущий подсвечен жёлтым и держится на виду, щелчок — к кадру; «нечётные / чётные» прореживают ленту. Картинки ленты рисуются кусками по 25 мс. Лента «по одному» теперь — фильм ОДНОГО ромба: прежняя «все ромбы × все кадры» у ромба 2 (130 тыс. ромбов × 256) — 33 млн мест. Соседний — ◇◀ ▶◇ / PageUp PageDown (за последним — следующий размер у «всех»); при игре без 🔁 в конце фильма открывается следующий ромб (так «по очереди» из v0.010 сохранилось), с 🔁 — этот же по кругу. В выбор размера добавлены ромбы 2 и 4.
Треугольник v0.041 и Просмотр GIF v0.015 — «в Треугольнике есть сетка?» — ответ: ▦ в 🗻 3D (v0.040), «◇ Ромбическая сетка» (диагонали через N символов) и слой «Сетка» (шахматка 1010 за строками), а обводки каждой клетки на холсте нет; «да» — добавить, и следом «в кнопках отдели сетку-фоновую от этой новой». Новое везде зовётся обводкой клеток, фоновое — Сетка-фон (подпись в палитре; кнопка «Сетка» в «Файле» не тронута). Главный холст: строка «▢ Обводка клеток» с цветом (выключена) под «Битами» — контур каждой клетки 0 и 1 в её форме: у «◆ ромбов» ромб клетки, у «■ квадратов» и знаков — прямоугольник клетки; контуры копятся в один путь и обводятся 1 px в конце кадра; на кегле меньше 4 px и в кольцевом виде не рисуется. «🔍 Крупно», лента кадров, сводка — та же галка и цвет (ромб чуть больше вписанного, квадрат — внутри клетки; от 4 px). В 🗻 3D «▦ сетка» переименована в «▢ обводка», в Просмотре GIF кнопка ▦ стала ▢.
Треугольник v0.040 — по снимку окна «🗻 3D» (поле пирамид, клетки на гранях квадратами) — «сюда тоже сетка и ромбы». Текстура граней была кадром «клетка = пиксель», при увеличении — квадраты. Теперь она в m точек на клетку (3 … 8, не больше ~12 млн точек; у текста 512 строк — m = 4), клетка — ◆ ромб, вписанный в неё, как на главном холсте (или ■ квадрат — выбор в новой строке окна), и ▦ сетка — галка (выключена) и цвет: тонкая обводка каждой клетки 0 и 1, у ромбов кольцом вокруг, у квадратов по краям (верх и лево всегда, низ и право — у края, чтобы линия между соседями не двоилась). Грань рисуется тем же аффинным отображением, источник берётся в ks раз крупнее; при уменьшении включено сглаживание — иначе ромбы рябят. Цвета собираются номерами в байтах и разворачиваются одним проходом. Огромный текст (меньше 3 точек на клетку) — квадраты. То же и в 🎞 GIF / видео цикла: каждый кадр строит ту же текстуру.
Просмотр GIF v0.014 — «добавь возможность показа сетки, по умолчанию отключи, и настройки цвета её (это граница, обводка тонкой линией всех ромбов-квадратов)». Рядом с формой клеток и «0» — кнопка ▦ (выключена) и выбор цвета (по умолчанию серо-синий #56627a). Сетка — обводка каждой клетки в её форме: светлых и нулей на шахматке, у квадратов — всех точек внутри картинки (как пиксельная сетка). Первый вариант обводил по краю самой формы — у ◆ ромба в клетке при m = 4 в нём всего несколько точек, и край съедал его целиком: единицы стали неотличимы от сетки. Теперь у ромбов и кругов обводка — кольцом снаружи клетки и рисуется под клетками: форма целая, у ромбов вплотную кольцо ложится в щель между соседями. У квадратов — линия по верху и левому краю поверх, соседи делят её, и сетка выходит в одну линию. Сетка включает крупную картинку и у квадратов.
Просмотр GIF v0.013 и Треугольник v0.039 — по снимку «почему-то каждый 2-й кадр с наложением ромбов на пол-размера» и следом «в основном холсте норм». Замер по GIF 526–781: в нечётных кадрах у вершины светлые точки только одной чётности x + y (шахматка, 6474 : 0), в чётных — обеих поровну (4506 : 4424): заполнены и промежутки между клетками (у вершины «###» вместо «#.#»). Ромб «вплотную» (радиусом в клетку, v0.011 / v0.038) на такой картинке налезает на соседей на полразмера. Пробовали оставить вплотную и рисовать точки вне шахматки маленькими узлами — узлы сшили соседние ромбы в сплошные пятна. Решение — как на главном холсте Треугольника, который пользователь назвал нормальным: ромб вписан в свою клетку и ни с кем не смыкается. Просмотр GIF: «◆ ромбы» по умолчанию — вписанные; «◆ ромбы вплотную» — отдельным пунктом (шахматка — от вершины треугольника, в нарезке ромбы встают со сдвигом, не сбивающим её; точки вне шахматки — узлами). Треугольник, «🔍 Крупно» и всё, что рисует та же функция: подложка фигуры — тусклыми квадратами, 0 и 1 — вписанными ромбами.
Треугольник v0.038 — по снимку окна «🔍 Крупно» (ромб из квадратных клеток) — «в Треугольнике тоже по умолчанию нужно представление ромбами» (следом за «◆ ромбами» Просмотра GIF v0.011). Крупная картинка, лента кадров под ней, грани пирамиды, ⊕ XOR и строки сводки рисуются одной функцией — теперь она рисует клетку ромбом радиусом в клетку вокруг её центра: биты текста правила 90 стоят шахматкой (между ними пробелы-прокладки), поэтому соседние по диагонали ромбы смыкаются рёбрами. Сперва пробелы (тускло), поверх 0 и 1; на каждый цвет — один путь и одна заливка. Мельче 3 px ромб не разглядеть — там по-прежнему квадраты. Галка ◆ ромбы рядом с «такие же» (включена) возвращает квадраты. Главный холст не тронут: у него своя «Форма битов» (1 0 знаками / ■ / ◆) во «Фигуре».
Битмультфильмы v0.011 — «Иероглифы Аниматрицы — уменьши картинки на странице, огромные там». Карточки растягивают снимок на всю ширину колонки (~390 px), а снимки иероглифов узкие и высокие: столб «пингвин» 144 × 682 вытягивался почти до 1900 px в высоту, «交» 292 × 670 — до ~900. В этом разделе рамка теперь одной высоты — 340 px, снимок вписан в неё целиком (object-fit: contain, поля чёрные), клетки не размываются (pixelated); щелчок по-прежнему открывает крупно. Остальные разделы не тронуты.
Просмотр GIF v0.012 — по снимку «5000 / с · ▲ ▼ 0 · сдвиг 543 столб.» — «тут дёргается при изменении текста, и скорость ещё больше надо». Подписи скорости и сдвига меняли ширину с каждой цифрой, и строка кнопок переливалась. Теперь это поля постоянной ширины (15 и 20 знаков) с цифрами одной ширины — тот же приём, что у счётчика кадров в v0.003. Скорость прокрутки — до 1 000 000 прыжков в секунду (было 5000); ползунок 0 … 1000 вместо 0 … 100, чтобы на больших скоростях шаг был мельче; по умолчанию — те же ~30 / с. Число скорости — с пробелами по разрядам. Сдвиг при таких скоростях растёт быстро; раньше за 10¹² он сбрасывался в ноль (скачок картинки), теперь сворачивается по W·H: у каждой полосы сдвиг × целый множитель берётся по модулю W и H, поэтому картинка остаётся той же.
Просмотр GIF v0.011 — «в просмотрщике можно менять форму 1 и 0? сейчас там квадраты, хотелось бы по умолчанию ромбы». Разобрали GIF 526–781: у вершины клетки лежат чистой шахматкой (x + y одной чётности — соседние строки сдвинуты на полклетки), это и есть ромбовая сетка; ниже строки 274 около 9 % клеток другой чётности (слои накладываются). Рядом с масштабом — форма клеток: ◆ ромбы (по умолчанию; ромб радиусом в клетку вокруг её центра — соседи по диагонали смыкаются рёбрами с тонкой щелью), ◇ ромбы в клетке, ● круги, ▪ квадраты (как в самом GIF). Кнопка 0 (включена) — нули внутри картинки тусклыми клетками той же формы: чёрные между первой и последней светлой в строке (по кускам между щелями раскладки нарезки), той же чётности, что первая светлая, — видна вся сетка. Сцена рисуется в m раз крупнее (3 … 12, не больше ~12 млн точек; у GIF 1025 × 530 — m = 4), прокрутка и масштаб берут её вместо исходной; форма включается от увеличения ×2 — мельче её не разглядеть, а сглаживание замылило бы. Первый вариант строил кадр 0,4 с: 32-битные цвета (больше 2³¹) в горячем цикле с вызовом штампа движок упаковывает поштучно. Переделано: цвета — в номера 0…255, штамп — строками по байтам, цвет разворачивается одним проходом в конце; буферы общие на все кадры — 40–90 мс на кадр. PNG сохраняется с формой клеток, GIF-файлы — исходными пикселями.
Просмотр GIF v0.010 — на вопрос «все группы рядом, каждый размер своим GIF или каждый ромб своим маленьким фильмом?» — «каждый ромб своим маленьким фильмом, но это прямо тут сохранить — отдельной кнопкой, если нужно будет, а так всё в редакторе». Раскладка по одному ромбу: лента — весь фильм ромба 1, потом ромба 2 … (ряд за рядом, слева направо), по выбранным размерам (все — от мелких к крупным). ◇◀ ▶◇ и PageUp / PageDown — соседний ромб на том же кадре; двойной щелчок по ромбу в группе — он один, тот же кадр. 💾 ромб — фильм этого ромба одним GIF, только по кнопке (мелкий ромб увеличивается, до 256 px). Внутри: ромбы размера режутся один раз (откуда в кадре и где в своей рамке), группы «на местах / в строку / сеткой» собираются из них. Полоска-график считается раз на ленту и при ленте длиннее полоски берёт наибольшее по столбику: «все, по одному» — это 2667 ромбов × 256 кадров ≈ 680 тыс. мест. Проверено функциями страницы на GIF 526–781: ромбов 16 — 2016, 64 — 120, 128 — 28, 256 — 6, 512 — 1; площадь ромба 64 — 2048 px (64·64/2), сумма ромбов = пиксели группы.
Просмотр GIF v0.009 — по снимку «◇ 64 × 0» — «пустые картинки». Размер ромба в v0.008 умножался на «строку … px» из прокрутки, а у пользователя там стояло 64: ромб 64 стал 4096 px и в кадр 530 px не влез ни одним — группа из нуля ромбов. Размер ромба теперь — px кадра, от прокрутки не зависит. Проверено функциями страницы на том же GIF: вершина (512, строка 18), наклон 1; ромбов 8 — 8128, 16 — 2016, 32 — 496, 64 — 120, 128 — 28, 256 — 6, 512 — 1. Заодно «в строку» переносится по ширине кадра: была лента до 8192 px, и в окне всё мельчало до ×0.1.
Просмотр GIF v0.008 — по снимку столба ромбов (вершина треугольника, под ней чёрный перевёрнутый треугольник, крест, снова ромбы) — «как по сетке ромбов разрезать и потом их проиграть по порядку своих размеров в группу». ◇ Резать (левая панель, под набором): кадр режется по сетке ромбов от вершины треугольника — вдоль обоих рёбер, шагом в размер ромба; берутся только целые ромбы, ряд r — r + 1 ромбов. Вершина и наклон находятся сами: цвет клеток — самый частый не чёрный (подпись «проход … · кадр …» жёлтая и не мешает), вершина — первая строка с ним, наклон — полуразмах самой глубокой строки на её глубину. Ромбы одного размера показываются группой: на местах (раздвинуты зазором), в строку (ряд за рядом, слева направо) или сеткой. Размер — 8 … 512 строк или все: весь фильм ромбами 16, потом 32, 64, 128, 256, 512 (или от крупных к мелким), группы идут подряд. Строка — px из поля «строка» у прокрутки. Нарезка строится картой «откуда — куда» один раз на размер и раскладку, дальше кадр кладётся одним проходом. 💾 GIF — нарезка одним GIF, группы по центру общего поля. Попутно: чётность кадров (нечётные / чётные) теперь по номеру кадра в GIF, а не по месту в ленте — в склейке и нарезке они разные.
Просмотр GIF v0.007 — разбирали GIF «Аниматрица шаг1 проходы 526–781» (256 кадров): ромбы то растут, то сбрасываются, а соседние кадры мигают — чётные вдвое плотнее нечётных (кадр 3 — 13 % светлого, кадр 4 — 41 %), поэтому смотреть надо через кадр. Слово пользователя: «да (поле кадра, только нечётные), и потом надо разобрать весь гиф, поделить на ромбы различной длины и сортировать по чёт / нечёт, и ещё как, и просто по порядку». Сделано: поле кадр №; все кадры / нечётные / чётные — листание, игра и участок в склейку идут только по своим кадрам (шаг 1 становится 2). ◇ Разобрать — в каждом кадре доля пустых ромбов: чёрных мест не меньше 15 px в поперечнике, считая только внутри картинки (в строке — от первой светлой точки до последней, фон вокруг треугольника не в счёт). По ней GIF режется на участки отдельно по нечётным и чётным кадрам: ромб — пока дыры есть и не падают больше чем на 10 %, упали — сброс, новый ромб; без дыр — шум. Участки ложатся в склейку (только ромбы / весь GIF / только шум; чёт, нечёт или оба). У этого GIF ромбы вышли длиной 6, 5, 16, 5, 16, 16, 16 кадров на каждую чётность — похоже на счёт степенями двойки. Порог сброса сперва был 15 %, и чётные 210 → 212 (падение 14 %) не резались, а нечётные 211 → 213 резались — поставлен 10 %, чтобы чёт и нечёт делились одинаково. ⇅ сортировать склейку: по порядку, нечётные / чётные вперёд, длинные / короткие вперёд, крупные / мелкие ромбы вперёд, ромбы потом шум, наоборот, вперемешку. Под ползунком — полоска-график дыр по кадрам (нечётные жёлтым, чётные голубым), щелчок и протяжка — к кадру.
Просмотр GIF v0.006 — «очень занимательно, надо постолбцовую ещё свёртку, нарезку» и «если не ромбовую…». У ⇅ Прокрутки — ось: ≡ по строкам (как было), ‖ по столбцам, ↘ и ↙ по диагонали — вдоль рёбер ромбов; направление — вперёд, назад, туда-сюда. Нарезка: сцена режется на полосы шириной в прыжок поперёк движения (по столбцам — горизонтальными лентами, иначе — вертикальными): целиком — всё вместе; полосы встречно — соседние едут в разные стороны; полосы лесенкой — каждая следующая сдвинута на прыжок больше, картину скашивает и закручивает. Точка экрана берёт точку сцены со сдвигом по кругу, каждая полоса — до четырёх кусков сцены.
Просмотр GIF v0.005 — «у GIF общая сцена — надо строчную прокрутку вверх-вниз, туда-сюда, на огромных скоростях; задавать шаг прыжков размерами ромбов или треугольников». Новая строка под участками: ⇅ Прокрутка — сцена (один GIF или вся раскладка) крутится по кругу, как барабан строк: ↓ вниз, ↑ вверх, ↕ туда-сюда (размах — прыжков в одну сторону, потом обратно); прыжок — 1, 2, 4, 8 … 512 строк (размер ромба или треугольника), строка — сколько px в GIF (у GIF из Code клетка 2–4 px); скорость — 1 … 5000 прыжков в секунду, на больших за кадр экрана делается сразу много прыжков. ▲ ▼ и стрелки ↑ ↓ — прыжок вручную, 0 — сдвиг в ноль; кадры при этом играют и листаются как обычно. Картинка сцены строится заново, только когда сменился кадр или набор, — прокрутка лишь сдвигает её при выводе, поэтому быстрая. (Сделано поверх v0.003–v0.004 другой сессии.)
Просмотр GIF v0.004 — «пауза по щелчку». Щелчок по картинке без протяжки ставит паузу и снова запускает, как пробел; протяжка мышью, как и прежде, двигает вид.
Просмотр GIF v0.003 — по снимку «склейка кадр 13 / 64 · Zerkalius-romby-… #49 · 250 мс» — «тут текст прыгает, название файла надо в сторонку». Счётчик кадра и имя файла стояли одной строкой у ползунка; в склейке имя меняется от кадра к кадру, строка то длиннее, то короче, и ползунок с текстом дёргались. Теперь это два поля постоянной ширины: счётчик у ползунка, имя с номером кадра — в стороне, бледнее, длинное — с многоточием, целиком — в подсказке.
Zazerkalius v0.779 — по снимку торов: «у строки 3 вырез вверху — почему-то не соответствует», «2 подряд строки вверх битами». Причина: ⟲ «всё на места» расставляет кольца с вырезами симметрично (чётные — биты сверху, нечётные — вырез сверху) только в плоском виде (coneCutHome ждал coneCutOn, а в 3D он выключен). В 3D кольца вставали в повороты из ⭐, да ещё округлённые до целых бит (coneRotKeep). Теперь при ◎ торах с вырезами ⟲ расставляет так же, как на плоскости (и сбрасывает фазу кручения), а половины частей у колец сохраняются.
Zazerkalius v0.780 — «переходим в 3д Соляриус»: в 3D лазер и солнце были выключены целиком (с v0.373 все группы Solarius гасли). Теперь с «◎ торами» они работают: торы лежат в одной плоскости, поэтому расчёт ровно тот же, что в плоском виде (те же углы и кольца, строки за чертой строятся так же), а плоский слой света — лучи, освещённые сектора, кольцо за чертой, пустые кольца — рисуется на плоскость торов аффинной проекцией (cone3Aff). Масштаб торов — как у плоского вида (d = шаг кольца), кольцо строки i плоского вида [i·d, (i + 1)·d] = тор этой строки. Без ◎ (кольца на разных высотах) — как было: в 3D не считается, подсказка у групп говорит, что включить. Мышь в 3D по-прежнему вращает вид, кольца не берёт.
Zazerkalius v0.781 — «вообще надо к бипирамиде прийти: в каждой строке T−1 ячеек — это их предыдущей строки биты»; сперва в 2D, «два варианта надо смотреть». В «вырезах T−1» кольцо строки n — 2n − 1 частей, и вырез (n − 1 частей) как раз вмещает предыдущую строку, если в ней n − 1 бит. Кнопка «◇ пред.» в «Щелях» (Z.cutPrev): «блоком» — свои биты подряд, как были, вырез заполнен битами предыдущей строки по порядку; «через 1» — как ряд треугольника ▲▼▲▼▲ (часть 2j — свой бит j, часть 2k + 1 — бит k строки выше), то есть кольцо — ряд грани бипирамиды. Чужие биты бледнее своих, границы — между всеми частями; Ctrl + щелчок по чужой ячейке меняет бит в той строке. Видно и в 3D-торах. Пока это вид: лазер и солнце считают вырез как раньше (при «через 1» свои биты стоят не там, где их видит свет). Бипирамида в 3D — следующим шагом.
Zazerkalius v0.782 — «делай любой пока, потом посмотрю, без меня» (к бипирамиде): «◇ бипирамида» в группе «3D» (Z.coneBipy, вариант Z.coneBipyM, ряд кнопок «◇ нет / через 1 / блоком»). Конус в объёме без ◎ торов: кольцо строки n (n ≥ 2) — 2n − 1 ячеек, свои n бит и n − 1 бит строки выше; «через 1» — как ряд треугольника ▲▼▲ (выбран основным: так кольцо и есть ряд грани), «блоком» — свои подряд, чужие следом. Под основанием всегда зеркало с инверсией (0 ↔ 1), как в «Гранидусе», — вместе пирамида и её отражение, бипирамида. Биты строки выше бледнее, границы 0→1 / 1→0 — между всеми ячейками. Свой вариант заведён потому, что «◇ пред.» из «Щелей» живёт в группах Solarius, а они в чистом 3D гаснут. Кручение — целыми своими битами (через одну — две ячейки за бит).
Zazerkalius v0.783 — «адаптируй мобильную версию: там кнопки во весь экран, ничего не видно». Снимки в размере телефона (390 px) показали: первый экран целиком занимали группы левой панели, конус начинался ниже экрана; полоса над строками растягивала страницу до 955 px вбок; окно «Текст конуса» висело поверх строк; а при каждой перерисовке строк scrollIntoView текущей строки уводил всю страницу к полю (тронул кнопку под конусом — экран прыгнул). Теперь на узком экране: левая панель свёрнута в «☰ Панель» (ромбы записи и дзена — только при открытой); шапка и полоса над строками — одной строкой с прокруткой вбок; на «◯ Solarius» (solo) конус первым, сразу под шапкой, холст прилипает к верху, кнопки групп листаются под ним; «Текст конуса» — в общем потоке; текущая строка прокручивает только само поле (scrollNear). Порядок блоков задан явно: на столе у них свои order для сетки, и в столбике поле уезжало в самый низ. Стол (шире 760 px) не тронут.
Zazerkalius v0.784 — «◇ бипирамида тормозит: каждый круг остановка небольшая». Поворот кольца из 2n − 1 ячеек брался «в своих битах ×2» (блоком — ×1), а счёт кручения на каждом круге перескакивает с n на 0: у обычного кольца из n бит это незаметно, а здесь кольцо прыгало на ячейку назад — это и была остановка. Теперь поворот — тот же угол, что у обычного кольца (n бит оборота = 2n − 1 ячеек), круг замыкается без скачка.
Zazerkalius v0.785 — «делай» на «свет на бипирамиде не считается» и «кольца круглые, под 2n − 1 ячеек не подгонял». Грани: при «⬡ многоуг.» кольцо бипирамиды — (2n − 1)-угольник, ячейка — сторона (вершина — точка, строка 2 — треугольник, дальше 5-, 7-, 9-угольники). Свет: бипирамида вошла в coneSol3d — лазер и солнце в 3D считаются так же, как в плоском виде, и группы Solarius не гаснут. Плоский слой света на неё не кладётся (кольца на разных высотах — пробовал на плоскость основания, вышел один диск поверх фигуры), свет рисуется прямо на кольцах в объёме: ☀ — освещённые дуги по внутреннему краю колец, ⌖ — луч ломаной от вершины по кольцам до стены (красная точка) или насквозь за основание. При лазере / солнце в «вырезах T−1» кольца бипирамиды встают ровно в плоскую раскладку (поворот в частях и сдвиг выреза), чтобы свет падал на те же ячейки; «блоком» совпадает с расчётом точно, «через 1» — свои биты стоят не там, где их видит свет (как и у «◇ пред.»).
Zazerkalius v0.786 — по снимку: «текст этот под меню, и не вытащить его». Таблица «Σ расчёт» торов рисовалась на холсте у верхнего края, а вкладки групп и плавающие группы лежат поверх холста — таблица оказывалась под ними, и взяться за неё было нельзя (сперва пробовал тянуть её по холсту — мышь всё равно попадала в группы). Теперь это своя плашка (#coneTorInfo) в теле окна конуса, над группами: тянется мышью или пальцем за любое место, место помнится (Z.coneTorInfoXY), за край окна не уходит, двойной щелчок — на место по умолчанию (ниже вкладок). Галка «Σ расчёт» её прячет, как прежде.
Zazerkalius v0.787 — разбор с пользователем: кольцо строки n в ряду треугольника — ▲ свои биты и ▼ между ними; отражение строки вниз, через черту, ложится ровно на середину следующей строки. «1 с первой даёт 0 в центр 2, потом снова 1 в центр 3» — значит, зеркало инвертирует: ▼ строки n = НЕ ▲ строки выше (центр по строкам 1, 0, 1, 0…), а внутренняя ▲ = НЕ ▼ строки выше = ▲ строки через одну со сдвигом на одну: s[n][j] = s[n−2][j−1]. Свободны только два крайних бита каждой строки, строки 1 и 2 — целиком. «Да, делай оба»: (1) в «◇ пред.», торах и «◇ бипирамиде» биты строки выше в ▼ теперь инвертированы (в v0.781–v0.786 стояли как есть); (2) кнопка «◇ строить» (группа «3D», рядом с «◇ нет / через 1 / блоком») перестраивает строки поля сверху вниз по этому правилу — там, где они идут подряд по длине (n − 2, n − 1, n); крайние биты не трогает, ↩ вернёт, замок строк ⛔ не пускает. Проверено: 1, 10, 000, 1111, 00000, 110011 → 1, 10, 010, 1101, 00100, 111011.
Zazerkalius v0.788 — разбор продолжился: «1, 11, 111 → 1000 — это внахлёст? похоже сдвиг». Внахлёст (v0.787) строка 4 была бы ?11?; «1000» = 1 + не(111) — ▼ строки 4 (не ▲ строки 3 над ними) съезжают на полклетки и становятся её ▲. Правило пользователя: «с самого верха, 1 первый бит слева каждой T строки + 1» — строка n + 1 = её левый бит + инверсия строки n, строка 1 своя; «3 пробуем». Сделано: (1) «◇ сдвиг» в полосе над строками — перестраивает строки сверху вниз по этому правилу (где каждая на бит длиннее предыдущей; левый бит не трогает; ↩ вернёт): 1, 11, 111, 1000, 00000, 110011 → 1, 10, 101, 1010, 00101, 111010; (2) «▲▼» там же («в строках бы такую кнопку, чтобы всё так же показала») — поле строк треугольником: клетка — треугольник с цифрой, ▲ — бит строки, ▼ — инверсия бита над ним (бледнее), ряды по центру сами складываются в треугольник; только вид, щелчок по ряду — текущая строка, первые 400 строк. При сдвиге в этом виде каждая ▲ (кроме левой) равна ▼ слева от неё — пары одного цвета.
Zazerkalius v0.789 — «мне бы ещё спецочки для обнаружения изменённых треуглов — цветом выделить фоном, кнопку, а то всё очень интересно и очень запутанно». Рядом с «▲▼» — «👓» (Z.triGlass), щелчок по кругу: «👓 изм.» — золотом клетки (▲ и ▼), чьё значение другое, чем до последней правки (сравнение с ↩-снимком: после «◇ сдвиг», «◇ строить», правки строки); «👓 пары» — золотом ▲, которая не равна ▼ слева от неё, то есть где ломается правило сдвига; ещё раз — снять. 1 подсвечивается светлым золотом, 0 — тёмным, цифра видна. Сам включает «▲▼». Проверено: после «◇ сдвиг» на 1, 11, 111, 1000, 00000, 110011 — 12 изменённых клеток; при испорченной строке 4 «пары» показывают ровно две ▲ — в ней и в строке под ней.
Zazerkalius v0.790 — «вот Аниматрицу если так сделать в треугольниках и с фоновыми цветами изменённых бит до T-уровня… ковёр такой — долго глядеть можно, а то в Экселе тормозило всё». «▲▼» переведён с тысяч HTML-клеток на холст (#tvCv): треугольники одного цвета заливаются одним путём, сторона подгоняется под ширину поля (3…26 px; цифры — от 14 px), строк — до 2048; щелчок по ряду — текущая строка. «👓 изм.» теперь сравнивает с предыдущей другой картиной (на волне Аниматрицы — шаг, после «◇ сдвиг» и правок — их результат) и оставляет след: поменявшаяся клетка горит золотом и остывает в 4 ступени за T новых картин (T — строк в поле), так что за проход волны виден весь ковёр изменений. Замер: 64 строки (≈8 тыс. треугольников) — около 30 мс на кадр с пересчётом следа; на сотнях строк будет тяжелее.
Zazerkalius v0.791 — три правки. (1) По снимку «◇ сдвиг» — «тут бы цикл-кнопку: обратно чтоб ставила, а то сейчас не убрать»: «◇ сдвиг» и «◇ строить» — переключатели: первое нажатие перестраивает строки и помнит, какими они были, второе (пока строки — её результат) возвращает их; кнопка горит, пока строки — её результат, тронул руками — гаснет; оба шага в ↩. (2) «Сделай одной кнопкой, одной ширины, но с 3 разноцветными обводками»: «👓» убрана, «▲▼» — одна кнопка по кругу: поле → ▲▼ (голубая обводка) → ▲▼ + изм. (золотая) → ▲▼ + пары (розовая) → поле; надпись не меняется, ширина та же. Обводку полосы над строками красила общая раскладка кнопок — теперь она уважает свой цвет кнопки (data-gcol). (3) Попутно найдено при проверке: с v0.774 (кольца от точки центра) обводка текущего кольца строки 1 и наведённого кольца шла с отрицательным радиусом — canvas бросал IndexSizeError, когда текущей была строка 1; радиус теперь не меньше нуля.
Zazerkalius v0.792 — по снимку «слева | строки | справа»: «нужен ещё режим — только строки». В сцепку шапки четвёртой кнопкой встала «только строки»: окна (и стол, и пристыкованные под полем) прячутся, поле строк — на всю ширину за левой панелью. Почему прятать, а не закрывать окна: их места, размеры и свёрнутость не трогаются — вернуть одним щелчком, тем же или «слева» / «справа». «строки» в этом режиме тоже возвращает окна, а не прячет поле — иначе на экране осталась бы одна панель. Запоминается (Z.fieldOnly, класс body.field-only).
Zazerkalius v0.793 — по снимку «△ Сетки» и разбору «▲▼»: «вбок лев, прав; и вообще сетку бы такую же, как в Сетке, но с масштабом и всякими наездами, границами, тенями, фонами, аниматрицами — похоже, новое окно нужно Ромбоидам, не загромождать обычные строки». Новое окно «◇ Ромбоиды» (в шапке рядом с «△ Сеткой»): строки поля ковром из треугольников на своём холсте — колесо наезжает к мыши, тянешь — сдвиг, двойной щелчок — вписать. ▼ теперь берёт инверсию ▲ прямо над собой по месту в сетке, а не по номеру — иначе при сдвинутых рядах ▼ показывали бы чужие биты. Ряды: центр (как «▲▼» — равные строки столбиками, сетка не смыкается), ёлочка (ряд, который по центру ломает сетку, — на полклетки то влево, то вправо), ← вбок и вбок → (всегда в одну сторону — параллелограмм); растущие на бит строки во всех режимах по центру, потому что там сетка и так сходится. Границы по кругу: каждый треугольник, ромбы (▼ с ▲ справа — по правилу «◇ сдвиг» они равны, так что нарушение видно сразу), группы (между разными битами), без границ. «тени» — единицы отбрасывают тень на нули, рельеф групп. Свои цвета фона, 1, 0 и границ; «▦» — решётка на всё окно; «№» — цифры и номера строк (по умолчанию выключены — ромбы без номеров). «👓 изм.» и «👓 пары» — тот же след Аниматрицы до T-уровня, что в «▲▼»; кнопки ▶ ▷| ⤺ жмут те же кнопки волны, что в поле. Сам «△ Сетку» не трогал: у неё своё дело — рисовать руками и строить кнопки; если нужно, следующим шагом можно дать ей «из строк». «▲▼» над полем тоже остался как был.
Zazerkalius v0.794 — две просьбы. (1) По снимку поля «■ квадраты» — «вот эти бы тоже в ромбоиды из строк». В «◇ Ромбоидах» кнопка «▲ бит / ◇ бит»: при «◇ бит» каждый бит строки — ромб из двух треугольников, а ряды стоят так же, как строки в поле (◫ по центру, ◧ влево, ◨ вправо). Квадратная сетка поля в треугольной становится скошенной: при «вбок →» лесенка, выровненная влево, — ровный параллелограмм, столбцы бит идут наклонно. Почему наклон: два треугольника складываются только в ромб с углом 60°, и чтобы столбец бит не рвался, каждый ряд ниже сдвигается на полклетки; «← вбок» наклоняет ромбы в другую сторону, «ёлочка» — столбцы зигзагом. (2) «Да, особенно 3» — из трёх предложений сделаны все: «👓 возраст» — клетка цветом по тому, сколько проходов волны она не менялась (красная — только что, оранжевая, жёлтая, зелёная, голубая, синяя — до 16 проходов; дольше — своим обычным цветом: застыла; нули — тем же цветом бледнее). Часы — в проходах самой волны (номер прохода + доля строки), поэтому возраст не зависит от скорости и от того, сколько шагов уместилось в кадр; правки руками и ⤺ двигают часы на шаг, назад они не идут. Цифры теперь только при крупном наезде (треугольник от 22 px, ромб от 18): на общем плане они давали зернистость. «⇣» — пока идёт волна, вид сам едет за переписываемой строкой (она держится на 2/5 высоты окна).
Zazerkalius v0.795 — по снимку «▲▼»: «Аниматрица изначально строилась так, можно её тут: волна — зеркало по горизонтали на каждую строку до 1 строки и так по циклу; вариации — зеркало с инверсией, горизонт через 1, 2, 4, 8… строки вместо каждой, только чётные биты, только чётные группы по 2-4-8…» (проверит потом сам). В «◇ Ромбоидах» выбор волны для ▶ ▷| ⤺: «🌊 волна поля» (прежняя Аниматрица) или «⇕ зеркало» — своя. Шаг зеркальной: горизонт — нижний край строки a, всё над ним до строки 1 отражается вниз, строка a + k получает отражение строки a + 1 − k; горизонт сдвигается вниз, дошёл до низа — проход, и по кругу; повтор картины — сообщение о цикле. Как понято «зеркало по горизонтали» в треугольной сетке: отражение переворачивает треугольники, ▼ верхней строки ложится на ▲ нижней ровно под ним. Поэтому пишутся только биты строк (▲): ▼ — всегда инверсия ▲ над ним, и для отражённых строк это совпадает с зеркалом само. Читается только то, что над горизонтом, пишется только под ним — порядок внутри шага не важен. Варианты: «¬» — с инверсией; горизонт через 2, 4, 8, 16; биты — все, чётные (2-й, 4-й…), чётные группы по 2, 4, 8, 16 (вторая, четвёртая…); «⊕» — XOR со старым вместо замены; ⚡ — шагов горизонта в секунду. Замечено на пробе: простое зеркало на треугольнике быстро встаёт в цикл (часто период 1) — с ⊕, масками и шагом горизонта картина живее. Возраст клеток и «⇣» идут от той волны, что выбрана.
Zazerkalius v0.796 — по снимку «◇ сдвиг»: «сдвиг даёт ромбы, с виду сбоку как трапеции… это же не обязательно бипирамида — трирамида», и на разбор (ромб из двух треугольников бывает трёх направлений — «\», «/», «◆», — это три видимые грани кубика) — «да, делай кубы». В «◇ Ромбоидах» кнопка «🧊»: каждый ▲ берёт в пару равный по биту свободный ▼ из трёх соседей — слева («\»), снизу («◆»), справа («/»); с какого начинать — «сперва \ / ◆ / /», склейка жадная, сверху вниз, поэтому порядок решает, какие ромбы выйдут. Ромб красится гранью: «/» светлая, «◆» средняя, «\» тёмная — тем же цветом бита; треугольник без пары — бледный с красной обводкой. Что выяснилось сразу: у правила «◇ сдвиг» все ромбы одного направления «\» — одна грань кубиков, отсюда и «вид сбоку». И совсем без пар треугольник не складывается никогда: в треугольнике из n строк ▲ на n больше, чем ▼, так что n треугольников (у сдвига — левый край) всегда остаются одни; поэтому счёт показывает и «без пары», и сколько из них неизбежно, а разрывами считается только то, что сверх.
Zazerkalius v0.797 — «включил Аниматрицу в Ромбоиде, а играет в строках». Причина: ▶ в «◇ Ромбоидах» (волна поля) жмёт ту же кнопку волны, что в поле, а кадр волны перерисовывал только поле строк (renderRows — ради скорости, без всех окон); Ромбоиды обновлялись лишь на одиночном шаге ▷|, где вызывается полная перерисовка. Теперь каждый кадр волны рисует и Ромбоиды (если окно открыто). Сама волна по-прежнему меняет строки поля — она и есть Аниматрица над строками; чтобы смотреть только ковёр, поле можно спрятать («строки» в шапке).
Zazerkalius v0.798 — по снимку «◇ Ромбоидов»: «если в этой же сетке ромбовой тут и кнопки делать». Три ряда инструментов окна — .tools.lpw, тот же механизм, что у «▲ Пирамиды Паскаля» (lpTools): кнопки, списки и подписи с образцами цвета — шестигранники из треугольников, сцепленные остриё в выемку, ряды вплотную; перенесённая на новую строку начинает её остриём. Два дополнения в lpTools: обёртка, растворённая через display: contents (варианты зеркальной волны в #rmbWOpt), отдаёт свои кнопки в общую цепочку ряда; подпись с образцом цвета («фон», «1», «0», «граница») меряется по тексту + 22 px образца — по Range она сплющивала образец в полоску.
Zazerkalius v0.799 — по снимку «👓 возраст»: «не меняй ширину кнопок». Кнопки с надписью по кругу (👓, границы, «сперва …», ▲ / ◇ бит, ▶ / ⏸) брали ширину по нынешней надписи, и при каждом щелчке цепочка дёргалась. Теперь у них data-labels — все надписи через «|», и lpTools берёт ширину по самой длинной (мерит шрифтом самой кнопки); списки в рядах .tools.lpw — тоже по самому длинному пункту, а не по выбранному (касается и списка «▲ Пирамиды»). Проверено: три круга переключений — ширины те же.
Zazerkalius v0.800 — по снимкам «⌖✕ сброс» и ромбового пульта у холста: «сюда, наверх, в 2× размере». Сброс лазера — теперь ромб вдвое больше обычного (80 px) на вершине пульта, над 🧊 и ⧗: его нижние стороны ложатся на их верхние, решётка та же — пульт стал одним большим ромбом сверху. Пульт вырос вверх на полтора ромба (стоит у нижнего края, поэтому растёт вверх). Красный — чтобы не спутать с зелёной ⟲ «всё на места». Работает и в плоском виде, где прочие кнопки пульта приглушены. Как сделано: новая кнопка жмёт прежнюю ⌖✕ из «Алгоритма», а та спрятана — так весь её код, затемнение и откат остались как были, а сохранённые раскладки групп не трогаются.
Zazerkalius v0.801 — по снимку «Алгоритма»: «лишний полуромб внизу и тянуть не в углу». (1) Зубцы рамки группы идут шагом в ряд кнопок (24 px), а текст алгоритма под кнопками (#lasAlgo; так же строка вариантов цикла #coneVarN) — любой высоты: рамка внизу обрывалась посреди зубца. Теперь в tzgFrame текст дотягивается до целого ряда (min-height, пересчёт при каждом изменении ширины — текст переносится по-разному): группа — целое число рядов, низ — целым зубцом. (2) Ромб-ручка вставал на верхний край текста (бралась его верхняя граница как «нижний ряд»), теперь — в нижний ряд текста, в угол группы. Проверено на длинном тексте: группа 264 px = 11 рядов, ручка в правом нижнем углу.
Zazerkalius v0.802 — по снимку сводки солнца «☀ 1 · ☾ 0 · ◌ между 1 · лучей…»: «тут надо подсчитывать общий баланс всех открытых строк, 0 и 1; если равны — подсветить числа баланса; баланс сверху». Над сводкой — строка «Σ 1: x · 0: y · Δ ±d»: единицы и нули во всех строках на конусе (над чертой; строки за чертой не входят); поровну — «поровну», зелёным с рамкой и свечением. Видна, пока светит солнце (там, где сводка; при выключенных «☀ долях» — на месте сводки). Считается каждый кадр — по всем строкам конуса, это быстро.
Zazerkalius v0.803 — по снимку конуса с солнцем: «тут нужен режим ручного редактирования — вращения — с магнитной привязкой к осям симметрии, границам битов через центр, серединам, частям из Сканера и осям». «🧲 магнит» рядом с «✛ оси»: при нём кольцо тянется мышью без Ctrl и крутится свободно — только на вид, строка та же. Защёлкивается, когда что-то своё у тянутого кольца — граница бита, середина бита или ось симметрии его узора (зеркальная ось: s[j] = s[2c − j − 1]) — подходит в пределах 7 px к цели: ✛ вертикали или горизонтали, границе, середине или оси симметрии другого кольца, ⌖ оси Сканера или черте его частей. Пока тянешь, привязка видна золотой линией через центр; отпустил — поворот остаётся дробным, как защёлкнулся, а в сообщении — к чему («граница → граница кольца 5»). Почему отдельный режим, а не всегда: прежде поворот на отпускании округлялся до целого бита (или полбита в вырезах), и на этом держится весь счёт лазера и солнца; теперь у повёрнутого магнитом кольца метка Z.coneFree — его поворот не округляется, а обычный поворот без магнита метку снимает. Виды целей — пять маленьких кнопок рядом (видны при включённом магните): ✛ ⟷ ┆ · ⌖. Целей много (все границы и середины всех колец), поэтому магнит цепляет часто — лишние виды отключаются этими кнопками.
Zazerkalius v0.804 — «крутить побитно — это значит: биты-границы стоят во всех кольцах недвижно, перемещаются лишь сами 1 и 0 в них, одно смещение по кругу за шаг», и на вопрос «только на конусе или и в поле?» — «и в поле тоже». «▦ побитно» больше не поворачивает кольца: фаза кручения стоит, ячейки, границы и вырезы на месте, а каждая строка конуса за шаг сдвигается по кругу на один бит — в поле строк тоже (по часовой: бит из ячейки j переходит в j + 1; в «по биту навстречу» нечётные строки — в другую сторону). Без вырезов картина та же, что и прежний поворот ровно на бит, — разница была в вырезах T−1: там с битами по кругу ехал и сам вырез, и казалось, что движется всё кольцо. Не крутятся строки колец со своим замком 🔒 и кольца, остановленные лазером; общая галка «запрет сдвига строк» здесь не мешает — она про поворот руками, и по умолчанию включена, иначе не крутилось бы ничего. Проход лазера, закраска и строка за чертой у солнца — после каждого шага (у сдвига нет промежуточных положений, которые прежде просматривались между битами). ↩ возвращает весь прогон ▶ одним шагом (снимок — в начале). «½ бита» и «◫ части пред.» — по-прежнему поворотом колец.
Zazerkalius v0.805 — по снимку группы «Строка 1»: «нужен режим, где из центра через любую точку на первом кольце простая прямая толщины ноль, которая вместе с битом 1 строки по кругу с ним двигается, и когда попадает в свободные ячейки верхней строки, пройдя полностью длину бита там от и до, запишет в нём 1; также крупно показывать счётчик текущего вращения и кнопку ручного перехода на новую строку, чтобы её биты собирать». «⟋ нить» в «Строке 1»: прямая из центра до края холста через точку кольца строки 1 (по умолчанию — середина бита; щелчок по кольцу строки 1 — поставить в другое место), крутится вместе с ним. Ячейку строки за чертой нить метит «1», только пройдя её целиком: вошла через одну границу и вышла через другую в ту же сторону; повернула назад посреди ячейки — не метит. Слежение — в координатах кольца за чертой без разрыва, поэтому быстрое кручение (много ячеек за кадр) ничего не пропускает; в вырезах T−1 — по частям, вырез не метится. Плашка поверх холста (тянется, двойной щелчок — на место): крупно ⟳ — обороты нити относительно строки за чертой с её начала, под ним — сколько её ячеек уже «1», и «⤓ новая строка» — строку за чертой в поле (пустые — нулями), за чертой — следующая, счёт заново. Попутно: луч лазера падал с ошибкой arc «радиус отрицательный» — у дыры строки 1 внутренний край уходил ниже нуля (r0 = 0 с v0.774); радиусы дыр теперь не меньше нуля.
Zazerkalius v0.806 — по кнопке «вырезы T−1»: «* когда между битами каждый вырез» и «добавь». В «Щелях» пятый вид — «вырезы между» (по кругу: 1 щель → вырезы T−1 → вырезы между → вырезы 2n → все щели): те же 2n − 1 частей, но вырез не одним куском, а по части между каждыми двумя соседними битами — бит, вырез, бит, вырез… бит; последний и первый бит стоят вплотную (шов). Расстановка по умолчанию — середина узора сверху, шов снизу, симметрично вертикали. Сделано не отдельной веткой, а там, где вырезы T−1 жёстко считали «части 0…n − 1 — биты, дальше — вырез одним куском»: место бита (cutPos), бит под частью (cutBit), дуги вырезов (cutHoles) — в рисунке колец строк, кольца за чертой и пустых колец, в луче лазера, в солнце и луне (проход, стены, ⊕ xor, «целиком», ⟿ проход), в щелчке по кольцу. Границы между битами в этом виде рисуются только на шве — остальные края — золотые края вырезов. «◇ пред.» (биты предыдущей строки в вырезе) в этом виде не действует: вырезы здесь пустые; «щели между битами» — тоже (соседних бит нет).
Zazerkalius v0.807 — три просьбы подряд про солнце и луну в строке 1. (1) По снимку полукольца: «нужен режим, когда одна половина — солнце, другая — луна; на 180° обе светят», и (2) «а в 4 частях — также»: «☀☾» в «Строке 1» (при ◐ полукольце или ✚ 4 частях, солнце в вырезах) — открытая половина (чёрные четверти) светит солнцем, половина с битом (белые четверти) — луной; оба света из центра сразу и крутятся с кольцом строки 1. Луна здесь — свой свет, а не зеркало вылетевшего солнца, как прежде: идёт так же, как ходит луна (сквозь вырезы и «0», «☾ сквозь 1» — со счётом единиц), и ставит «0» в ячейку за чертой, накрытую целиком, — где угодно, без прежнего ограничения «только напротив, где солнце упёрлось». Половина (четверти) луны рисуется голубым, солнца — золотым. (3) «И ещё режим, где один оборот — солнце, другой — луна, полностью 360»: «☀/☾ оборот» — пока кольцо строки 1 делает чётный оборот, светит только солнце во весь круг, нечётный — только луна во весь круг; оборот считается по повороту кольца строки 1 целыми его длинами. Кто светит сейчас — кайма у диска строки 1 (золотая или голубая) и сводка «☀ · ☾» над конусом.
Zazerkalius v0.808 — «ещё режим: когда солнце ставит где-то 1, то в противолуче, в первом свободном кольце, на данном секторе ставить 0». «☀↔0» в «Солнце»: ячейка строки за чертой (первое свободное кольцо), получившая от солнца «1» на этом шаге, ставит «0» в пустые ячейки той же строки, которые сектор напротив неё (через центр, +180°) накрывает хотя бы наполовину. Проверено: в «вырезах между» солнце поставило «1111» — напротив встали нули, «001111». В обычных «вырезах T−1» напротив ячеек — сам вырез (ячейки подряд, вырез одним куском напротив), поэтому нулей там нет; в «вырезах 2n» — тоже вырез. Нули дальше, на пустых кольцах за строкой за чертой, не ставятся: те кольца — только вид и счёт «1».
Zazerkalius v0.809 — по снимку ковра Ромбоидов: «Zazerkalius — можно этим набрать?», выбрано «строками в поле, ёлочкой». «Аа» в «◇ Ромбоидах»: вписываешь текст — он ложится в поле строками пиксельного шрифта 5 × 7 (латиница, кириллица, цифры, немного знаков; строчные — как заглавные), буквы через столбец, по краям — строка и столбец нулей; «Zazerkalius» — 9 строк по 67 бит. Окно само переходит в «◇ бит» и «ёлочку»: каждый бит — ромб, ряды через один сдвинуты на полклетки, поэтому буквы стоят прямо (курсивом вышли бы при «вбок»). Почему строками, а не картинкой: это обычные строки — по ним идёт Аниматрица, ⇕ зеркало, 🧊 кубы, возраст, и слово можно разъедать волной. ↩ возвращает прежние строки.
Zazerkalius v0.810 — по снимку «ZAZERKALIUS»: «между I лишние пробелы справа, слева». У «I» в клетке 5 × 7 по пустому столбцу с каждой стороны, и с промежутком между буквами вокруг неё выходило по два. Шрифт «Аа» теперь пропорциональный: у каждой буквы срезаются пустые крайние столбцы, между буквами — ровно один (пробел, где клетка пустая целиком, так и остаётся пробелом). «Zazerkalius» — 65 бит вместо 67.
Zazerkalius v0.811 — по снимку ромба «⌖✕ сброс»: «эту кнопку прикрепить к вертикали через ось, чтобы всегда показывалась внизу, на переднем плане всех кнопок и бит». Ромб 2× снят с вершины пульта и стоит в теле окна конуса: на вертикали через центр конуса (едет за ним, когда конус сдвигают), нижним углом у нижнего края холста, поверх групп и колец. Место пересчитывается при каждой отрисовке конуса. Пульт снова прежней высоты (4 ромба). Жмёт, как и прежде, спрятанную ⌖✕ из «Алгоритма».
Zazerkalius v0.812 — две просьбы. (1) По снимку ✚ 4 частей с солнцем и луной сразу после сброса: «тут что-то не то, и 1 нижнюю не закрасил ещё, только верхнюю». Разобрано у себя: так выходит, когда включены оба режима — «☀☾» и «☀/☾ оборот». Оборотный главнее: в солнечный оборот солнце светит во весь круг, свет выходил через весь вырез (правая половина), а рисунок показывал четверти солнца и луны — картинка и счёт расходились. Теперь эти два режима — либо-либо (включаешь один — другой гаснет, в «Алгоритме» второй затемнён с причиной), а кайма «кто светит этот оборот» рисуется у строки 1 любой формы — и у полукольца, и у четвертей. (2) По снимку «Σ 1: 1 · 0: 0 · Δ +1»: «тут квадратные ромбы с фоном цвета, как у бит, и в них число без указок 1 и 0; если равно — знак равенства и подсветить» и «всё это также по вертикали и наверх». Баланс — два ромба столбиком на вертикали через центр конуса у верхнего края холста, поверх групп: сверху единицы на фоне цвета «1», ниже нули на фоне цвета «0», между ними «=» с зелёным свечением, когда поровну, иначе тусклое «≠»; подробности — в подсказке. Едет за центром конуса, как «⌖✕ сброс» внизу. Виден при солнце, как и прежняя строка.
Zazerkalius v0.813 — по снимку ромбового пульта: «это по горизонтали от центра прижми вправо и дай переместить влево». Пульт стоит на горизонтали через центр конуса (⌂ — ровно на ней) и едет за центром, когда конус сдвигают; прижат к правому краю холста. Тянешь за ⠿ или фон между кнопками и отпускаешь левее середины холста — встаёт слева, правее — справа (Z.padSide); двойной щелчок по ⠿ — на другую сторону. Прежнее свободное место пульта (тянулся куда угодно, Z.padPos) больше не действует — по правилу «сохранённое не переписывать молча» оно оставлено копией Z.padPos_pered_os. Вместе с «⌖✕ сброс» внизу и балансом наверху получается крест вокруг центра: вертикаль — баланс и сброс, горизонталь — пульт.
Zazerkalius v0.814 — «1 и 0 балансы — кнопки в одну строку, без знаков равенства, просто зажги их, когда равны». Ромбы баланса стоят в ряд, остриё к острию (единицы слева, нули справа), посередине — на вертикали через центр конуса, у верха холста; знаков «=» / «≠» больше нет. Не поровну — ромбы приглушены, поровну — оба загораются (ярче и с золотым свечением).
Zazerkalius v0.815 — «эти кнопки на первый план и выровни отступами снизу и сбоку» (ромбы ◎ дзена и записи внизу левой панели) и «чуть ниже — на кнопки залезли» (баланс 1 / 0 на вкладках групп). Ромбы дзена и записи — поверх окон и групп (z-index 1001); нижний ромб цепочки — на 8 px выше низа панели (не ниже низа окна), левый — на 8 px от её края: прежде цепочка стояла по низу панели с отступом 4 px и могла уйти за край окна. Баланс 1 / 0 ставится на 8 px ниже полосы вкладок групп конуса (#cgTabs), если она заходит на холст, а не от верха холста.
Zazerkalius v0.816 — по снимку «Алгоритма»: «это отдельно от нижнего текста: сам текст без фона и рамки помести на поле вправо вниз, и при клике по кнопкам или при наведении на кнопки показывай, потом при любом клике вне групп кнопок скрой». Строки алгоритма (#lasAlgo) ушли из группы на холст конуса, в правый нижний угол (lasAlgoPlace), без фона и рамки — светлый текст с тёмной тенью, чтобы читался поверх колец. Появляются при наведении на кнопку любой группы конуса или щелчке по ней, прячутся щелчком мимо групп (щелчок по самому тексту не прячет). Подсветка «кнопка ↔ строка» осталась. Группа «Алгоритм» стала ниже — под кнопками больше нет текста.
Zazerkalius v0.817 — по снимку цепочки ромбов внизу левой панели: «в один ряд их и на верхнее меню после назад-повтор». На широком экране ◎ дзена и кнопки записи (● mp4 🎞 ↻1 ⏸ 🔗 ▣) стоят одним рядом ромбов 28 × 28 в шапке, сразу правее ↩ ↪, острие к острию (класс body.recTop). Низ левой панели освободился: полоса 72 px под ромбы больше не держится. В дзене и на телефоне — как было. И по снимку «✛ оси» — «это в Вид»: кнопка осей переехала из «Колец» в «Вид» (это вид, а не действие над кольцами).
Zazerkalius v0.818 — по снимку пунктира «✛ оси» поверх подписи «☀ 1/2» и пульта: «оси за кнопки и текст». Оси теперь рисуются раньше лучей, света и подписей долей — те ложатся поверх. Пунктир просвечивал и сквозь кнопки пульта: в плоском виде недействующие кнопки были полупрозрачными (opacity .35). Теперь они притушены яркостью, а заливка плотная — оси уходят под них.
Zazerkalius v0.819 — по снимку полосы вкладок групп (Лазер · Солнце · … · Текст) в дзене: «в дзене это скрыть». В дзене полоса #cgTabs спрятана. Группы, отмеченные 🧘, остаются у конуса, как раньше.
Zazerkalius v0.820 — по снимку пульта: «на передний план и по горизонтали любое место». Пульт поверх групп, колец, ⌖✕ сброса и баланса (z-index 650). По вертикали он, как в v0.813, стоит на горизонтали через центр конуса. По горизонтали тянется куда угодно, место — доля ширины холста Z.padFx: 0 — у левого края, 1 — у правого, поэтому при смене размера окна пульт остаётся на том же месте относительно холста. Двойной щелчок по ⠿ по-прежнему ставит его к другому краю.
Zazerkalius v0.821 — по снимку «проход 0 · волна 0/0»: «фон и границу у текста убери, прижми вправо поля строк». У счёта волны (#animInfo) больше нет фона и рамки, только мягкая тень цветом фона, чтобы читался поверх строк. Он стоит в 4 px от правого края поля строк (было 14).
Zazerkalius v0.822 — по снимку ползунка размера шрифта: «все бегунки сделай ромбами, а этот тормозит при перемещении, когда число слева направо от него переходит». Бегунки в цепочках из треугольников — ромбы 24 × 24 (были стрелки 5t), значок в ромбе и число рядом считаются от него. Ползунки вне цепочек — тоже ромбом 16 × 16 цветом акцента на тонкой дорожке. Тормоз нашёлся замером: шаг ползунка стоил ~30 мс, а шаг, на котором число перескакивало на другую сторону, — 180–220 мс. Сторона числа ставилась классом .rvl у подписи ползунка, этот класс видел наблюдатель полосы кнопок над полем и пересобирал её целиком. Теперь сторона — data-side у самого числа, его наблюдатели не видят, и перескок стоит те же ~30 мс.
Zazerkalius v0.823 — три правки по снимкам. «Отступ поменьше, одинаково с левым» (левая панель значками): кнопки стояли в 4 px от левого края и в 4 px от правого, но справа ещё выступали зубцы рамки (8 px) — на глаз справа выходило втрое больше. Столбик теперь 44 px, правое поле блоков снято: кнопки в 4 px слева, а справа — вплотную к основанию зубцов. «Выровняй по вертикали отступы»: полоса кнопок над полем строк — 2 px сверху и снизу, как шапки окон (было 4), кнопки в одном ряду с кнопками шапок. «Строки: границу зубцами, так же как левое меню»: прямая черта у края поля (#fieldEdge::after) заменена зубцами — слой #fieldZigOv поверх окон, остриями в сторону стола, той же сеткой 24 px, что у левого меню; хват ширины поля остался на месте.
Zazerkalius v0.824 — «Вид», по двум снимкам. «Оси — свет: одна строка в меню, 2 кнопки»: в группе появился перенос строки (.cgnl — пустой элемент во всю ширину), за ним ✨ свет и ✛ оси — последней строкой, вдвоём. «(лучи) — одна кнопка: выкл, выдел., все»: три кнопки (выдел.)лучи(все) заменены одной, щелчок по кругу выкл → от выделенных → от всех → выкл, надпись показывает режим, горит, пока лучи включены (id прежний — coneRaysB). «Стандарт ширину со всеми»: у «🔴 неп. ⇄» была добавка ширины (data-tzadd) — снята, обе «неп.» теперь как все кнопки.
Zazerkalius v0.825 — две правки. «Ширина ползёт сама» (по снимку «Вида» после v0.824): перенос строки .cgnl — элемент во всю ширину группы, и его считали кнопкой два замера группы с заданным размером: «не уже самого широкого блока» (tzMinW — бралась вся ширина + 1 px + поле) и «прижать к правому краю самого длинного ряда». Перенос из обоих замеров исключён. «Магнит к зубцам» («правая колонка строки, левая», по снимку «За чертой» у края поля): зубцы левого меню и поля строк — такая же цель магнита, как группа-соседка (meshSnap). Поднёс группу — встаёт выемками на острия, ряд в ряд, ни к чему не прицепляется. У поля справа острия смотрят влево, поэтому его зубцы сдвинуты на полряда: острия приходятся на стыки рядов групп и входят в выемки их правого края на той же сетке, на которую группа встаёт при отпускании.
Zazerkalius v0.826 — три правки по снимкам. «Левая стрелка ползунка — два треугольника X: верхний вниз, нижний вверх, вершины в середине»: левая стрелка у ползунков в цепочках — ⧗ шириной в один треугольник (была «>» в полторы). «Эти две пересобери — они тупят всю группу» (🔴 неп. ⇄ и 🟢 неп. ⇄🔁): щелчок по ним перерисовывал все окна страницы (~200 мс на главной), а неподвижные биты видны только в поле строк и на конусе — теперь перерисовываются только они. «Если это жёлтая полоса изменённой строки — достаточно, как выделены номера, без полосы»: у номера изменённой строки снята золотая черта справа (box-shadow), золотые номера остались.
Zazerkalius v0.827 — «подтормаживает на каждом обороте кручения». Замер кадров при кручении (солнце, вырезы T−1, ✚ 4 части, «Каждое»): кадры по 130–200 мс приходились ровно на каждый целый шаг фазы, а сам расчёт и рисование конуса стоили около 8 мс. Время уходило на пересборку раскладки групп (cgbSnap + triTag): её будил наблюдатель групп, а внутри групп на каждом шаге меняется только текст-показ — число у ползунка (.rv) и строка «вариантов цикла… сейчас N». Такие правки кнопок не двигают — наблюдатель теперь их пропускает. За 4 с кручения было 109 кадров, стало 208; 90 % кадров — не дольше 33 мс (было 150).
Zazerkalius v0.828 — по снимку «⌖✕ сброс»: «добавь сюда «Крутить» ромбом сверху справа, уменьши размер ромба на 25 %». Ромб сброса — 60 × 60 (был 80), рядом, сверху справа, сторона к стороне — такой же зелёный ромб «▶ крутить» (#bC3Spin): жмёт ту же «▶ крутить» в «Кручении», при кручении горит и показывает «⏸ стоп». Оба стоят на вертикали через центр конуса у нижнего края холста, поверх групп (c3RstPlace).
Zazerkalius v0.829 — по снимку поля после «⌖✕ сброса» (над чертой одна «1», под ней пустая строка 2): «нужно строка 1 и строка 2, под линией горизонта». Сброс оставлял солнце и строку 2, только когда строк было больше двух; при одной строке над чертой так и оставалась одна «1». Теперь, если строки 2 нет, сброс ставит её («11»), и строка для заполнения — третья; ↩ вернёт прежнее.
Zazerkalius v0.830 — «строка 2 должна быть под горизонтом» (уточнение к v0.829, которая поняла просьбу наоборот и добавляла строку 2 над чертой). ⌖✕ сброс теперь оставляет над чертой только строку 1 — солнце; строка 2 — та, что заполняется, под чертой. Прежде (с v0.757) сброс оставлял солнце и строку 2. ↩ вернёт снятые строки.
Zazerkalius v0.831 — по снимку пульта: «эти такого же размера сделай, как Сброс». Ромбы пульта (🧊 ⧗, ▲ ▼, ↺ + − ⌂ ⟲ ⟳ ⠿, ▶ ↻) — 60 × 60, как ⌖✕ сброс и ▶ крутить у оси (были 40); значки крупнее. Вся раскладка пульта считается от одной величины --d, поэтому сетка ромбов не поменялась, пульт просто стал в полтора раза больше.
Zazerkalius v0.832 — по снимку края поля: «границу для захвата (изменение ширины полей) можно ли на зубцах расположить». Хват ширины поля строк — теперь сами зубцы края (#fieldZigOv): тянуть — шире или уже, двойной щелчок — ширина по умолчанию; при наведении и во время протяжки зубцы подсвечиваются. Нажатие передаётся прежнему хвату #fieldEdge — его полоса внутри поля, пока зубцы видны, выключена. Работает и при поле слева, и справа.
Zazerkalius v0.833 — по снимку ▶ ↻ внизу пульта: «эти убери оттуда». Ромбы ▶ крутить и ↻ направление с пульта убраны (спрятаны стилем, код у них прежний): крутить — ромбом у сброса на вертикали через центр (v0.828), направление — в «Кручении». Высота пульта прежняя, чтобы ⌂ остался на горизонтали через центр.
Zazerkalius v0.834 — по снимку подсвеченных зубцов края поля: «вертикальную линию можно убрать?». Прямая черта рядом с зубцами появлялась только при наведении: подсветка v0.832 (фильтр яркости) осветляла и заливку зубцов цветом поля, светлая заливка встык с тёмным полем давала ровную вертикальную границу. Теперь при наведении и протяжке меняется только сама ломаная — цветом акцента и вдвое толще, заливка остаётся цвета поля.
Zazerkalius v0.835 — две правки. «У левого меню также» (как у поля, v0.832 и v0.834): хват ширины левой панели — сами зубцы её края (#paneZigOv) — тянуть — ширина, двойной щелчок — по умолчанию; при наведении светится только ломаная цветом акцента, полоса #paneEdge больше не подсвечивается. В столбике значков ширина не тянется — там зубцы как были. Прямая черта рядом с зубцами меню на снимке — левая рамка окна на столе, к зубцам не относится. И по снимку пульта и ромбов у оси — «затемняй остальные при наведении, и тут сделай изменение курсора также»: навёл на ромб (пульт, ⌖✕ сброс, ▶ крутить) — остальные притухают; у действующих ромбов пульта курсор — рука.
Zazerkalius v0.836 — по снимку ленты перемотки внизу холста: «у ползунка внизу стрелки из ромба», «из 4 (X и X)». Обе стрелки ленты (#coneTapeBox) — ⧗ из двух треугольников (верхний вниз, нижний вверх, вершины в середине), высотой в ряд и шириной в треугольник, золотом ленты, без рамки; прежде — квадратные ◂ ▸.
Zazerkalius v0.837 — две правки. «При наведении не меняет курсор на руку» (пульт): курсор-руку ромбам дал ещё v0.835, но мышь до них не доходила — пульт лежал внутри холста конуса (#coneMain, z-index 0), и его z-index 650 действовал только там: полоса групп конуса, стоящая выше всего холста, накрывала ромбы. Пульт перенесён в тело окна, рядом с ⌖✕ и ▶ — теперь он правда поверх групп, и рука — у всех ромбов, в плоском виде тоже. И «да» — стрелки ленты перемотки из четырёх треугольников каждая: шевроны, как стрелки в группах, левая «<», правая «>» (вместо двух ⧗ из v0.836).
Zazerkalius v0.838 — по снимку ромба «⏸ стоп» у оси: «пусть мигает, когда крутится». Пока конус крутится, ромб плавно мигает (прозрачность 1 → 0,35 → 1 за секунду); остановился — горит ровно.
Zazerkalius v0.839 — по снимку ленты перемотки: «ползунок увеличь в 2 раза» — «бегунок». Бегунок ленты — ромб 32 × 32 (у прочих ползунков вне цепочек — 16); у самого поля ленты сняты рамка и фон, проступившие при новой высоте.
Zazerkalius v0.840 — по снимку ромбов у оси: «поменяй местами, и сброс сделай меньше на 1/8, но расположи в том же центре ромба, как с обычным размером». Теперь на вертикали через центр конуса, у нижнего края — ▶ крутить (60), а сверху справа — ⌖✕ сброс, 52,5 × 52,5 (7/8): его центр стоит там же, где был бы центр ромба 60 в этой клетке, так что между ромбами — зазор по 3,75 px.
Zazerkalius v0.841 — две просьбы. Первая, по ромбам у оси: «можно ли, чтобы эта же полоска кнопок появлялась при наведении на «крутить» там, на оси внизу, справа от неё, и кнопка появлялась сразу после «крутить» там справа — при изменённых положениях, не 0». Режимы кручения (Всё · Каждое · Встреч Стр · Встреч Бит) — полоской шестигранников справа от ▶ крутить, по середине ромба; видна, пока мышь на ▶ или на самой полоске, гаснет через полсекунды после ухода; щелчок жмёт ту же кнопку в «Кручении», горит выбранный режим. Зелёная ⟲ «на места» — ромбом 60 остриём к острию сразу справа от ▶, только когда есть что возвращать (накрутка колец, поворот всего конуса, фаза кручения, довод строки 1, кольцо за чертой, остановленные кольца); тогда полоска режимов — за ней. Вторая, по снимку текста алгоритма: «тут подсказка для каждой кнопки при наведении, а когда увести — этот текст как раньше; ширину и высоту постоянной, чтобы не дёргалось, текст наверх прижимай, когда его мало». Наведение на кнопку групп конуса — на месте строк алгоритма её подсказка (первая строка ярче), увёл — снова алгоритм. Коробка одного размера: ширина от холста, высота — самая большая, какую набирали строки при этой ширине (не меньше 8 строк), текст сверху; длинная подсказка обрезается по низу коробки.
Zazerkalius v0.842 — две правки. По снимку шапки окна: «кнопка «Лазер» — подвинь правее, наложилась на что-то, заголовок похоже». Шапка окна конуса лежит поверх его тела, а полоса вкладок групп — выше по слою и закрывала «◯ Solarius»; теперь первой в полосе стоит пустая вставка шириной до конца заголовка, «Лазер» начинается за ним. Вторая — на вопрос «как задать начальное положение вручную и запомнить его — список положений нужно где-то выбирать и удалять» и «да» на предложенный список. Раньше было только ⭐ Умолчание: одна ячейка, и запоминает она всё — биты всех полей и настройки. Теперь «📍 Положения» (кнопка 📍 в «Кручении» рядом с ⟲ и последней в полоске режимов у ▶ на оси): «+ запомнить» кладёт в список, как стоят кольца сейчас — накрутку каждого, поворот всего конуса, фазу кручения, довод строки 1, кольцо за чертой, сдвиги остановленных и повёрнутые магнитом; биты строк и настройки не входят. Щелчок по имени — кольца встают так, двойной щелчок — переименовать, ✕ — удалить (со спросом), ☆ → ★ — начальное: к нему ведут ⟲ «на места» и ⌖✕ сброс, а зелёный ромб ⟲ у оси появляется, когда кольца стоят не так, как в ★. Нынешнее положение в списке отмечено зелёной чертой. Хранится в памяти страницы и едет в «💾 В файл»; в ⭐ Умолчание не входит.
Zazerkalius v0.843 — две правки по снимкам. «Тут 1/3 кнопки — помести «На места» значком так же (Умолчание ⟲)»: на левой панели в ряду «⭐ Умолчание» справа — зелёная ⟲ на треть ряда, жмёт ту же ⟲ «на места», что в «Кручении» (с ★ из «📍 Положений» — к нему). В раскладке левой панели появилась кнопка «своей доли ряда» (data-lpfr="3" — треть): её ширина задана, остальное достаётся соседке. «Это убери в текст» — про плашку «◎ торы · мера d…» (Σ расчёт) на конусе: таблица торов теперь первым блоком в окне «📝 Текст конуса и лог лазера», над текстом конуса, без рамки и перетаскивания, листается, если не влезает; окна текста нет на странице — по-старому плашкой.
Zazerkalius v0.844 — по снимку окна «📝 Текст конуса и лог лазера»: «сделай столбами все списки рядом». Блоки шли друг под другом, и лог с вылетами сжимались в узкие полосы. Теперь на широком экране они стоят столбцами рядом: Σ расчёт торов | текст конуса | вылет из строк | прогноз | лог лазера; у каждого свой заголовок сверху и своя прокрутка. Столбцы делят ширину окна поровну, но не уже 220 px — если окно уже, оно листается вбок. Сделано одной сеткой: обёртка лазера растворена (display: contents), заголовки — первый ряд, списки — второй. На телефоне (до 760 px) — по-прежнему друг под другом.
Zazerkalius v0.845 — по снимку края левого меню: «какие-то артефакты видны при перетаскивании группы». Слой зубцов у края панели и поля ставится на ступень выше самого верхнего окна, а эта ступень растёт с каждым щелчком по окну и быстро переваливает за 2000 — слой тащимой группы. Зубцы и подсветка хвата ложились поверх группы. Теперь тащимая группа выше всего, а зубцы, пока её тащат, мышь не ловят и не подсвечиваются.
Zazerkalius v0.846 — по снимку полоски у ▶ на оси: «скорость тоже ползунок, когда включено кручение, вместо этих вот». Пока конус крутится, полоска при наведении на ▶ (⏸ стоп) показывает не режимы и 📍, а ползунок скорости с числом — тот же, что «Скорость кручения» в «Кручении»: двигаешь один — едет и другой. Остановил — снова режимы. Ползунок стоит в полоске последним, чтобы у кнопок режимов не сбилось чередование острий и выемок.
Zazerkalius v0.847 — «1001100.online — проверь, долго грузится». Сам хаб грузится за десятую долю секунды, тормозил его фон — Zazerkalius (конус) в iframe: при запуске браузер одним куском 6 с пересчитывал стили. Виноваты четыре правила с :has(), повешенные на всё тело окна или страницы: притухание ромбов у оси при наведении (v0.835 — само по себе 4,7 с), тащимая группа над зубцами (v0.845 — 1,6 с), столбцы лазера в окне текста (v0.844) и фон (html:has(body.bgmode)). Такое правило заставляет пересчитывать стили всей страницы на каждой правке DOM, а при запуске их тысячи. Вместо :has() — классы, которые ставит код: .c3hov у тела окна конуса (по наведению), body.cgdrag (уже был), #coneBot.lasOn, html.bgmode. Замер на той же машине: фон 7,6 с → 1,7 с, хаб целиком 7,0 → 1,3 с, полная страница Zazerkalius — не успевала за 30 с, стала 3,3 с. Правило на будущее: :has() с телом окна, body или html не заводить.
Zazerkalius v0.848 — «Аа» в Ромбоидах: «поправь, чтобы и строчные буквы делал». Прежде весь текст переводился в заглавные. Теперь у строчных свои знаки, латиница и кириллица: высота 5 рядов из 7, у b d f h k l t б й ё — выносной элемент вверх, у g j p q y у р д ф ц щ — хвост на два ряда ниже строки. Хвосты добавляют строки, только если такие буквы есть в тексте, — заглавный текст ложится, как прежде, в 7 рядов. Знака для буквы нет — берётся заглавный.
Хаб v0.077 — по снимку «◇ Ромбоидов» Zazerkalius: «как тебе отправить для вставки в индекс хаб», «для хаба — Зеркалиус», «да, делай и волну». Пересылать ничего не понадобилось: надпись — это строки поля, и хаб строит их сам. «Зеркалиус» набран тем же шрифтом «Аа» (Zazerkalius v0.848, уже со строчными — хвосты «р» и «у» уходят под строку): 11 строк по 54 бита. Бит — ромб из двух треугольников, каждый следующий ряд на полклетки левее («◇ бит», «← вбок»), поэтому буквы наклонены, как в окне Ромбоидов; единицы светлые, нули серые, у каждого треугольника тёмная грань. Рисуется на холсте, чётко на любом экране. Волна — полоса света 3,6 с слева направо и пауза 2,4 с, единицы под ней загораются цветами радуги прежней надписи; спрятанная вкладка не рисует, при «меньше движения» в системе волны нет. Прежняя надпись из треугольников «△ Сетки» (v0.076) снята.
Zazerkalius v0.849 — две правки. По снимку названия в шапке: «тут тоже замени на новую — Зазеркалиус, и по-русски попробуем». Название в шапке — как надпись хаба v0.077: «Зазеркалиус» шрифтом «Аа», 9 строк по 66 бит (пустые строки сверху и снизу сняты, чтобы влезло в полосу 34 px), бит — ромб из двух треугольников, ряды «← вбок». Нули — подложка-параллелограмм бледным цветом единиц, грани — сеткой цветом фона, единицы — треугольниками цветом единиц гаммы, как и прежняя надпись (гамма по-прежнему её перекрашивает). Вторая — по снимку «Другое»: «двойной клик включит-отключит все окна из списка». Двойной щелчок по заголовку «Другое»: открыто хоть одно окно списка — все сворачиваются в список, все свёрнуты — все разворачиваются. Одиночный щелчок по-прежнему сворачивает сам список, но через четверть секунды: сразу свернувшийся список сдвигал панель, и второй щелчок попадал мимо заголовка.
Zazerkalius v0.850 — по снимку ромбов баланса у верха конуса: «оси перенеси сюда ромбом, между, сверху». «✛ оси» — теперь ромб того же размера, что ромбы баланса, на вертикали через центр конуса, у верха холста под вкладками; пара ромбов баланса (она видна при солнце) опустилась на полромба, и ромб осей лёг в выемку между ними. Горит, пока оси включены. Прежняя кнопка «✛ оси» в «Виде» спрятана — ромб жмёт её. Чтобы прямоугольная коробка пары не закрывала нижнюю половину ромба осей, мышь теперь ловят только сами ромбы баланса.
Хаб v0.078 — по снимку прежней надписи из треугольников: «убери фон у надписи и цветной сделай, как было тут» и «волну я не вижу». У «Зеркалиуса» больше нет серой подложки нулей и тёмных граней — только треугольники единиц, каждый чуть сжат к своему центру (швы, как у надписи v0.076), цветом переливающейся радуги, полный круг за 14 с. Волна прежде глушилась системной настройкой «меньше движения» (в Windows — «Показывать анимацию в Windows») — у пользователя её и не было видно; теперь идёт всегда: полоса, в которой треугольники светлеют почти до белого и дорастают до целых, 2,6 с слева направо и пауза 1,4 с.
Zazerkalius v0.851 — по снимку шапки: «выровни по высоте». Надпись «Зазеркалиус» была 21 px при кнопках шапки 24–25 и смотрелась ниже их. Теперь она высотой 24 px, как ромбоиды кнопок, и верх и низ её подложки идут вровень с ними; ширина — по высоте, но не шире прежнего предела (222 px и не шире левой панели).
Хаб v0.079 — по снимку главных кнопок: «эти кнопки в Хабе тоже надо сделать из ромбов — текст». Надписи «Треугольник» и «Зазеркалиус» — тем же способом, что «Зеркалиус» над нотами: строки шрифта «Аа» Zazerkalius (9 рядов по 64 бита — буквы и хвосты «р», «у»), бит — ромб, ряд ниже на полклетки левее. Ромбы — маской поверх цвета кнопки, поэтому перелив цветов и чёрная надпись при наведении остались прежними. Сбойные полосы эти две кнопки больше не задевают: полоса рисует копию надписи буквами и легла бы поверх ромбов.
Хаб v0.080 — по снимку нот над треугольником и вырезке дырки в нём: «эти ноты-кнопки надо встроить в треугольника ромбы, найди там место для 7 кнопок». Ноты больше не висят над треугольником, а стоят в его дырке, по его же сетке: каждая нота — ромб из k × k бит-ромбов (той же формы, что бит, только в k раз крупнее), и под всей стрелкой До; Ре Ми; Фа Соль Ля; Си — только нули треугольника. Места посчитаны перебором: в верхней дырке под надписью (строки 16–30) стрелка влезает при k = 2, в большой центральной (строки 32–62) — до k = 5, но там стоит меню. Поэтому хаб сам выбирает самое крупное место между надписью и панелями меню; если стрелка заходит в ряд главных кнопок, «Треугольник» и «Зазеркалиус» расступаются и пропускают её посередине. Где ромб ноты выходит уже 28 px (телефон, небольшой экран ноутбука), ноты остаются прежней стрелкой — подпись в такой ромб не влезет.
Хаб v0.081 — на v0.080: «можно одну кнопку сделать из цветных ромбов в треугольнике; при нажатии они все начинают сыпаться в разные стороны, а тут остаётся серое — мигать граница кнопки». По выбору пользователя: кнопка включает все семь нот, стоит в большой центральной дырке, второе нажатие — ромбы слетаются назад. Кнопка — ромб из 16 × 16 бит-ромбов: при 64 строках треугольника центральная дырка (строки 32–62) вмещает его ровно, ни одной единицы под ним. Бит-ромбы кнопки цветные — полосами цветов семи нот, сверху До, снизу Си. Нажатие: звучат все семь нот, ромбы разлетаются от центра, падают, крутятся и гаснут; под ними остаётся серая кнопка с мигающей границей (на паузе граница не мигает). Ещё нажатие — ноты молчат, ромбы слетаются тем же путём назад. Семь отдельных нот спрятаны; на телефоне лёжа осталась прежняя стрелка. Меню на компьютере переставлено по бокам кнопки: слева «Треугольник» и «Знак и записи», справа «Зазеркалиус» и «Черновики» — иначе панели закрывали дырку.
Хаб v0.082 — «верни расположение кнопок»: меню снова внизу по центру, как до v0.081, и семь нот — прежней стрелкой под надписью. Кнопка «все 7 нот» из центральной дырки снята: с меню на месте она легла бы поверх панелей. Пользователь пояснил замысел: «лучше в этот треугольник» (верхушка Серпинского), и «разлетаются» значило не взрыв, а что прямо оттуда по треугольнику начинают гулять биты-ноты (головки звука). Место и вид кнопки — следующим шагом.
Хаб v0.083 — кнопка «все 7 нот» на своём месте. Слово пользователя: «7 строк — как раз 0-треугольник, первый из 7 строк нулей, перевёрнутый, как раз 7 нот; пусть прям биты-ноты стекают вниз через узкое место — вершину треугольника — и только отсюда выходят в общий треугольник», и «треугольник ниже». Кнопка — первая перевёрнутая дырка Серпинского (строки 8–14 из 64, 28 бит): по строке на ноту, сверху До (7 бит), внизу Си (1 бит, сама вершина). Нажатие — звучат все семь нот, а биты по очереди, начиная с ближних к вершине, сходят по решётке к вершине и через неё уходят вниз в общий треугольник, светясь и угасая; дырка остаётся серой, граница мигает, пока ноты звучат (на паузе не мигает). Ещё нажатие — ноты молчат, биты стекают обратно вверх тем же путём. Треугольник опущен под надпись «Зеркалиус» (верх — под ней, низ — на прежнем месте), поэтому стал чуть меньше. Меню на месте; если ряд главных кнопок заходит на дырку, «Треугольник» и «Зазеркалиус» расступаются. Семь отдельных нот спрятаны; на телефоне лёжа — прежняя стрелка.
Хаб v0.084 — по снимку «△ Сетки» Zazerkalius с двумя фигурами: «сделай такие границы, форму для кнопок», «это две кнопки, вытянутые 4 грани, трапеции». Главные кнопки больше не прямоугольники со скруглёнными углами: каждая — трапеция с боками под 60°, рамка — один ряд треугольников по краю, со швами между ними, цветом кнопки (перелив остался). «Треугольник» стоит узким краем вверх, как ▲, «Зазеркалиус» — зеркально, узким вниз, как ▼. Всё по сетке: сторона треугольника — ширина кнопки, делённая на целое число (у кнопки 340 px — 20 px), высота — четыре ряда, скос бока — две стороны, поэтому углы трапеции — узлы сетки и треугольники рамки не режутся.
Хаб v0.085 — две правки. Первая, на v0.083: «сейчас они как и раньше с вершины начинают движение; надо, чтобы отсюда прямо эти же ромбы уходили, по одному за одно нажатие, по 1 ноте, по кругу: 7 нажатий — семь нот вылетело, потом следующие». Нажатие на дырку выпускает один её бит: по кругу До, Ре … Си (из каждой строки — ближний к середине), потом второй круг из оставшихся, и так все 28. Первый бит ноты включает её звук. Бит идёт по сетке к вершине дырки, оттуда летит прямо в бегущую головку своей ноты в треугольнике, следя за ней, и сливается с ней. Ушедший бит оставляет серое место; граница дырки мигает, пока что-то звучит. Когда дырка пуста, нажатие выключает все ноты и биты возвращаются на места. Нота, включённая не кнопкой (правый щелчок — сброс), тоже выпускает свой бит. Вторая, по снимку кнопки v0.084: «да, обеим кнопкам такую, только это просто обводка нужна; оставь внутреннюю, а сами треугольники не нужны» — обе главные кнопки одной трапецией узким краем вверх, без треугольников рамки: осталась её внутренняя граница тонкой обводкой цветом кнопки.
Хаб v0.086 и Zazerkalius v0.852 — на вопрос «чтобы головка стартовала прямо из вершины дырки — надо менять маршруты нот в фоне» пользователь ответил «да». У каждой из семи головок звука в фоне теперь свой сдвиг шага (прежде все шли по одному общему счёту, и включённая нота появлялась там, где её маршрут был в этот миг). Хаб, выпуская первый бит ноты из дырки, передаёт фону бит старта — строку сразу под вершиной дырки, на полклетки в ту сторону, откуда пришёл бит. Фон на ближайшем шаге подбирает сдвиг, при котором головка стоит ровно на этом бите; у диагоналей Соль и Ля, которые на этот бит не попадают никогда, — на ближайшем к нему. Дальше головка идёт своим прежним маршрутом. Включение всех нот разом (правый щелчок — сброс) и выключение возвращают маршруты к общему счёту.
Zazerkalius v0.853 — по снимку ряда «Всё | Каждое | Встреч Стр | Встреч Бит»: «почему-то сбрасывает кнопки при Всё на места, так не должно быть». Смена режима кручения обнуляла фазу и отпускала остановленные кольца, а всё, что кольца накрутили в «Каждое» и «Встреч», живёт именно в фазе — поэтому при переходе на «Всё» (где кольца друг относительно друга не сдвигаются) они прыгали на свои начальные места. Теперь перед сменой режима каждое кольцо запоминает, где стоит, и это положение становится его собственным поворотом: после смены всё стоит, как стояло, и дальше крутится уже по новому режиму.
Zazerkalius v0.854 — по снимку кнопки «☀↔0»: «тут неверно: не на хотя бы половину, а так же — полностью только». Противолуч ставил «0» в каждую пустую ячейку строки за чертой, которую сектор напротив солнечной «1» накрывал хотя бы наполовину. Теперь — только в ячейку, накрытую целиком, как и «1» от солнца. Ячейки одного кольца равны, поэтому это ровно та ячейка, что напротив: она есть, когда полкруга — целое число ячеек (кольцо с чётным числом ячеек), а у нечётного кольца напротив оказывается шов между ячейками, и «0» не ставится.
Zazerkalius v0.855 — по снимку «⌖✕ сброс» и ряда режимов кручения: «не должен сбрасывать настройки кнопок, например этих». Сброс нажимал «⟲ всё на места», а тот возвращает из ⭐ умолчания (и из ★ начального положения в «📍») не только кольца, но и режим кручения, скорость с направлением, Аниматрицу, замки и оси. Теперь сброс запоминает эти настройки до ⟲ и возвращает после; режим — сменой режима, как в v0.853, чтобы кольца остались там, куда их поставил ⟲. Сам ⟲, нажатый отдельно, работает как прежде.
Zazerkalius v0.856 — по снимку ромба «▶ крутить» у холста конуса: «внизу от крутить справа, слева — стрелки шаги». Под ▶ — два ромба «◀ шаг» и «▶ шаг», сторона к стороне с ним, в той же решётке ромбов; размером 7/8, как ⌖✕ сброс. Они жмут ◀ ▶ шага из «Кручения» (шаг до прошлого / следующего события лазера выбранным режимом), и так же, как там, горит стрелка текущего направления. Чтобы стрелки не ушли за нижний край холста, вся связка ▶ / ⌖✕ / ⟲ поднята на полромба.
Zazerkalius v0.857 — по снимку ряда «− | ⇤ ▬ ⟲ Roboto Mono» над полем строк: «вертикальную полосу убери». Это была самодельная полоса прокрутки стола с окнами (#deskBar, с v0.645 — у правого края стола, вплотную к полю строк): её бегунок в ряду кнопок над строками читался вертикальной чертой между кнопкой соседнего окна и ⇤. Полосы больше нет — стол листается колесом, как левая панель с v0.601. Зубчатый край поля остался.
Хаб v0.087 и Zazerkalius v0.858 — «проверь на телефон версию». Снимки iPhone 13 и Pixel 7 показали три беды. На хабе стоя треугольник держали в 49 % высоты (под ним жили ноты), и дырка-кнопка выходила меньше порога 36 px: на iPhone её не было вовсе — вместо неё старые ноты, на Pixel — 39 px. Теперь, если дырка помещается (на телефоне порог 30 px), треугольник берёт до 90 % высоты — на iPhone во всю ширину, дырка 40 px. В Zazerkalius ромбы у конуса (пульт, ▶ крутить, шаги, ⌖✕, ⟲, ✛ оси, баланс) в 60 px закрывали полконуса на экране шириной 390 — на узком экране они на треть меньше, места считает тот же код по их настоящему размеру. И ромб «✛ оси» висел поверх кнопок «Вида»: его ставили под полосу вкладок групп, а на телефоне она под холстом; вкладки теперь учитываются, только если накрывают верх холста.
Zazerkalius v0.859 — по снимку ряда «⭐ Умолчание · ⟲» в левой панели: «тут переделай, пусть будут кнопки Запомнить и Восстановить и Сброс; Сброс — вообще всё ставит кнопки и положение окон и начальные биты как в первый раз». До этого запомненное возвращалось по частям и разными кнопками — «↺ Начало» брало из снимка биты, «⟲ всё на места» — кольца и настройки конуса, а раскладка окон и групп в снимок не входила вовсе (её считали своей у каждого экрана): вернуть страницу целиком было нечем, а вернуть её к самому первому виду — тем более. Теперь три кнопки. ⭐ Запомнить кладёт в снимок ВСЁ состояние страницы — биты всех полей, настройки всех кнопок, положения колец и теперь также окна, группы кнопок и ширины панели с полем (ZZ_HOME_SKIP — теперь один ключ home). ↺ Восстановить делает страницу этим снимком целиком — тем же путём, что и открытие файла сессии: снимок ложится в память страницы и страница перезагружается — так разом встают и окна, и группы, и все кнопки, без десятка отдельных применений. ✖ Сброс (спрашивает) ставит встроенное начальное состояние: столбик 1, 11, 101…, все настройки как в объявлении Z и расстановка окон считается заново. Запомненное ⭐ сброс не отнимает — переезжает в новую память, «Восстановить» вернёт его; прежняя память перед обеими кнопками откладывается копией (…_pered_vosstanovleniem, …_pered_sbrosom) — по тому же правилу, по которому страница не стирает молча сохранённое пользователем. ⟲ «на места» из этого ряда убрана — она и была повтором: живёт в «Кручении» и зелёным ромбом у холста конуса. Само начальное состояние пока встроенное: пользователь соберёт страницу по-своему и скажет, каким его сделать.
Zazerkalius v0.860 — продолжение v0.859: пользователь собрал страницу как надо и прислал файл «💾 В файл» (zazerkalius-vse-20261006-1853.json, страница v0.859) — это и есть то самое начальное состояние, которое он обещал сообщить. Его state (без ключа home — тот у каждого свой) лёг в zz-ui.js константой ZZ_FACTORY — сжатый JSON, 6,9 КБ, 153 ключа: строка «1» в поле, окно конуса распахнуто на весь стол, остальные 25 окон свёрнуты, десять групп конуса на своих местах и сцепках, дзен, поле справа, свои сцены «△ Сетки», вырезы T−1 с солнцем и луной, гамма 6. Теперь «✖ Сброс» ставит именно это, а не встроенный столбик 1, 11, 101… (он остался запасным путём: нет ZZ_FACTORY — сброс работает по-старому). У конуса отдельной страницей (?solo=cone) раскладка целой страницы ни к чему — снимается тем же списком ZZ_PRESET_LAYOUT, что и в пресетах. Запомненное ⭐ сброс по-прежнему не отнимает. Чтобы поменять начальное состояние впредь, хватит снова прислать файл «💾 В файл»: его state целиком заменит ZZ_FACTORY.
Zazerkalius v0.861 — по снимку кнопки «вырезы между»: «там описание кнопки неверное, и сделай почётче разницу между дугами вырезов и битов у внешнего кольца». Две правки. Первая: у полосы щелей (LAS_SEG, v0.762) пять вариантов («1 щель», «вырезы T−1», «вырезы между», «вырезы 2n», «все щели»), а подсказок было четыре: для «вырезов между» её не написали вовсе (v0.806), и весь хвост съехал на одну: «между» показывало текст от «2n», «2n» — от «всех щелей», а у «всех щелей» подсказки не было. Теперь у «вырезов между» своё описание (те же 2E − 1 частей, но вырез — по части между каждыми двумя соседними битами: бит, вырез, бит… бит; последний и первый бит вплотную — шов), все пять совпадают, а недостающая подсказка впредь даёт хотя бы название кнопки, а не «undefined». Вторая: у кольца за чертой и места бит, и вырезы читались одним тонким пунктиром — в «вырезах между», где они чередуются через одну, разобрать, где что, было нельзя. Теперь в любых вырезах место бита — сплошной контур акцентом, толще и ярче (0,95 вместо 0,75), вырез — пустое место, и его золотые края рисуются ПОВЕРХ мест (прежде шли до них и тонули под контуром ячейки). Пунктир остался там, где выреза нет: без режима вырезов и в «▦ любые», где все части равны и битом может стать любая.
Zazerkalius v0.862 — по снимку конуса со светом: «грани битов внешнего кольца другого цвета — сливаются с солнцем так» и «наверное надо отключить выделение границ внутренних битов золотой границей жирной — вообще от чего она неясно». Жирная золотая рамка на бите — это попадание (с v0.666): в этот бит упёрся свет — луч лазера или солнце; чем больше раз, тем ярче рамка, и рядом «×2», «×3»; счёт живёт в Z.voidHits, на пустых кольцах такие ячейки закрашены. Понять это со стороны было неоткуда — теперь в «Виде» есть кнопка «✦ попадания» (Z.coneHits, по умолчанию вкл): выключена — ни рамок, ни «×2», ни краски на пустых кольцах, а бит за чертой пишется просто «1», а не «11»; сам счёт при этом идёт как шёл. Вторая правка — цвет: у кольца за чертой края вырезов были золотыми, как и сам свет солнца с его лучами, и на этом кольце они сходились в одно пятно. Теперь там они голубые (cIn, #38bdf8) — и края, и пунктир частей внутри выреза; вместе с фиолетовым контуром мест бит (v0.861) кольцо читается под светом. У колец строк края вырезов остались золотыми — там про слияние речи не было.
Zazerkalius v0.863 — «когда навожу на кольца, надо толщать внутрь кольца границы, а не как сейчас наружу». Обводка наведённого кольца (с v0.088) рисовалась по радиусам rin − 0,06 dr и rout + 0,06 dr — вне самой полосы кольца, да ещё и чертой в 0,14 dr, которая строится пополам от радиуса: подсветка лезла на соседние кольца и прятала их края. Теперь обе черты лежат внутри кольца: середина черты — на полтолщины от своего края внутрь, так что край подсветки точно совпадает с краем кольца; узкое кольцо (тоньше двух черт) — обе сходятся к середине и подсвечивают его целиком, всё равно не выходя за края. Обводка ТЕКУЩЕГО кольца (голубая внутри, оранжевая снаружи, v0.087) пока как была — речь была про наведение.
Zazerkalius v0.864 — «пусть луна как и солнце светит только через вырезы, ни через 0 ни через 1 ни солнце ни луна не проходят; сделай такую настройку таблицу два столбца солнце и луна, потом можно ставить галки на каждой строке: первая — проход через 0, проход через 1; по умолчанию на этих двух галок нет, и дальше ещё строки — посмотри, какие настройки подходят». Расчёт. Раньше солнце и луна в вырезах T−1 всегда проходили сквозь «0» (v0.724), а луна ещё и сквозь «1» («☾ сквозь 1», по умолчанию вкл); без этой кнопки луна вообще начиналась у кольца за чертой, не проходя по кольцам из центра. Теперь проходы — шесть галок (Z.sunPass0 / sunPass1 / sunPassE и Z.moonPass0 / moonPass1 / moonPassE, хелпер sunPass(who, k)): «0» и «1» по умолчанию — стена для обоих, свет идёт только через вырезы; луна теперь ВСЕГДА идёт из центра, как солнце, и её останавливает «1»; проход через 1 у луны — то же, что было «☾ сквозь 1» (насквозь, с счётом «1» на пути каждого луча). У солнца проход через 1 — новое: попадание в бит всё равно считается (рамка, краска «1»), но свет идёт дальше. Третья галка — «проход через пустую ячейку» (v0.716): ячейка кольца за чертой, где бита ещё нет и свет накрыл не целиком; она стояла всегда, и чтобы не ломать нетронутое, её галка по умолчанию ВКЛЮЧЕНА (это не «0» и не «1» — про них было слово). Побочное: ноль, ставший стеной, солнце не перекрашивает в «1» в строке за чертой (раньше нуль был проходом, и такого попадания не было), кроме «⊕ xor», где переключение и есть смысл. Таблица. Плашка #sunMoonTbl в теле окна конуса (как «⟋ нить»): тянется за рамку, место — Z.sunTblXY, двойной щелчок — на место, ✕ закрывает, кнопка «☀☾ таблица» в группе «Солнце» — открывает (по умолчанию открыта, на узком экране — закрыта). Колонки ☀ и ☾; строки: проход через 0, проход через 1, проход через пустую ячейку — свои галки; дальше переехали подходящие прежние кнопки — «⟿ красить, когда прошёл всю ячейку» (общая для обеих колонок, одна галка), «⊕ xor», «☀↔0 противолуч», «☀ накрыты», «📏 по длине дуги» — у солнца только; «☾ только при затмении», «☾ зеркало остановленного 1» — у луны только. У этих восьми кнопок (еёщё «☾ сквозь 1») в разметке стоит hidden, обработчики живы: галка таблицы зовёт их обработчик, состояние берётся с их .on — логики не дублируется, настройки в группах (Солнце, За чертой, Строка 1, Щели) не дублируются. Кнопка «☾ сквозь 1» заменена строкой «проход через 1» у луны, Z.moonOne больше не читается — в том числе в заводском состоянии («✖ Сброс»): там он остался, но мёртвым. Таблица тускнеет, когда не ☀ солнце в «вырезах T−1»: галки тогда можно ставить заранее. Только в вырезах T−1 — без вырезов («все щели», «без щелей») свет считается как было.
Zazerkalius v0.865 — по снимку поля строк («1 — 1», «2 — 11», черта, «+ 3 ✕» и три ячейки «111»): «вот есть место — пусть когда последнее кольцо крутить вручную, когда 2 оборота, то открывается следующее кольцо, и при кручении любого кольца надо показывать число оборотов каждого; кнопку, которая выводит таблицу номер кольца и число оборотов, — это надо в строках сделать». Прочтено так: «место» — кнопка «+» у номера строки за чертой (fillCommit: строка уходит в поле, пустые ячейки — нулями, ниже открывается следующая), а «последнее кольцо, крутить вручную» — кольцо за чертой, которое крутят Ctrl + тянуть (или правой кнопкой) на холсте (v0.704). Два оборота. Пока кольцо за чертой тянут, его счёт оборотов (Z.coneFillTurns, чистый: назад вычитается) дошёл до двух → срабатывает то же, что «+». Рука не отпущена — тянется уже новое последнее кольцо, ещё два оборота — ещё одно. Порог — Z.coneOpenTurns (по умолчанию 2; 0 — не открывать само). Добавлено побочное в fillCommit: поворот кольца и его обороты теперь переезжают к новой строке (как у fillAutoCommit с v0.704, рукой накрученное — округлено до ячейки и по модулю круга), а новое кольцо за чертой стартует без накрутки: прежде «+» оставлял старый Z.coneFillTurn новому кольцу другой длины, а строке — ноль. Счёт оборотов. У каждого кольца — накопленные обороты, которые его провернули рукой (Z.coneTurns[i], кольцо за чертой — Z.coneFillTurns), со знаком: по часовой — «⟳», против — «⟲», дробь — неполный оборот. Пишется в строках бейджем .rtn у номера (после замка и «↻k») и у строки за чертой. Виден, когда нажата «⟳» в группе «Кручение» (#bConeTurns, Z.coneTurnsShow, правый щелчок — обнулить все) или пока любое кольцо крутят рукой (было в словах: «при кручении любого кольца надо показывать»): бейдж живой, число бежит под мышью. Счёт обнуляется «⟲ всё на места» и щелчком по «↻k» у кольца. Осталось: считается только рукой накрученное — автокручение «▶ крутить», шаги и обороты целого конуса не дают оборотов (в «всё» крутится весь вид, а не кольца); счёт живёт по номеру строки и сдвигается вместе с ним, как coneRot, — при удалении строки сдвигаются оба.
Zazerkalius v0.866 — ОТКАТ: «посмотри последние правки начиная с утолщения границы во внутрь кольца, там что-то всё пошло не так, откати». Страница и оба скрипта возвращены к v0.862 целиком, байт в байт; номер — следующий, v0.866, чтобы не спорить с кэшем и архивом. Сняты все три правки: v0.863 (обводка наведённого кольца внутрь), v0.864 (таблица «☀ Солнце | ☾ Луна», проход света только через вырезы) и v0.865 (счёт оборотов колец, два оборота кольца за чертой — «+»). Записи о них выше оставлены как история. Что именно пошло не так, пользователь не уточнил — откатывалось всё подряд, а не по одной; вернуть что-то из трёх — отдельной правкой по его слову. Память страницы: ключи, которые успели записать v0.864–v0.865 (sunTbl, sunPass…, moonPass…, coneTurns и др.), v0.862 просто не читает — вреда от них нет.
Zazerkalius v0.867 — по снимку таблицы «☀ Солнце · ☾ Луна» из v0.864: «и вот эту таблицу надо нормально сделать, и вообще все запросы по этим откатам попробуй норм реализовать». Три снятые в v0.866 правки сделаны заново, поверх v0.862, с разбором, что в них было не так. Обводка наведённого кольца — внутрь кольца, как в v0.863 (там ошибки не нашлось). Проходы света. Смысл v0.864 тот же: в вырезах солнце и луна идут из центра только сквозь вырезы, «0» и «1» — стена, пока не стоит галка; «пустая ячейка за чертой» по умолчанию пропускает, как было. Исправлено: (1) «☾ за 1» в v0.864 считал «упёршимся в 1» и свет, вставший на ноль-стену, — теперь только «1»; (2) ноль-стену солнце не перекрашивает, но попадание в неё засчитывается (в v0.864 оно выкидывалось целиком); (3) «☾ сквозь 1» не спрятана, а стала той же галкой, что «проход сквозь «1»» у луны (Z.moonPass1, по умолчанию нет); (4) «⟿ пройденную целиком» — у солнца и луны свои галки (Z.sunSweep, Z.moonSweep; не задано у луны — как у солнца, так было), кнопка «⟿ проход» ставит обеим. Таблица сделана заново: ромбы-галки ровно под ☀ и ☾ (у настройки, которой у этого света нет, клетка пустая — без «—» и без одной галки на две колонки), разделы «Проход сквозь», «Красить за чертой», «Свет солнца», «Луна светит», заголовки колонок в одну строку, тянется только за шапку (раньше — за любое место плашки), видна только при ☀ солнце. Восемь прежних кнопок света в группах больше НЕ прячутся (v0.864 прятала) — таблица жмёт их же, двух мест для одной настройки не заведено, раскладка групп не трогается. Открыть / закрыть — «☀☾» в «Солнце». Обороты колец. В v0.865 были две поломки: комментарий посреди строки «съел» сохранение и перерисовку у щелчка по «↻k» (накрутка снималась, но не сохранялась), и бейдж оборотов вставал в сетку номеров перед счётчиками — при включении сдвигал столбики «н·м» и «0:1» вбок, а показ «пока крутят» дёргал всё поле на каждом взятии кольца. Теперь столбик оборотов — последним, после счётчиков, и есть только при нажатой «⟳» в «Кручении»; пока кольцо тянут, число оборотов видно у мыши (поверх, ничего не сдвигает). Два оборота кольца за чертой рукой — открывается следующее кольцо, как «+» (порог Z.coneOpenTurns, по умолчанию 2). «+» переносит поворот и обороты кольца за чертой в его строку.
Zazerkalius v0.868 — по снимку: «луна за 1 не заходит, но почему лучи во внешнем кольце её». Свечение луны за кольцом за чертой (v0.714) рисовало весь её сектор — зеркало вылетевшего солнца, — не глядя, дошла ли она туда. Пока «1» луну пропускала по умолчанию («☾ сквозь 1»), рисунок совпадал с расчётом; с проходами v0.867 луна встаёт на «1», а синее за кольцом оставалось. Теперь там рисуется только свет луны, который прошёл кольцо за чертой (S.aout из coneSunTrace), — как у солнца, у которого за кольцом только вылетевшее (S.out). Сам расчёт (куда луна ставит нули) не менялся. Осталось: доли «☾ …» в подписях за крайним кольцом по-прежнему считаются от всего сектора луны (S.a0), а не от дошедшего.
Zazerkalius v0.869 — по снимку поля строк: «подвинь номера строк левее, ближе к границе — много свободного места пустует, и кручение — число оборотов сделай крупнее, и «−» знак, если в обратную сторону, против часовой», «и цветом красным». Номера. Столбик номеров был 30 px при любом числе цифр — одна цифра стояла справа, слева пустовало. Теперь его ширина — по цифрам самого большого номера в поле (строки, за чертой, пустые кольца до 256; rowNumDigits → --rnd), номер прижат к границе. Номер строки за чертой с «+ ✕» под ним занимает столбики номера и замка (замка у неё нет), иначе «+ ✕» не влезали в узкий столбик. Кручение. Числа столбика кручения (сдвиг строки по кругу, накрутка кольца на вид) и столбика оборотов «⟳» — крупнее, как номера (13 px, жирно). По часовой — «↻k», против часовой — «↺−k» красным (rotTxt, класс .ccw); так же и число у мыши, пока кольцо тянут. Направление сверено с холстом: сдвиг строки влево и положительная накрутка ведут бит 0 против часовой. Прежде «⟳k» у сдвига влево показывал стрелку по часовой — было наоборот.
Zazerkalius v0.870 — «нужен режим, когда при переходе на внешнее кольцо — остановка предыдущих, когда крутятся только 2 последних кольца». Кнопка «◎ 2 посл.» в «Кручении» (Z.coneLast2): крутятся только кольцо последней строки и кольцо за чертой (пустые кольца за ним — тоже, как были); кольца строк выше стоят, каждое там, где его застало. Ушла строка из-за черты в поле — прежнее последнее кольцо встаёт сразу, в тот же миг (а не к следующему кадру), крутятся новые два; строка вернулась за черту (|◀, ↩) — её кольцо снова крутится, со своего места, без скачка. Устроено как остановка лазером (v0.138): стоящее кольцо держит свою фазу (Z.coneHold), отпущенное идёт дальше со сдвигом (Z.coneHoldOff); coneHoldSync приводит набор стоящих к числу строк. Действует в «Каждое», «Встреч Стр», «Встреч Бит» и в «▦ побитно» (стоящие строки не сдвигаются); во «Всё» весь конус — один поворот, кнопка затемнена с причиной. ⟲ на места, сброс кручения, смена режима и выбор положения 📍 начинают стоящие заново; «⌖✕ сброс» саму кнопку не выключает. Осталось: «последние» — ровно два; если понадобится 3 и больше — сделать числом.
Zazerkalius v0.871 — по снимку ряда «Щели» (1 щель · вырезы T−1 · вырезы между · вырезы 2n · все щели): «это виды колец, сделай таблицу Кольца: могут быть T, 2T−1, 2T, разреженные через вырезы, и ещё новое: разреженные по симметрии — то есть 1 и 1 в кольце из 3-х друг напротив друга, образуя 2 выреза». Новый вид — «по симметрии» (Z.coneSlits = "cutS"). Как в «вырезах между», кольцо строки из T бит — 2T − 1 частей, но биты стоят на равных расстояниях: бит j начинается с части j·(2T − 1)/T, между каждыми двумя соседними — и между последним и первым — вырез в (T − 1)/T части; вырезов T, шва нет. У строки 2 — ровно пример из слов: кольцо из 3 частей, два бита напротив друг друга, два выреза по полчасти. По умолчанию бит 0 серединой на вертикали. Начала бит дробные, а весь код вырезов считал целыми частями, поэтому: cutPos(q, n) берёт и длину строки, cutBit работает по дробной координате, края вырезов — общий список cutEdges(n), попадания солнца и нули луны в этом виде считаются по ячейкам бит (cutSymHits), а не перебором целых частей. Работает везде, где работают «вырезы между»: рисунок колец строк, кольца за чертой и пустых, луч лазера, солнце и луна, xor, ⟿, противолуч, щелчок по кольцу. В 3D-торах и «◇ пред.» — нет (они только для T−1). В ряду «Щели» новый вариант стоит после «вырезов между». Таблица «◯ Кольца» (#ringTbl, RINGTBL, кнопка «◯ Кольца» в «Щелях»): все шесть видов строкой — картинка кольца строки 2 и строки 3, вид, сколько частей (T, 2T−1, 2T), какие вырезы; щелчок по строке — выбрать, выбранный горит ромбом. Выбор идёт тем же путём, что ряд кнопок «Щели», двух мест для одного выбора нет. Тянется за шапку, ✕ закрывает; без луча-часов тусклая.
Zazerkalius v0.872 — по кнопке «✚ 4 части»: «сделай там настройку — когда 2 части это солнце, а крест-симметричные — луна». При ✚ солнце выходит из двух чёрных четвертей, стоящих напротив друг друга, а луна — отражение вылетевшего света через центр (+180°), и это отражение ложилось на те же самые две четверти: луна светила там же, где солнце. «☾ крестом» (Z.moonCross, кнопка рядом с «✚ 4 части» и строка в таблице «☀ Солнце · ☾ Луна», раздел «Луна светит») — луна тот же свет, но повёрнутый на 90°, по симметрии креста: при ✚ это две белые четверти. Тот же поворот — и у правила «ноль только в прилегающем кольце» (v0.723). Без ✚ тоже действует — поворот на 90° вместо 180°. Рядом остаётся «☀☾» (v0.807): там луна — свой свет из белых четвертей сразу, а не повёрнутый вылетевший свет солнца.
Zazerkalius v0.873 — по кнопке «☾ сквозь 1» и строке «1» таблицы «☀ Солнце · ☾ Луна»: «тут имеется в виду, что вообще луна проходит сквозь единицы, без учёта толщины пройденных — её отключи, ошибка, и в таблице». С v0.726 луна, пройдя «1», считала их на пути каждого луча, и 0 вставал только в ячейку, которую целиком накрыл свет с одним и тем же счётом; накрыта лучами с разным счётом — свет есть, а нуля нет. Счёт снят: «1» луна проходит, как вырез, и 0 встаёт в любую ячейку за чертой, которую её свет накрыл целиком. Кнопка и строка таблицы — одна настройка (Z.moonPass1), подсказки переписаны.
Zazerkalius v0.874 — «почему-то первое кольцо крутится вручную в другую сторону». У всех колец поворот идёт со знаком «−» (бит j — на угле −90° + (j − поворот)·шаг), а четверти «✚ 4 части» строки 1 — со знаком «+», с v0.743. Значит ✚ шёл против мыши и при «▶ крутить» — навстречу остальным кольцам. Знак общий теперь везде, где есть ✚: рисунок четвертей (оба места), свет солнца и луны из них (coneQuadArcs) и проверка, выходит ли луч (coneQuadOpen). Заодно строка 1 рукой идёт за мышью: у ✚ шаг строки 1 — четверть круга, у ◐ — половина, и оборот мыши крутил их на четверть / половину оборота; теперь довод умножается (4 / n и 2 / n), защёлка на щель лазера в этих видах не срабатывает (щели там нет). И при отпускании довод приводится к кругу по 720°, а не по 360°: при ✚ и ◐ 360° довода — не целый круг рисунка, строка 1 прыгала на соседнюю четверть или половину (это было и раньше), а у «☀/☾ оборот» менялась чётность оборота.
Zazerkalius v0.875 — «когда кручу руками кольцо, надо от всех его границ и частей 1/2 каждого бита лучи в центр показать и магнитить к внутренним границам любого уровня». Пока кольцо строки тянут рукой (Ctrl + тянуть), и кольцо за чертой тоже, — от каждой его границы луч до центра (сплошной, цветом акцента) и от середины каждого бита (пунктир). В вырезах границы — края бит и частей, середины — только у бит. Своя граница или середина бита ближе ~7 px к границе любого кольца внутри (все уровни, до строки 1) — кольцо прилипает, линия привязки через центр — как у «🧲 магнита». Отпустил прилипшим — поворот остаётся дробным (Z.coneFree, как у 🧲): строка повёрнута на прошедшие целые биты, остаток — на вид; кольцо за чертой — без округления до ячейки (Z.coneFillFree), и когда строка уйдёт в поле, её кольцо так и останется. Не прилипло — всё как было. У «🧲 магнита» своё — он тянет без Ctrl и ко всему (оси, середины, симметрия); лучей у него нет.
Zazerkalius v0.876 — по разделу «Луна светит» таблицы «☀ Солнце · ☾ Луна»: «тут надо пункт — луна светит всегда и ставит 0, если остальными условиями свет доходит до битов». Новая строка первой в разделе — «всегда — свой свет из центра» (Z.moonAlways, только в таблице): луна больше не зеркало солнца (вылетевшего, при затмении, упёршегося в «1», крестом), а свой свет из центра во все стороны, всегда. Идёт по своим проходам из таблицы — вырезы, «0», «1», пустая ячейка за чертой — и ставит 0 в ячейку за чертой, которую её свет накрыл целиком, где угодно (ограничение v0.723 «только напротив, где солнце упёрлось в кольцо перед чертой» снято, как в ☀☾). Солнце красит первым, поэтому ячейку, которую в тот же шаг накрыли оба, получает солнце. При ☀☾ и «☀/☾ оборот» у луны свой свет, они главнее. Осталось: пока луна светит во весь круг, не встретив стен, её синее зарево не рисуется (рисунок берёт только куски меньше круга) — видно с первого кольца, где свет режется.
Zazerkalius v0.877 — «у 1 бита не видно внутренней границы: линии разделения из центра наружу и симметричные половины». Черта между битами рисуется, только если ячейка у ВНУТРЕННЕГО края кольца шире 3 px — чтобы на мелких кольцах черты не сливались. У кольца строки 1 внутренний край — сам центр (радиус 0, с v0.774), и черты у него не было никогда. Теперь у такого кольца меряется внешний край. У кольца из одного бита черта границы ярче, и к ней — пунктиром черта по середине бита: вместе это линия через центр, которая делит бит на симметричные половины. И лучи v0.875 теперь есть и у строки 1, когда её крутят рукой (Ctrl + тянуть): у обычной — граница и середина бита, у ✚ — четыре границы четвертей и их середины, у ◐ — края половин. Они же — цели магнита для колец снаружи.
Zazerkalius v0.878 — по снимку солнца в вырезах: «сделай режим по умолчанию в Виде, чтобы лучи солнца и луны не прерывались там, где они проходят; если в настройках луна сквозь 1 идёт — лучи также». Свечение света рисовалось по кольцам, у каждого свой градиент: ярко у внутреннего края, бледно у внешнего (v0.686, у луны v0.708). На каждой границе колец свет начинался заново, и луч, идущий насквозь, выглядел нарезанным; у солнца над кольцом строки 2 свечения не было вовсе. «☀ сплошной» (Z.lightSolid, кнопка в «Виде», по умолчанию вкл) — один градиент от солнца до края строки за чертой на все кольца, и такой же — у луны (и у её начала от диска): где свет проходит дальше — вырез, «0» или «1» по галкам таблицы ☀☾ — луч идёт сплошным, где встал — там и кончается. Выключить — как было, по кольцам. Сам расчёт света не менялся, только рисунок.
Zazerkalius v0.879 — по снимку («☀ = 1 бит», строка 2 «11» по симметрии, два выреза слева и справа): «всё равно не светит в проходах». Свечение на кольце рисуется по свету, который к нему ПРИШЁЛ, и свет во весь круг пропускается — иначе всё кольцо было бы золотым. А к кольцу строки 2 от солнца приходит как раз весь круг, поэтому в его вырезах было темно, а свет появлялся только за ним. Теперь при «☀ сплошном»: пришёл весь круг — на кольце рисуется свет, прошедший сквозь него (свет перед следующим кольцом, за последним — вылетевший), то есть ровно по проходам. У луны так же — это нужно «☾ всегда», где она светит во весь круг.
Zazerkalius v0.880 — по снимку ◐ (свет из открытой нижней половины строки 1, строка 2 с вырезами слева и справа): «ещё режим — солнце, это когда лучи меньше 180 градусов, если = 180, то это луна». Строка «свет в 180° и шире — луна» в разделе «Луна светит» таблицы ☀☾ (Z.sunWideMoon): свет солнца делится на куски — связные дуги (кусок через верх — один, lightPieces). Кусок уже 180° — солнце: ставит 1 и рисуется золотом. Кусок в 180° и шире — луна: ячейку за чертой, которую он накрыл целиком, делает 0 (а не 1) и рисуется синим. Идёт свет как шёл, меняется только, кто он: свет из ◐ — ровно половина, поэтому луна; прошёл в вырезы, сузился — уже солнце. Шире 180° (например, весь круг) тоже считается луной — солнце это только «меньше 180°». Только в вырезах.
Zazerkalius v0.881 — «1 кольцо магнитить к осям, остальные к осям не магнитить». У «🧲 магнита» оси (вертикаль и горизонталь) были целью для любого кольца — теперь только для кольца строки 1; остальные кольца тянутся к кольцам (границы, середины, оси симметрии), но не к осям. И строка 1, когда её крутят рукой (Ctrl + тянуть, без 🧲), теперь сама прилипает к осям: её граница или середина бита — у ✚ границы и середины четвертей, у ◐ края и середины половин — ближе ~7 px к оси встаёт на неё, видна линия привязки (coneR1AxisSnap). При лазере защёлка выреза на луч главнее: сначала она, и только если не сработала — оси.
Zazerkalius v0.882 — по галке «🎨 одинак.»: «отключаю это — через Восстановить всё равно всплывает, отключи её по умолчанию». Галка не сохранялась вовсе: её состояние жило только в разметке страницы (checked), и любая перезагрузка — в том числе «↺ Восстановить» и «✖ Сброс», которые перезагружают страницу, — включала её снова. Теперь она хранится в памяти страницы (Z.coneSame), как прочие настройки, и по умолчанию выключена.
Zazerkalius v0.883 — две просьбы и две найденные попутно ошибки. «У 1 бита также не видно разреза» (снимок: строка 1 при солнце — серый круг с точкой): при солнце строка 1 рисуется своей веткой (круг от центра, v0.774), и черта v0.877 туда не попадала. Теперь и там — черта границы бита от центра до края и пунктир по его середине, вместе — разрез через центр (coneR1Cut); то же у «☀ = 1 бит». «Тут первый бит тоже надо крутить, выравнивать» (по кнопкам «▥ центр · ◧ лево · ◨ право»): выравнивание касалось только колец строк 2…, строка 1 стояла как была. Теперь кнопка доворачивает и её (coneR1Align, через довод строки 1): бит — «центр»: середина бита на вертикали, «лево» / «право»: граница на вертикали; ◐ — «центр»: половина с битом сверху, «лево»: открытая половина справа от вертикали (вырез по часовой), «право»: слева; ✚ — «центр»: чёрная четверть серединой на вертикали, «лево»: начинается на ней, «право»: кончается. При ▮ щели — не трогается. Ошибки. Мои комментарии, вставленные посреди строки, съели код (та же беда, что в правилах — шестая оговорка): в v0.871 у переключателя вида колец — сброс прошлого света и луча (после смены вида свет мог не пересчитаться сразу), в v0.870 у «📍 положения» — довод строки 1 и поворот кольца за чертой (положение ставилось без них). Комментарии перенесены в конец строк.
Zazerkalius v0.884 — «1 строку также магнитить и к 2 строке симметрии; вообще нужен переключатель магнит по симметрии: магнитить в оба кольца — внутреннее и наружное, и каждое по отдельности». Кнопка «🧲 сим.» в «Кручении» (Z.magSym), по кругу: оба (по умолчанию) → внутр. → наруж. → нет. При кручении рукой кольцо прилипает — кроме границ колец внутри (v0.875) — к осям симметрии соседа: внутреннего (строка выше), наружного (строка ниже) или обоих. Строка 1 — к осям симметрии строки 2 (вместе с вертикалью и горизонталью, v0.881). Ось симметрии считается по рисунку кольца, а не только по строке бит (coneRingSymAxes): у кольца с вырезом ось проходит и через середину выреза, у «по симметрии» — по равным промежуткам, у строки 1 — по четвертям ✚ или половинам ◐. Ось — линия через центр, прилипают к обеим её половинам. Попутно проверка «комментарий посреди строки» нашла ещё две старые строки (v0.812): у кнопок «☀☾» и «☀/☾ оборот» комментарий съедал сохранение и перерисовку — переключение не запоминалось и конус не обновлялся сразу. Исправлено.
Zazerkalius v0.885 — по снимку поля строк и зубцов его края: «строки! текущую версию строк заархивировать; сюда делаем сетку ромбоидную: каждый бит в ромбе, ромб отталкиваемся от ромбов границы, и при масштабировании в 2 раза всё — только шаг, когда шрифт меняем». Новый вид бит в поле — «◇ сетка» (Z.bitView = "rg", в списке вида бит рядом с «01 цифры», «квадраты», «ромбы»). Бит — высокий ромб из двух равносторонних треугольников, ровно как зубец края поля (#fieldZigOv): высота — ряд H, ширина H / √3; ромбы в ряду вплотную, вершина к вершине, цифра — внутри (единица — светлый ромб, ноль — бледный). Ряд — ровно H: подгонка строк под высоту поля (rowsFit) в этом виде не ужимает. H зависит от шрифта поля только шагами вдвое: 12, 24 (как зубцы края), 48, 96 (rgStep, шрифт 16 — 24). Архив. Прежние виды поля не тронуты и выбираются в том же списке; в облаке папки archive\ нет — версия v0.884 лежит в git и её подтянет _arhiv-iz-git.bat. Осталось: ряды по высоте пока не выровнены по зубцам края (их сетка сдвинута по полосе вкладок) — поле листается, и совпадение всё равно уходит.
Zazerkalius v0.886 — по снимку шапки «☀ Солнце · ☾ Луна»: «новые панели также зубцами границы, как у всех групп кнопок, и кнопки для закрепа в дзен режиме». Плашки «☀ Солнце · ☾ Луна» и «◯ Кольца» — с зубчатыми боками, как у групп (plateZig, тот же расчёт, что tzgFrame): левый край — выемкой, правый — остриём, шаг 24 px, рамка — цветом плашки, высота добирается до целого ряда, чтобы низ кончался целым зубцом. В шапке — 🧘, как у групп: нажата — плашка видна и в дзене (Z.sunTblZen, Z.ringTblZen). И по слову «при наружном магните 1 кольцо не должно магнититься с осями»: при «🧲 сим.: наруж.» строка 1 прилипает только к осям симметрии строки 2, к вертикали и горизонтали — нет; при «оба», «внутр.», «нет» оси остаются.
Zazerkalius v0.887 — «а когда отключён магнит, тоже не надо»: строка 1 рукой прилипает к вертикали и горизонтали только при «🧲 сим.: оба» и «внутр.»; при «наруж.» — только к осям строки 2, при «нет» — ни к чему.
Zazerkalius v0.888 — «эту таблицу надо куда-нибудь в Справочник» (таблица из ответа: что делает строка 1 при кручении рукой по «🧲 сим.»). В окне «📖 Подсказки» (кнопка «?» в шапке) — раздел «🧲 Магнит при кручении рукой» после «◯ Конуса»: лучи от границ и середин бит, прилипание к границам колец внутри и к осям симметрии соседей, и таблица для строки 1 — оба / внутр. / наруж. / нет против «вертикаль и горизонталь» и «оси симметрии строки 2». Справка открывается сама, видимого текста на поле не прибавилось.
Zazerkalius v0.889 — по снимку ромба ⠿ у пульта: «двойной клик всю эту группу сворачивает в эту одну кнопку, привязанную к оси». Двойной щелчок по ⠿ сворачивает пульт #cone3Pad: остальные ромбы прячутся, ⠿ встаёт на место ⌂ — ровно на горизонталь через центр конуса — и по-прежнему тянется вдоль неё; ещё двойной щелчок разворачивает пульт целиком. Состояние — Z.padFold, переживает перезагрузку. Пустая коробка свёрнутого пульта мышь не ловит (pointer-events), холст под ней жмётся. Прежний двойной щелчок по ⠿ «на другую сторону» (v0.813 / v0.820) снят: сторону и место и так задаёт перетаскивание. Ромбы у вертикальной оси (⌖✕, ▶, шаги, ⟲, ✛ оси, баланс) — не пульт, их свёртка не трогает.
Zazerkalius v0.890 — по снимку «🧲 сим.: наруж.»: «не работает, у 1 к 2 строке не магнитит». Причина: при лазере и солнце строка 1 рукой крутится своим обработчиком, и там сперва срабатывала защёлка выреза на лазере (v0.139), а к осям (v0.881) и к осям симметрии строки 2 (v0.884) — только если она не взяла. Допуск лазера — 10 px по радиусу кольца 1; с пустыми кольцами до 256 кольцо 1 в пару пикселей, допуск выходил больше полкруга, и защёлка брала любой угол. Теперь допуск лазера не шире, чем у осей (радиус считается не меньше 20 px), а лазер и ось меряются вместе (coneAimSnapD — только мерка): прилипает то, что ближе. Проверено расчётом: при солнце и «наруж.» строка 1 «1» встаёт на оси строки 2 «10», к лазеру — только рядом с ним; при «нет» — только к лазеру.
Zazerkalius v0.891 — по снимку ⠿ — «ничего не происходит»: свёртка пульта v0.889 не включалась. При нажатии пульт берёт указатель себе (setPointerCapture — чтобы его тянуть), и тогда двойной щелчок браузер отдаёт уже пульту, а не ⠿: обработчик на ⠿ не срабатывал никогда — и прежний «на другую сторону» (v0.813) тоже. Теперь двойной щелчок ловится в самом нажатии: два нажатия на ⠿ без сдвига за 450 мс. Проверено в браузере (Playwright): свернуть — пульт в один ⠿ на месте ⌂, ещё двойной щелчок по нему — развернуть.
Zazerkalius v0.892 — две просьбы. 1) По снимку шапки «☀ Солнце · ☾ Луна»: «магнитить так же, как все, и ширину уменьши, сократи текст, отдели фоном разные подгруппы». Плашки #sunMoonTbl и #ringTbl, когда их тянут, прилипают тем же магнитом, что группы конуса (snapXY из полосы групп отдан наружу как window.zzPlateSnap, у плашек — plateSnap): зубцы к соседке сбоку, рамка на рамку сверху и снизу, края окна, поля строк и групп; то, к чему прилипла, светится. Прицепки к группе нет, только место. Подписи строк короче («пустая за чертой», «пройдена вся», «⊕ заново», «0 напротив 1», «строка 1 накрыта», «всегда», «свет ≥ 180°», «при затмении», «крестом, 90°», «солнце в «1»»), полный текст — в подсказке строки; шапка — «☀ · ☾»; столбцы галок 26 px (были 38). Ширина вышла около 190 px. У каждой подгруппы свой фон и цвет заголовка: проход — бирюза, за чертой — зелёный, солнце — золото, луна — голубой. 2) По снимку ● mp4 ↻1 ▣ под группой «Щели»: «пусть панели перекрывают в дзене эти кнопки». В дзене окно конуса — свой слой на весь экран (z-index 1000), а кнопки записи лежали в body с z-index 1001, и группы окна перекрыть их не могли. Теперь в дзене цепочка записи переезжает в тело окна конуса (z-index 4 — над холстом, под полосой групп с её 5 и под плашками), вне дзена — обратно в body. Проверено в браузере (Playwright): плашка встала рамкой на низ группы «Вид» и подсветила её; в дзене кнопки — в .wbody с z-index 4, после выхода — снова в body.
Zazerkalius v0.893 — по снимку ◐ (строка 1 — полукруг, солнце — точка в центре, свечение начинается только с кольца строки 2): «показывай свечение, если оно из центра, — из центра, а не со 2 строки». Внутри круга строки 1 теперь рисуется тот же свет от самой точки солнца — ровно в те стороны, куда он выходит из строки 1 (полоса 1 трассы: при ◐ — открытая половина, при ✚ — чёрные четверти; выходит во все стороны — светится весь круг). Луна так же (её первая полоса и сектор от диска — от центра). Общие градиенты «☀ сплошного света» начинаются в центре, без шва на краю строки 1. При «☀ = 1 бит» строка 1 сама солнце — там как было. Проверено снимком в браузере (Playwright): ◐ — золотая открытая половина от точки солнца, бит «0» — весь круг.
Zazerkalius v0.894 — две ошибки. 1) По снимку ◐ без света — «также нет света из центра»: у пользователя включены и ◐, и «☀ = 1 бит». Строка 1 рисуется веткой ✚ / ▮ / ◐ раньше ветки «☀ = 1 бит», а свечение из центра (v0.893) выключалось по одному флагу Z.sunRow1 — при ◐ его не было. Теперь оно выключается, только когда строка 1 и правда нарисована золотым кругом-солнцем. 2) По консоли пользователя — сотни «Cannot read properties of undefined (reading 'length')» в pointermove и up холста конуса: в вырезах coneRing над вырезом кольца за чертой возвращал кольцо с номером N без пометки fill (v0.675: «в вырезе ячейки нет»), и кручение рукой брало несуществующую строку Z.rows[N] на каждом движении мыши. Теперь там fill: −1 — кольцо за чертой, ячейки нет: за вырез его можно крутить, как за ячейку; подсветка ячейки (coneFillHoverAt) вырез пропускает. Проверено в браузере (Playwright): ◐ при «☀ = 1 бит» — золотая открытая половина от центра; правой кнопкой за вырез кольца за чертой — крутится, ошибок 0. Заодно ответ на вопрос «при 3600°/с точность 100 % или пропуски?»: тот же поворот в 7200° кадрами по 60° (3600°/с при 60 кадрах), по 1° и по 0,1° («Встреч Стр», солнце, «Без щелей», ⟿ за один проход; вырезы T−1, между, по симметрии) дал одинаковые строки, ту же строку за чертой и тот же счёт попаданий. Кадр сам дробится на шаги не шире щели (coneClockSweep), а не успел за ~12 мс — кольца в этом кадре докручиваются только до просчитанного: кручение медленнее показанной скорости, но без пропусков. Предел — 2000 шагов на кадр; в режимах «по биту» его можно упереть кольцом из 1 бита (360° на бит), тогда шаг шире щели.
Zazerkalius v0.895 — по снимку «▥ центр · ◧ лево · ◨ право»: «начальное положение сделай 4 пункт — из памяти, запоминать после нажатия левой кнопкой по ней же». Четвёртая кнопка «💾 память» (Z.cutAlign = "m"): начало каждого кольца в вырезах — из памяти Z.cutMem[вид вырезов][номер кольца] = [длина строки, сдвиг]; не запомнено или длина строки другая — как «▥ центр». Щелчок по уже горящей «💾 память» (у ряда кнопок LAS_SEG теперь есть хук again — повторный щелчок по выбранному) запоминает, как кольца стоят сейчас, вместе с поворотом и фазой кручения, и делает «на места»: кольца не сдвигаются, а ⟲ и сброс дальше возвращают их сюда. Кольцо за чертой — под своим номером: ушло в поле — место сохраняется. Строка 1 (довод) не трогается. Проверено в браузере (Playwright): после запоминания положения колец те же, после кручения ⟲ возвращает ровно в запомненное, «▥ центр» — на прежние места.
Zazerkalius v0.896 — исправление v0.895: комментарий «// v0.895: и «💾 память»» встал посреди строки обработчика #bCutAlign и съел её хвост — доворот строки 1 (coneR1Align), сброс счёта лазера и солнца, save, renderRows и renderCone при переключении «▥ центр · ◧ лево · ◨ право · 💾 память». Пойман проверкой на «съеденные» строки сразу после пуша; комментарий перенесён в конец строки.
Zazerkalius v0.897 — по картинке «по углу · по длине сейчас · предлагаю» (нарисована в ответ на «объясни, как это сейчас работает, попроще, может на картинке»): «да, сделай и этот вариант», затем «эту картинку в справочник». «📏» в «Щелях» — по кругу выкл → по краю → по середине (Z.cutLen: false / true / "mid"; прежнее true — это «по краю», сохранённое не меняется). По краю — как было: радиус кольца строки m — m, свет с кольца на кольцо сужается в m/(m+1); почти не расползается, но в вырезах T−1 немного залезает на соседние части (1 → 1,11 → 1,17 → 1,2 → 1,22 части). По середине — длина меряется по средней линии кольца (радиус m − ½), сужение (2m−1)/(2m+1) (coneLenK): в T−1 у кольца строки m 2m − 1 частей, и свет, накрывший k частей, на каждом следующем кольце накрывает ровно k, края — на границах частей. Картинка — файл zazerkalius/spravka-po-dline.svg, в окне «📖 Подсказки» раздел «📏 Свет по длине» (класс .hlpImg). Проверено в браузере (Playwright): кнопка ходит по кругу, множитель для кольца 3 — 3/4 и 5/7, картинка грузится.
Zazerkalius v0.898 — две просьбы. 1) По снимку ✚ 4 части — «почему солнце серое, а не всё жёлтое? лучи». Чёрные четверти (солнце) лежат друг напротив друга, а луна — свет, вылетевший из конуса, отражённый через центр, — всегда падает в противоположную четверть, тоже солнечную; синий свет луны ложился поверх золотого, выходил серый клин. Ячейку, накрытую в тот же шаг и солнцем, красит солнце — теперь так и рисуется: луна только там, где на том же кольце (и в круге строки 1) солнца нет (sunDrawn, notSun в renderCone); голубые края лучей луны остаются. Луне место — в белых четвертях: «☾ крестом». 2) «Как вообще отключать луну на любых режимах?» — отдельного выключателя не было. Строка «луны нет» (Z.moonOff) в таблице «☀ · ☾», раздел «Луна светит»: блок луны в coneSunTrace не считается вовсе — ни зеркала, ни «☾ всегда», ни ☀☾ / «☀/☾ оборот», ни «свет ≥ 180°» (sunWideMoonOn); нулей от луны и синего света нет; в тексте алгоритма — «Луна: выключена». Проверено в браузере (Playwright): серого клина нет; с «луны нет» свет луны пуст и при «☾ всегда» и «≥ 180°».
Zazerkalius v0.899 — по снимку таблицы «☀ · ☾»: «тут вместо ромбогалочек прямо ставь луну или солнце, с подсветкой или без, когда выкл, и верхнюю строку можно убрать». Галка .smk — сам значок своего столбца (☀ — текстовым видом \2600\FE0E, чтобы не стал цветным эмодзи и взял цвет; ☾): включено — ярко, со свечением (text-shadow); выключено — тусклый, серый, без свечения; наведение — чуть ярче. Строки-заголовка «☀ ☾» (thead) больше нет. Проверено снимком в браузере (Playwright).
Zazerkalius v0.900 — по снимку «💾 память»: «непонятно, как работает; пусть, если включена, запоминает постоянно последнее положение после ручного редактирования». При «💾 память» кольцо, повёрнутое рукой (Ctrl / правой кнопкой, 🧲, прилипание), сразу запоминается там, где его отпустили (cutMemAbsorb): его поворот рукой уходит в память сдвигом, сам поворот — в ноль, кольцо не двигается. «⟲ на места» и сброс возвращают кольца в последнее положение, поставленное рукой; фаза кручения — своя, как была. Кольцо за чертой — так же (Z.coneFillTurn). Щелчок по горящей «💾 память» по-прежнему запоминает все кольца разом. Проверено в браузере (Playwright): кольцо 3 и кольцо за чертой правой кнопкой — остались, где отпущены; после кручения ⟲ вернула ровно туда.
Zazerkalius v0.901 — по снимку ✚ 4 части: «тут не надо окружность солнца — просто сразу лучи из центра и луны». Золотого круга солнца в центре строки 1 при ✚ больше нет: свет солнца и луны идёт прямо из точки центра (свечение r1Glow v0.893). Проверено снимком в браузере (Playwright).
Zazerkalius v0.902 — по снимку бита «1» под светом: «когда солнце упирается в 1, уже окрашенную бит, то не надо на неё свет пускать — остановиться на границе её». На каждом кольце рисовался весь свет, пришедший к кольцу, — и тот, что упёрся в стену. Теперь coneSunTrace отдаёт pass — свет, прошедший каждое кольцо (через вырезы, «0» / «1» / пустые по галкам), и на кольце рисуется только он: упёршийся в «1» обрывается на внутренней границе этого кольца, сама клетка не светится (золотая рамка попадания остаётся). Луна — как была. Проверено снимком в браузере (Playwright).
Zazerkalius v0.903 — по снимку «📏 по краю» и ✚: «покажи все сразу тут кнопки и добавь «Через центр» — свет, когда насквозь пролетает, но через центр только, тут обрежется по краям лучей». «📏» — рядом кнопок (LAS_SEG): нет · по краю · по середине · через центр. «Через центр» (Z.cutLen = "ctr", coneLenF) — свет — пучок параллельных лучей с осью через центр: постоянна ширина пучка (хорда), края прямые; с кольца строки m на m + 1 половина угла куска h → asin(sin h · m/(m + 1)), кусок в 180° и шире — шириной во весь диаметр. «По краю» хранит длину дуги, «через центр» — ширину; на широком свете разница заметна: четверть ✚ на кольце строки 2 — 45° по краю, 41° через центр (30° по середине). Справка «📏 Свет по длине» дописана. Проверено в браузере (Playwright): четыре кнопки, переключение, ширины.
Zazerkalius v0.904 — по снимку ✚ «через центр» и моему «через центр держит ширину пучка»: «не ширину пучка, а просвет надо вычислять — какие лучи проходят между всеми границами и центр». Пучок постоянной ширины v0.903 снят. «Через центр» — свет только по прямым через центр, которые проходят сквозь все кольца строк в обе стороны: луч под углом θ дошёл до кольца за чертой — и луч под θ + 180° тоже. В начале coneSunTrace трасса считается обычными лучами (без сужения, флаг coneSunTrace._in), берётся свет у кольца за чертой A, просвет — A ∩ (A + 180°), и солнце светит только в него; остальной свет не идёт — ни рисунка, ни покраски. Подсказки, текст алгоритма и справка переписаны. Проверено в браузере (Playwright): ✚, строки «11» — просвет 60–90° и 240–270°, клин по прямой через центр; свет, дошедший только в одну сторону, не светит.
Zazerkalius v0.905 — по снимку края луча через белую «1»: «этот край луча пунктиром также, где не светит уже после 1-цы». Золотой край светового сектора шёл сплошным через всё кольцо, куда свет пришёл, даже если там он упёрся в «1». Теперь край проверяется по S.pass (v0.902): свет вдоль края проходит кольцо — край сплошной через кольцо, как было; упёрся — сплошного на этом кольце нет, пунктир начинается с внутренней границы этого кольца и идёт дальше, как прежде за кольцом (edgePass в renderCone). Проверено снимком в браузере (Playwright).
Zazerkalius v0.906 — «оси симметрии сделай не жёлтого цвета — с солнцем сливаются». Линия привязки через центр (🧲 и прилипание рукой — к оси холста, к оси симметрии соседнего кольца) и ось ⌖ Сканера рисовались золотом солнца (cg). Теперь — розовым (CONE_AXIS_COL = #f472b6): его нет ни у солнца, ни у луны, ни у краёв вырезов. Проверено: страница загружается без ошибок (Playwright).
Zazerkalius v0.907 — по снимку ✚: «это 1 бит, 4 части, но это 1 бит — тут надо 1 текст, а не два раза по 1; пусть из центра 1 торчит и так же крутится». Цифра бита строки 1 при ✚ рисовалась на обеих белых четвертях (v0.750). Теперь она одна, в самом центре (coneGlyph с расстоянием 0), повёрнута вместе с четвертями, золотом с тёмной тенью, размером 0,75 радиуса строки 1. Проверено снимком в браузере (Playwright).
Zazerkalius v0.908 — по снимку ✚ со строкой «11»: «через центр не работает — тут два нижних луча переходят в 2 верхних, и всё, вот и весь просвет». На снимке строка 1 светилась целыми чёрными четвертями, а дальше свет сужался — так вёл себя пучок v0.903; v0.904 (просвет) в той же раскладке урезает свет строки 1 до клина между продолжениями краёв выреза. Чтобы было видно, что нижние лучи переходят в верхние, в «через центр» края просвета теперь рисуются прямо через центр (от точки центра, а не от края строки 1). Проверено снимком в браузере (Playwright): ✚, строки «1», «11», по симметрии.
Zazerkalius v0.909 — по снимку «через центр» с одной строкой и выводу консоли (rows: 1): «в чём проблема?». Просвет «через центр» считался по свету, дошедшему до кольца за чертой, — то есть только по кольцам строк. У пользователя строка одна, кольцо с вырезами и двумя белыми «1» — это кольцо за чертой, и просветом выходили целые чёрные четверти: картинка совпадала с обычным режимом. Теперь просвет — по свету, прошедшему и кольцо за чертой (S.pass[N]): прямые через центр сквозь все кольца и кольцо за чертой в обе стороны. Подсказки и справка переписаны. Проверено в браузере (Playwright) на состоянии пользователя: ✚, строка «1», за чертой «11», по симметрии, «☀ = 1 бит» — светит клин ±30° по вырезам кольца за чертой, края — через центр.
Zazerkalius v0.910 — по снимку таблицы «☀ · ☾» под горизонтальной осью конуса: «сделай привязку-магнит, типа прищепки на ось горизонта, как на верёвку бельё, но чтобы при масштабировании просто уезжали влево-вправо меню за экран». Плашку (☀ · ☾, ◯ Кольца) тянешь верхним краем к горизонтали через центр конуса (ближе 12 px) — она прищепляется: верх ровно на оси, место — сдвиг от центра конуса по оси (Z.sunTblPin / Z.ringTblPin, в px при масштабе 1). Масштаб конуса — сдвиг растёт с ним, плашка уезжает влево-вправо, хоть за край; сдвиг конуса — едет за центром. Оторвал от оси — снова свободная; двойной щелчок по шапке — на место, без прищепки. Прищеплена — розовая прищепка посередине верхнего края. Центр конуса для прищепки берётся прямо из размера холста и сдвига вида (coneAxisScr) — по прошлой отрисовке она отставала на кадр. Проверено в браузере (Playwright): прищепка на оси, при ×2 сдвиг удвоился, при сдвиге конуса едет за ним, при ×1 — на прежнем месте.
Zazerkalius v0.911 — «да, всё так сделай» (на «группы кнопок к оси пока не прищепляются»): прищепка v0.910 — и группам кнопок конуса. Тащишь группу за заголовок верхним краем к горизонтали через центр конуса (ближе 12 px) — отпустил, и она прищеплена: Z.cgrpPin[имя] — сдвиг от центра при масштабе 1; place ставит её верхом на ось, по горизонтали — центр + сдвиг × масштаб, в окно не загоняет (может уехать за край). renderCone переставляет прищеплённые (window.zzGroupPinSync), прицепленные к ним 🧲 едут следом; grpFix их не двигает; перенос — прищепка снимается (на оси — ставится заново); блок лазера Shift-ом не прищепляется. Прищеплена — розовая черта по верху заголовка. Проверено в браузере (Playwright): «Вид» на оси, при ×2 сдвиг удвоился, при сдвиге конуса едет за ним, при ×1 — на месте.
Zazerkalius v0.912 — по снимку наведённого кольца: «при наведении на кольцо не утолщай границы, подсвети всё кольцо светом, фоном, но не меняй фигуру». Обводки наведённого кольца двумя толстыми чертами внутрь (v0.863 / v0.867) больше нет: всё кольцо — полоса от внутреннего края до внешнего — мягко заливается светлым поверх (белый, 16 %), края и рисунок не меняются; у колец-многоугольников — по их же форме (coneArc). Проверено снимками в браузере (Playwright), с наведением и без.
Zazerkalius v0.913 — «а как выключить кручение кольца за горизонтом?» — выключателя не было: при ▶ кольцо за чертой крутилось вместе со всеми (был только замок «на вид» и «◎ 2 посл.», которые его не останавливают). «⏸ за чертой» (Z.fillStill, #bFillStill в «Кручении»): кольцо за чертой и пустые за ним стоят (coneRingPh → 0), кольца строк крутятся. Включили — нынешний поворот кольца кручением уходит в его ручной поворот (Z.coneFillTurn), выключили — обратно: кольцо не прыгает. Строка за чертой ушла в поле — её кольцо крутится дальше с того места, где стояло: свой сдвиг фазы Z.ringPhOff[N] (в Z.voidHits он терялся — тот пересоздаётся при смене числа строк), сбрасывается вместе с фазой в coneHoldClear; «+» при этом не доводит поворот до целой ячейки. Во «Всё» весь конус один поворот — кнопка затемнена. Проверено в браузере (Playwright): кольцо за чертой стоит при смене фазы, вкл / выкл без скачка, ушедшая строка продолжает с 0,333 и крутится, новое кольцо за чертой стоит.
Zazerkalius v0.950 — по снимку «● шарики» (11 шариков; кольцо 1 повернулось на жёлтую линию, а 9 и 10 остались на горизонтали, 6, 8 и 11 едут внутри кольца 1 по пунктирам): «шарики должны двигаться только по прямым, принадлежащим дугам битов колец». С v0.948 шарик при запуске получал прямую, неподвижную в мире, а кольца крутились под ним, поэтому он сходил с граней и ехал по продолжениям граней кольца 2, где у кольца 1 своих линий нет. Теперь шарик всегда сидит на прямом краю бита и поворачивается вместе со своим кольцом (zz-ball.js: кольцо F.k, грань F.raw, расстояние от центра F.q). На стыке колец он переходит только на грань другого кольца, лежащую в этот миг на той же прямой, а в центре — на противоположную грань кольца 1. Иначе шарик разворачивается по своей грани: на вопрос «ждать или развернуться» выбрано «развернуться», поэтому ожиданий больше нет. Красный — был разворот, зелёный — выход без разворота. Старты — только на гранях: оси битов и вырезов из списка «Старт» убраны. solarius-ball.test.cjs переписан под движение по граням.
Zazerkalius v0.951 — «двойной клик по группам сворачивает все остальные — так не надо, только одну сворачивать». С v0.941 двойной щелчок по заголовку группы, по её кнопке сворачивания и по шапке зубчатой панели звал zzPanelFocus: открывал эту и сворачивал все прочие. Теперь двойной щелчок сворачивает только ту группу или панель, по которой щёлкнули; остальные не трогаются. zzPanelFocus больше никто не звал — убрана.
Zazerkalius v0.952 — три просьбы. 1) «2-щелчок перестал открывать группы кнопок» — ошибка v0.951: первый щелчок по заголовку свёрнутой группы её открывал, а двойной тут же сворачивал обратно. Теперь заголовок запоминает, была ли группа свёрнута до первого щелчка (_wasMin): свёрнутую двойной щелчок оставляет открытой, открытую сворачивает; остальные группы не трогаются. На кнопке «−» двойной щелчок — как одиночный. 2) По снимку «Стр. 1» — «отдели строение первого кольца от других функций»: кнопки строения (части, ▮ щель 1, угол щели) стоят первыми, у кнопок частей и щели — оттенок цвета группы (класс r1form); «☾ крестом» — свет луны, а не строение, и переехал к функциям, перед «⟋ нить». 3) «Покажи кнопку 1 части первой строки — это когда солнце похоже или не только?» — «1 часть» и раньше была: это состояние, когда не нажаты ни части, ни щель, и строка 1 — один целый бит на весь круг. Так бывает не только при солнце, но и при луче. «☀ = 1 бит» — не форма, а вид этой целой строки при солнце: золотой круг с цифрой или точка в центре. Теперь у этого состояния своя кнопка «○ 1 часть» (#bRow1Parts1, первая в строении): снимает части и щель, прежний выбор частей помнится. В «вырезах 2n» строка 1 всегда полукольцо — там кнопка затемнена.
Zazerkalius v0.953 — две вещи. 1) По снимку «↩ к старту» у шариков: «должна возвращать моё ручное редактирование вращения, последнее перед стартом». И «↩ к старту», и каждый запуск жали «⟲ всё на места», и ручной поворот колец терялся. Теперь старт с мест (▶ запуск в панели шариков или ▶ крутить) запоминает, как стоят кольца: Z.coneBallPose — posCur() из «📍 Положений» плюс Z.coneFillFree. «↩ к старту», ● ↩ и «↻ новый запуск» возвращают кольца в это положение через posApply, режим и скорость кручения остаются как есть, счёт оборотов — с нуля. Пока ничего не запускали, «↩ к старту» кольца не трогает. 2) По снимку плашки «⚠ Ошибка: ResizeObserver loop completed with undelivered notifications»: это предупреждение браузера, а не ошибка. Его давала зубчатая панель: plateZig правил её размер прямо в своём ResizeObserver. Теперь зубцы пересчитываются следующим кадром, а обработчик ошибок такое предупреждение больше не показывает.
Zazerkalius v0.954 — две просьбы. 1) «Сделай все группы, чтоб перемещать можно было и на поле строк, и на левое меню, и также магнитить с границами их». Площадок две: поле строк (#field) и левая панель (#rowsPane). Группа конуса или зубчатая панель («Кольца», «☀ · ☾», «Шарики», «Алгоритм»), отпущенная целиком над площадкой, встаёт поверх неё и ездит вместе с ней. Место хранится от угла площадки: у групп — Z.cgrpFld { x, y, z }, где z: "pane" — левая панель; у панелей — Z.sunTblFld, Z.ringTblFld, Z.coneBallLabFld, Z.lasAlgoFld. Пока тянешь, площадка, на которую встанет, светится. Панель шире площадки встаёт на неё по указателю, а «Алгоритм» там сужается до её ширины. Магнит групп и панелей теперь ловит и края левой панели (края поля он ловил и раньше). На поле строк встают и «Кольца» с «Кручением»: запрет v0.348 (FLD_NO) снят словом «все группы». Внутрь левой панели группы не встраиваются — это снято в v0.571 («группы конуса не надо в левую панель»), — только поверх неё. Правый щелчок по заголовку возвращает на холст. Общие функции — solZoneRect, solZoneOf, solZoneRec, solZoneGlow; в solarius-panels.test.cjs — тест площадок. Попутно исправлены подсказки, где двойной щелчок ещё «открывал и сворачивал остальные». 2) По тексту окна «Шарики» — «текст — убери из окна»: два пояснения, строка T₀ и строка состояния больше не стоят в окне. Пояснения и состояние — в подсказке у заголовка «● Шарики», T₀ — у «▶ запуск» и поля скорости; состояние, как и прежде, видно в группе конуса рядом с «● шарики».
Zazerkalius v0.955 — по снимку панели под чертой поля строк (🗑 · Серп 90 · 30 · маска 01 · ⌖ лазер · под чертой: ⤒ из-под черты · 📋 заготовка… 128 стр. · сид 1): «это всё в строку, где строка за горизонтом, перед и после неё, если она посередине, или все кнопки пусть уедут за экран вправо-влево, смотря где панель, и не мешают; и уменьши их ширины, сократи текст, где можно». Панель разделена на две части: достройка (#cutA: 🗑, 🔺90, 30, м + маска, ⌖, ⤒) и заготовка (#cutB: 📋…, стр, сид, свои шаблоны). При каждой отрисовке поля cutPartsPlace ставит их в строку за чертой, по бокам её ячеек. Строки по центру — достройка слева, заготовка справа; строки слева — обе справа; строки справа — обе слева, достройка ближе к ячейкам. Части стоят вне сетки (absolute от .fcs): ширину колонок не меняют, а за краем колонки обрезаются (overflow-x: clip у ячейки строки), так что не влезающее уходит за край поля. Строки за чертой нет — обе части снова под чертой, как прежде. Подписи короче: «🔺 Серп 90» → «🔺90», «маска» → «м», «⌖ лазер» → «⌖», «⤒ из-под черты» → «⤒» (подпись «под чертой:» ушла в его подсказку), «📋 заготовка…» → «📋…»; уже поле маски, число строк и сид, список заготовок — до 84 px. Щелчки по кнопкам в строке не трогают выделение строк (.cutSide — в тех же исключениях, что и #cutPanel). Попутно: снимок с полосой «● НЕЗАВЕРШЁННАЯ ЗАПИСЬ ~7:01 (ещё 1)» — это не сбой страницы, а спасение записи видео (_js/recorder.js), прерванной перезагрузкой; v0.954 в чистом браузере (Chrome без окна) запускается без ошибок.
Zazerkalius v0.956 и общий _js/recorder.js — по снимку полосы «● НЕЗАВЕРШЁННАЯ ЗАПИСЬ ~7:01 (ещё 1) СОХРАНИТЬ УДАЛИТЬ»: «не нажимается». Zazerkalius подключает recorder.js с data-bez-knopki (своя кнопка записи), и build() там выходит раньше — а вместе с ним пропускалась и вставка стилей модуля. Полоса спасения записи появлялась без них: обычным блоком в конце страницы, наверху под шапкой и левой колонкой, и все щелчки забирали панели поверх неё. Теперь стили вставляет отдельная styles() (один раз, <style id="zerkRecCss">), её зовут и build(), и полоса: она снова в правом нижнем углу поверх всего, кнопки нажимаются. Чинит все страницы без плавающей ⏺. У тега recorder.js в Zazerkalius — ?v=0956, чтобы браузер не взял старую копию из кэша.
Zazerkalius v0.957 — по снимку столбика свёрнутых групп и панелей (Лазер, ☀ · ☾, Стр. 1 … Звук, ◯ Кольца): «выровняй размеры по минимумам и приведи обводку кнопок с чёрным фоном как у этих трёх». Свёрнутые группы были 128 × 24, а из тёмных зубчатых панелей «Алгоритм · подсказки» в свёрнутом виде занимал 192 px, а у «◯ Колец» в заголовке три кнопки (−, 🧘, ✕), и название ломалось на две строки: панель выходила выше, рамка шла по другому контуру. К тому же неактивные «Кольца» гасли до 55 %. Теперь все свёрнутые панели — 128 × 24, как группы. Заголовок — в одну строку, лишнее — многоточием; у свёрнутых «Колец» ✕ спрятан, у «Алгоритма» в свёрнутом виде подпись «Алг. · подск.». Свёрнутые таблицы не гаснут, и рамка у «Колец» той же яркости, что у «☀ · ☾», «Алгоритма» и «Шариков». Правка только в CSS.
Zazerkalius v0.958 — по снимку столбика свёрнутых групп: «пусть все заголовки с чёрным фоном будут, и 2-клик должен каждую раскрывать — сейчас не реагирует». 1) Двойной щелчок. Группа при нажатии забирает указатель себе (setPointerCapture — чтобы тянуть), и после этого целью щелчка и двойного щелчка становится сама группа, а не её заголовок. Проверка «щёлкнули по заголовку» (closest(".glab")) не проходила: одиночный щелчок свёрнутую группу не открывал, а двойной с v0.952 её «сворачивал» — она и так свёрнута, ничего не происходило. До v0.951 двойной щелчок по той же причине шёл в ветку «пустое место» и просто переключал свёрнутость — поэтому раньше работал. Теперь заголовок узнаётся по нажатию (g._downLab): щелчок по заголовку свёрнутой группы её открывает, двойной — оставляет открытой, по открытой — сворачивает. У зубчатых панелей так было и раньше: указатель забирает сам заголовок. 2) Заголовки групп были залиты цветом группы с тёмной надписью. Теперь фон тёмный, как у панелей, надпись — цветом группы (или своим ◆), обводка цветом группы (она рисовалась и прежде, но сливалась с заливкой).
Zazerkalius v0.959 — по снимку поля строк («1 — 0» и «2 + ×» далеко от своих битов): «расстояние тут большое», на вопрос — «номер ↔ биты». Колонка поля строк растягивалась на всю ширину (minmax(max-content, 1fr)), и при «по центру» короткие строки вставали посередине поля, вдали от номеров. Теперь колонка — по самой длинной строке (max-content), строки по центру встают внутри неё, у самых номеров; остаток ширины — пустая колонка-заполнитель, так что черта и слоты под ней по-прежнему во всю ширину. Номер строки всегда начинает новый ряд сетки (grid-column: 1) — иначе следующая строка встала бы в заполнитель. Кнопки строки за чертой (v0.955): слева от ячеек теперь обычно нет места — там номера, — и если достройка слева не влезает, обе части встают справа, достройка ближе к ячейкам. Обрезка вылезающего за край поля перенесена с ячейки строки на всю сетку (overflow-x: clip у .rl-inner): полосы прокрутки по-прежнему не появляется. Проверено снимком в Chrome без окна на чистом профиле.
Zazerkalius v0.960 — «а как совсем их отключить? шарики». Кнопка «● шарики» в «Кручении» (и «● вкл.» в панели) выключала только движение: на конусе оставались серые шарики на стартах, пунктир секторов К2 и точки стартов, а панель «● Шарики» — на месте. Теперь выключенные шарики не рисуются совсем (zzBallDraw сразу выходит), панель «● Шарики» прячется; включает их снова «● шарики» в «Кручении», панель возвращается на своё место. Подсказка «● шарики» переписана: прежняя ещё говорила «у закрытой грани шарик ждёт» — с v0.950 он разворачивается. Попутно — ответ на вопрос «перешедшие на другую границу красным становятся или наоборот?»: наоборот — переход на совпавшую грань цвет не меняет (голубой), красный — был разворот, зелёный — вышел без разворота.
Zazerkalius v0.961 — две просьбы по снимкам. 1) Подсказка «☀☾ Солнце и луна…» внизу экрана под пультом «крутить · шаг · сброс» — «подсказки по центру экрана покажи». Подсказки (v0.294) и сообщения say() идут в один #msg; он стоял внизу, слоем 50, и пульт его закрывал. Теперь #msg — посередине экрана, слоем 5000 (выше окон и пульта), с тенью; мышь по-прежнему проходит сквозь. 2) По снимку «☀ · ☾» (полосы «ЛУНА СВЕТИТ» и др.) — «доведи фон до границ»: цветная подложка ряда лежала только на ячейках, а таблица в зубчатой панели отступает от края на 7 px. Теперь первая и последняя ячейки ряда тянут его подложку (--rowbg) тенью на эти 7 px до зубцов, рамка обрезает её по ним. То же у выбранной строки «◯ Колец». Правка только в CSS.
Zazerkalius v0.963 — по снимкам левого меню и шапки Solaris. При сворачивании меню верхние кнопки до «Сброса» остаются столбиком; разделы ниже свёрнуты в отдельные значки, щелчок раскрывает нужный. Свёрнутость обычного меню сохраняется отдельно. «Звук», «Кручение», «Аниматрица» и «Алгоритм» один раз возвращаются в начальное положение прямо в шапке справа от названия, без наложения на текст. Любую группу или таблицу можно перетащить в эту область; заголовки переходят на следующий ряд, место сохраняется. Раскрытая группа показывается под шапкой, её кнопка в шапке остаётся доступной. Одинарный щелчок по заголовку открывает или сворачивает группу; двойной открывает выбранную и сворачивает остальные группы и таблицы. Одиночное действие отложено на 260 мс, чтобы первый щелчок не сдвигал заголовок до второго. Проверены синтаксис и логика размещения и щелчков; визуальная проверка в браузере заблокирована проверкой сохранённых разрешений localhost.
Zazerkalius v0.968 — по снимку панели «Шарики»: кнопки меняли ширину при смене «запуск / новый запуск» и «пауза / продолжить», а столбцы оборотов подстраивались под дроби. Действия стоят в постоянной сетке 2 × 2, дробные кнопки скорости — в одинаковых ячейках. У таблицы фиксированные столбцы: номер 7 знаков, каждое кольцо 16; значения выровнены вправо, цифры равной ширины. На узкой панели таблица прокручивается горизонтально, кнопки телефона сохраняют высоту 44 px. Проверено в браузере: запуск, смена дробей, пауза и продолжение не меняют ширину и координаты кнопок и столбцов; при ширине панели 280 px подписи помещаются.
Zazerkalius v0.969 — «доделать движение шариков на внешнее кольцо» и «если впереди выстроились прямые — продолжать». Геометрия маршрута теперь включает К3, К4 и все следующие видимые кольца, включая кольцо за чертой. На несовпавшем стыке внешних колец шарик ждёт, оставаясь на дуге своего кольца; в ∞ ожидание действует на всех стыках. Совпадение вычисляется внутри кадра, поэтому короткий момент не теряется при низкой частоте кадров. Время ожидания и обороты считаются, пройденный путь не растёт. Ждущий шарик жёлтый; при появлении прямой впереди продолжает без нового запуска. Если согласованную дугу рассчитать нельзя, шарик идёт по физической дуге и ждёт следующую прямую, а не завершает опыт. Режим ∞ запускает четыре старта и при несовместимом начальном положении. По дополнительной просьбе двойной щелчок по заголовку теперь открывает все группы и таблицы окна; следующий закрывает все. Одиночный по-прежнему переключает одну группу. Проверены три серии тестов движения, включая К3/К4, обе стороны вращения, продолжение внутри длинного кадра, остановку счёта пути при ожидании и прежние сквозные проходы. В живом браузере четыре шарика достигли К3, прошли внешние дуги и продолжили движение после ожидания 39 раз; в 494 отсчётах ожидания пройденный путь не рос. Двойной щелчок раскрыл все 16 групп и таблиц, следующий свернул все.
Zazerkalius v0.970 — «по двойному клику открываясь закрывают другие, и наоборот» и задержка в несколько секунд. Двойной щелчок по группе или таблице теперь переключает выбранную и задаёт остальным противоположное состояние: раскрывает её — сворачивает остальные; сворачивает её — раскрывает остальные. То же действует у заголовков в шапке. Одиночный щелчок и кнопки +/− переключают только одну панель. Причина тормозов: при массовом переключении общий замер кнопок, оформление, расположение и сохранение запускались отдельно для каждой панели. Теперь состояния меняются вместе, общий пересчёт выполняется один раз. Смена +/− больше не запускает дополнительный глобальный замер из наблюдателя; оформление кнопок выполняется после размеров, без повторного вызова. В Chrome прежнее действие заняло 2,91 с; после исправления все 16 групп и таблиц прошли проверку в обоих направлениях, обработчики заняли 7–786 мс. В финальном замере от начала обработчика до обновления экрана: 0,24 с при раскрытии одной панели и 0,75 с при раскрытии остальных. Проверены настоящие двойные щелчки по тексту заголовка, таблице и кнопке заголовка в шапке; одиночный раскрывает только выбранную.
Zazerkalius v0.1017 — шапка Solarius занимает один 24-пиксельный ряд зубцов. Прежние 4 px вертикального отступа делали её высоту 28 px: ближайшая позиция панели попадала внутрь шапки, и защита от перекрытия отбрасывала панель на следующий ряд. Небольшую разницу рамок шапки и зубчатой полосы компенсирует прижатие к нижнему краю меню: панель примыкает сразу под ним, не уходя на следующий ряд и не перекрывая текст.
Проверка производительности в отдельной тестовой раскладке, без записи в память пользователя: полная перерисовка при 9 / 128 / 256 строках заняла примерно 0,14 / 3,57 / 5,90 с. Основная задержка больших полей — пересоздание HTML в renderRows. При кручении профиль также выявил чтение и обработку всех пикселей верхнего слоя coneTopArtSync и повторные пересчёты геометрии кнопок cgbSnap / triTag / lpTag. Оптимизация этих путей ещё не выполнена; звук и видеозапись в этой проверке не запускались.
Zazerkalius v0.1018 — ускорение страницы после профилирования. Поле сохраняет DOM неизменённых строк; правка одного бита заменяет только его строку. Убран сброс dimcur/dimsel на каждом обновлении, повторная запись пустой --rc-cols и ненужные переносы кнопок достройки: они заставляли браузер заново раскладывать всё большое поле. В тестовой раскладке повторное обновление 9 / 128 / 256 строк заняло около 6 / 34 / 24 мс; до устранения сброса классов — 32 / 1548 / 5483 мс. Правка одного бита в 256 строках — около 162 мс; первое построение всё ещё тяжёлое (около 3,35 с для 256 строк).
Верхний слой обычного 2D-конуса очищает фон шейдером WebGL, не читая весь холст в JavaScript каждый кадр. Прозрачность, круглая маска, оси и блокировка перекрытых кнопок сохранены; текстура переиспользуется. При недоступности WebGL, потере контекста, свечении или 3D остаётся прежний точный CPU-путь: на полупрозрачных слабых пикселях загрузка текстуры иначе даёт небольшое расхождение. Размеры кнопок кешируются с учётом текста, шрифта и ширины стандартной единицы; одинаковые текстовые замены не запускают пересборку групп. Проверка — отдельный пресет без сохранения раскладки, регрессионные тесты и сравнение пикселей GPU/CPU в браузере. Звук и видеозапись не запускались; полностью убрать стоимость первого построения и тяжёлых режимов этим выпуском не удалось.
Zazerkalius v0.1009 — зубчатая граница левого меню снова имеет постоянно видимый светлый ломаный контур, как на прежнем виде; заливка зубцов, сворачивание щелчком и изменение ширины перетаскиванием сохранены. Кнопка «?» в верхнем меню переназначена: теперь она включает и полностью отключает всплывающие подсказки, состояние запоминается; само окно справки остаётся обычным окном в списке «Другое».
Zazerkalius v0.1008 — полноширинное содержимое групп «☀ · ☾», «Кольца», «Алг. · подск.» и «Шарики» исключено из расчёта собственной минимальной ширины группы: таблица или панель заполняет уже заданное место, но больше не раздвигает группу вправо при повторных пересчётах.
Zazerkalius v0.1007 — панели «☀ · ☾», «Шарики» и «Алг. · подск.» переведены из отдельного типа плашек в обычные кнопочные группы: теперь они используют общие сворачивание, рамку, перетаскивание, магнит и сохранение положения; прежняя раскладка переносится автоматически.
Zazerkalius v0.1006 — при выключенной ▱ рамка обычных групп скрывается; «Вид», «Аниматрица» и «За чертой» имеют общую ширину 128 × 24. Фон зубцов левого меню сохранён, весь край опущен под переднее окно, чьи кнопки перекрывают заливку и линию.
Zazerkalius v0.1005 — зубчатая кромка левого меню рисуется только линией; убрана заливка соседним фоном, из-за которой рядом с кнопками появлялась вертикальная полоса.
Zazerkalius v0.1004 — список режимов «Кольца» встроен в группу «Кольца», выбор режима остаётся доступен независимо от солнца и лазера. В одном списке оставлены схема T=2 и короткие названия без столбца частей. Баланс битов теперь обновляется и при выключенном солнце; ромб «Оси» стал заметнее. Зубчатые кромки левого меню и поля строк заканчиваются над нижней полосой, чтобы не накладывать на неё фон и вертикальный край.
Zazerkalius v0.1003 — Переключатель, сброс, статус и подробные настройки шариков теперь собраны в одной панели; прежний отдельный заголовок группы убран. При выключении скрывается содержимое меню, а переключатель остаётся доступен в заголовке.
Zazerkalius v0.1002 — При сужении группы с треугольной раскладкой кнопки переносятся по одной, поэтому «Вид» можно сложить в один столбец. Свёрнутые группы закрепляются в полосе у нижнего края, раскрытая группа появляется над полосой. В таблице «Кольца» удалён столбец T=3: остались схема T=2 и названия видов.
Zazerkalius v0.1001 — Панель «Кольца» отделена от группы «Щели»: оба дублирующих переключателя убраны из неё, варианты режима выбираются в таблице. Таблица остаётся самостоятельной и сворачивается кнопкой «−» в заголовке.
Zazerkalius v0.1000 — Клики по кнопкам, скрытым под нарисованной частью конуса, теперь блокируются только в непрозрачных пикселях слоя; прозрачные участки по-прежнему пропускают нажатие. В таблице «Кольца» убраны галочка и столбец «частей»; выбранный вариант выделяется подсветкой строки.
Zazerkalius v0.999 — Перетаскивание группы в шапку теперь принимает всю верхнюю полосу; отпускание у левого края закрепляет её поверх полосы. При нехватке места группа тоже уходит в левый верхний угол. Фон круга конуса стал прозрачным — перекрывают меню только линии и фигуры; выбранная вкладка имеет глубокие выемки с обеих сторон, включая первую вкладку. В группе шариков оставлены две компактные кнопки-значка, счётчик и длинный статус скрыты.
Zazerkalius v0.998 — выбранная вкладка верхней полосы теперь имеет глубокие выемки с обеих сторон и перекрывает соседей: их края входят в выемки.
Zazerkalius v0.997 — Отрисованные кольца и оси конуса, плашки «Солнце · Луна» и «Кольца», кнопка баланса и ромб кнопки осей перекрывают группы меню. Перетаскивание группы начинается за узкую кромку кнопки; в центре сохраняется обычное нажатие. При закреплении группы в шапке место выбирается с учётом уже занятых ячеек. Выбранная вкладка шапки глубже заходит на предыдущую. Кнопки оформления гаммы, обводки и темы собраны в одну строку; тема и обводка показываются значками.
Zazerkalius v0.996 — в свёрнутом левом меню при наведении на зубчатую границу курсор показывает горизонтальное изменение ширины.
Zazerkalius v0.995 — щелчок по зубчатой границе поля строк сужает его до столбцов номера, замка и кручения; повторный щелчок возвращает прежнюю ширину. В таблице «Кольца» подписи сокращены, столбец вырезов убран; выбор вида остаётся активным без включённых солнца и лазера.
Zazerkalius v0.994 — подсветка зубчатой границы левого меню при наведении теперь сохраняется и в свёрнутом режиме.
Zazerkalius v0.993 — стрелка на зубчатой кромке убрана. Одиночный щелчок по кромке меню сворачивает или раскрывает меню, перетаскивание по-прежнему меняет его ширину; двойной щелчок возвращает ширину по умолчанию. На зубчатой кромке поля строк щелчок сворачивает / показывает само поле.
Zazerkalius v0.992 — по уточнению пользователя увеличена ширина самой стрелки сворачивания на зубчатой кромке: 41,56 px вместо 20,78 px; высота осталась 48 px. Клик управляет свёрткой, движение по стрелке больше не меняет ширину панели.
Zazerkalius v0.991 — стрелка на зубчатой кромке снова работает как хват панели: щелчок сворачивает / разворачивает меню, перетаскивание по горизонтали меняет его ширину. На обычном щелчке изменение ширины не запускается.
Zazerkalius v0.990 — стрелка сворачивания вынесена на зубчатую кромку левого меню. Её высота — два зубца (48 px), центр совпадает с остриём зубчатого ряда; в свёрнутом столбике кнопка остаётся на той же кромке и меняет направление.
Zazerkalius v0.989 — один щелчок по заголовку группы сворачивает или разворачивает её на месте. Двойной щелчок по любой группе кнопок сворачивает её и переносит в шапку конуса; если для новой кнопки не хватает места, она становится первой слева. Так работает для групп «Кольца», «Шарики», «Звук», «Аним.», «Алг.», «3D», «Лазер» и остальных. Числа баланса получили слой выше кнопок групп, чтобы перекрывать их. Подсказка кнопки показывается в противоположной четверти экрана.
Zazerkalius v0.988 — двойной щелчок по любой кнопке группы конуса сворачивает пульт и переносит его в свободный участок верхней полосы; если свободного участка нет, ромб ставится слева поверх кнопок. Пульт выше кнопок полосы, поэтому ромб перекрывает их и принимает нажатия. Повторный двойной щелчок разворачивает пульт и возвращает его на прежнее место, если оно было сохранено. «☀ доли» перенесена в группу «Вид».
Zazerkalius v0.987 — кнопки «◀» и «▶» шага окрашены в синий, чтобы отличаться от зелёного «Крутить» и красного «Сброса». При наведении и при выборе направления сохраняется синий оттенок.
Zazerkalius v0.986 — по снимку «надпись Шаг тоже ненужна» убраны видимые подписи у обоих ромбов шагов; на каждом остаётся только стрелка направления.
Zazerkalius v0.985 — по снимкам: подпись «крутить» убрана с зелёного ромба, стрелка ▶ увеличена; шаги сдвинуты внутрь так, чтобы центральный ромб закрывал около четверти площади каждого шага. Подпись количества вариантов цикла перемещена к левому краю под конусом, ширина ограничена до ряда кнопок. Новый пульт по умолчанию свёрнут, закреплён у правого края верхней полосы; ромб ручки увеличен до 46 px, выделен золотом и выступает за полосу. Сохранённые пользователем состояния свёртки и положение не сбрасываются.
Zazerkalius v0.984 — по просьбе «все 3 кнопки “Крутить” опусти наложением на “Сброс”, также на край, но “Сброс” перекрывает кручение» ромбы «Крутить», «◀ шаг» и «▶ шаг» опущены до нижнего края холста. Треугольник «Сброс» теперь выше них и закрывает нижнюю часть центрального ромба.
Zazerkalius v0.983 — по снимку «подвинь кнопки шагов вверх на уровень Крутит» ромбы «◀ шаг» и «▶ шаг» подняты на высоту ромба «Крутить» и разнесены так, чтобы центральный ромб перекрывал примерно четверть каждого бокового. Ромб кручения выведен на передний слой.
Zazerkalius v0.982 — по уточнению пользователя «в режиме магнита к граням шаги работают, но автокручение крутит плавно»: при включённой 🧲↷ кнопка ▶ теперь сразу переносит текущее или выделенные кольца на следующую магнитную цель, как ручной шаг ▶|, затем с учётом скорости и угла повторяет скачок. Промежуточных углов нет, совпавшие границы и число показываются после каждого скачка. Обычное плавное кручение без 🧲↷ не изменено.
Zazerkalius v0.981 — по снимку пользователя элементы шариков вынесены из «Кручения» в отдельную группу «Шарики»: включение, пометка «2 кольца», возврат к старту и строка состояния. Группа получила свой цвет и участвует в обычном перемещении, сворачивании и сборке панелей. Подробная плавающая панель «● Шарики» по-прежнему открывается при включении и хранит маршрут, старт, скорость и запуск; управление кольцами осталось в «Кручении».
Zazerkalius v0.980 — по уточнению пользователя «🧲↷» стала переключателем режима «Кручения», а не отдельным шагом. Пока кнопка включена, |◀ и ▶| ведут текущее или выделенные кольца к предыдущему и следующему магниту; ▶ плавно крутит между магнитами со скоростью ползунка и короткой паузой на совпадении. Цели по-прежнему задают «🧲 гран. / всё» и «🧲 оба / внутр. / наруж.». При выключении кнопки возвращаются прежние шаги до событий лазера и обычное автокручение. Проверены включение без движения, шаги в обе стороны, плавное движение, остановка на границе с числом совпадений, режим «всё» с осью симметрии, выключение и стабильная ширина кнопки.
Zazerkalius v0.979 — в группу «Кручение» добавлена компактная кнопка «🧲↷»: текущее или выделенные кольца поворачиваются по часовой к следующему положению ручного магнита, правым щелчком — против часовой. Цели следуют выбранным «🧲 гран. / всё» и направлению соседей; уже совпавшее положение пропускается. Биты строк не меняются, дробный поворот сохраняется; в режиме границ число совпавших границ двух колец остаётся в центре. По уточнению пользователя границы поворачиваемого кольца подсвечиваются также при шаге кнопкой, а розовые совпадения в «границах» ограничены парой с непосредственно внутренним и/или внешним кольцом; дальние кольца линия не пересекает. Проверены на странице первый бит с двумя половинами (ось холста, затем граница кольца 2), ось симметрии в режиме «всё», второе кольцо и обратный шаг.
Zazerkalius v0.978 — уточнена привязка первого кольца: только в режиме «🧲 грани» его исключение на оси означает вертикаль и горизонталь холста, без осей симметрии второго кольца. К границам второго кольца первое по-прежнему притягивается. Режим «🧲 всё» сохраняет прежнюю привязку и к осям симметрии соседнего кольца. Уточнены подсказки и таблица в справочнике. Проверено в браузере на одной строке «1», солнце и двух половинах: при ручном перетаскивании к наклонной оси «грани» не защёлкнулись, «всё» защёлкнулось; отдельно сработали граница кольца 2 (два совпадения) и вертикаль холста.
Zazerkalius v0.977 — исправлена ручная привязка первого кольца в конфигурации из одной строки «1», когда видимое кольцо 2 является кольцом за чертой: его границы частей и оси симметрии теперь доступны как цели. Исключение одного бита определяется по самой строке, даже когда солнце показывает её двумя половинами или четвертями. При Ctrl/правой кнопке видны совпавшие лучи; число в центре считает только совпадения границ. Проверено в браузере на настройках пользователя: одна строка, солнце, половины, симметрия «оба», магнит «границы»; защёлкивание к границам кольца за чертой дало два луча и число 2, совпадение только по осям показало лучи без числа. Отдельная кнопка «🧲 магнит» остаётся отключённой.
Zazerkalius v0.976 — по сообщению о неработающей привязке кольца 1 ко второму при «🧲 оба» + «🧲 гран.» исправлен ручной путь вращения с Ctrl и правой кнопкой: граница первого кольца совмещается именно с границей соседнего, а середина одного бита остаётся целью только для осей. При ручном доводе лазер больше не перехватывает защёлку режима границ. По уточнению пользователя отдельная кнопка «🧲 магнит» временно отключена полностью: она не включается нажатием и не действует даже при сохранённом включённом состоянии; её настройки скрыты. Число в центре по-прежнему учитывает только границы двух колец.
Zazerkalius v0.975 — счётчик в центре первого кольца теперь показывает только совпавшие границы частей двух колец. Привязка первого кольца из одного бита к вертикали, горизонтали и осям симметрии сохранена, как и лучи этих привязок, но совпадение только с осью больше не создаёт число. Если совпали и ось, и граница соседнего кольца, считается лишь граница кольца. Подсказка магнита и справочник уточнены.
Zazerkalius v0.974 — в режиме ручного магнита «🧲 границы» при защёлкивании показываются сразу все совпавшие границы частей кольца с выбранными соседями. Каждая совпавшая сторона оси идёт сплошным розовым лучом от центра; если за центром совпадения нет, продолжение показано пунктиром. При совпадении нескольких осей видны все одновременно; их число остаётся в центре первого кольца после отпускания до следующего щелчка или изменения положения. Привязка и исключение для первого кольца с одним битом сохранены. В группе «Кручение» сокращены подписи и ширины кнопок; строка состояния шариков больше не задаёт группе минимальную ширину. В браузере проверены один и три совпавших луча, удержание и сброс счётчика, все направления магнита, ширина группы 341 px вместо 793 px без сдвига кнопок при переключении.
Zazerkalius v0.973 — сохранены компактные «Щели» из v0.972 и перенесена локальная правка пустого места между номерами и битами. Пустой столбик поворота сокращён с 42 до 25 px; столбик оборотов вместо постоянных 60 px занимает ширину самого длинного числа (не меньше 20 px), с общей шириной для всех строк. Длинные дроби расширяют столбик, в том числе при кручении рукой. Дополнительные счётчики занимают место только при включении. Для нулевых оборотов убрано 57 px пустоты; выравнивание строк сохранено.
Zazerkalius v0.972 — группа «Щели» по снимку была слишком широкой: шесть режимов колец стояли одной неделимой полосой примерно в 500 px, длинные названия налезали друг на друга. Режимы разложены в два ряда по три; выравнивание и перенос света теперь занимают по одному ряду из четырёх кнопок. Подписи сокращены («T−1», «между», «симм.», «2n», «все»; «край», «середина», «↔»), полные пояснения оставлены в подсказках. В браузере раскрытая группа стала 300 × 192 px; все надписи помещаются в кнопках, выбор режимов колец работает в обоих рядах.
Zazerkalius v0.971 — по просьбе о раздельном примагничивании в трёх направлениях «🧲 сим.: оба / внутр. / наруж.» рядом появился выбор «🧲 всё / 🧲 границы». «Всё» — прежняя ручная привязка к границам внутренних колец и осям симметрии соседей, с участием середин битов. «Границы» совмещает только границы частей тянущегося кольца с границами частей соответствующих соседей; для кольца строки 1 из одного бита остаётся притяжение к осям. Режим «нет» сохраняет прежнюю привязку к внутренним границам. Сканер для этих привязок не нужен. Проверено в браузере: кнопка меняет состояние и сохраняет его после обновления, все четыре положения направления доступны; на живой геометрии разделены совпадения по внутренней и наружной границе, а «всё» по-прежнему ловит середину бита.
Zazerkalius v0.778 — «расписать бы всё там это и соотношение диаметров»: при ◎ торах на холсте (вверху слева, под строкой «3D · поворот…») — расчёт: мера d, часть тора π²d³/4; шар — диаметр, объём, сколько частей (и щель при «● = часть»); по каждой строке (до 10, дальше — формула) — частей, диаметры трубки, средней линии, внешний и внутренний, объём тора и одной части, отношение внешнего диаметра к диаметру шара; итог — у T−1 части равны, у 2n растут к π²d³/4, без вырезов разные. Видимый текст — по просьбе; галка «Σ расчёт» (по умолчанию вкл.) его прячет.
Zazerkalius v0.777 — «так там у них объёмы разные в 3D?» — да: шар d ≈ 4,19 d³, часть тора ≈ 2,47 d³ (1,70 части), весь тор строки 2 ≈ 7,40 d³. На «да» про кнопку: «● = часть» в «3D» (включает ◎ торы) — шар объёмом ровно в одну часть тора: радиус (3π/16)^(1/3)·d ≈ 0,838d, между шаром и тором строки 2 — щель ≈ 0,16d. Торы не меняются.
Zazerkalius v0.776 — разбор «если 1 бит в 1 строке — шар, какие диаметры колец? торовые»: тор с трубкой d и средней линией радиуса (n − ½)·d имеет объём π²d³(2n − 1)/4, частей в T−1 у него 2n − 1, значит каждая часть любого тора — π²d³/4 (по Паппу: сечение × длина средней линии, а длина части у всех — πd). Шар радиуса d (ровно в дырке тора строки 2) — 4/3·πd³ = 16/(3π) ≈ 1,70 такой части: в объёме шар больше клетки. На «да» про рисунок: «◎ торы» в группе «3D» — строка 1 шаром, кольца торами вплотную, всё в одной плоскости (высота конуса не действует, ⧗ зеркало выключено). В «вырезах T−1» / «2n» тор делится на части, вырез пуст, концы трубки у выреза — полусферы. Трубка рисуется средней линией толщиной d (в ортогональной проекции это и есть её силуэт), с бликом и тенью; кусок — до 0,25 рад, чтобы ближнее рисовалось поверх дальнего.
Zazerkalius v0.775 — на v0.774 (солнце точкой, строка 1 — полупрозрачный круг) — «кнопку для понятия надо, что 1 бит — солнце». «☀ = 1 бит» в «Строке 1»: строка 1 сама и есть солнце — золотой светящийся круг во всю строку, с цифрой бита (как было до v0.774). Выключено — как в v0.774. Свет считается одинаково, меняется только вид. При ◐ / ✚ / ▮ у строки 1 свой рисунок — кнопка затемнена.
Zazerkalius v0.774 — разбор площадей: в T−1 кольцо строки n при сомкнутых кольцах («Чистые») — π(2n − 1), частей у него 2n − 1, значит каждая клетка любого кольца — ровно π, и биты строки n по площади равны вырезу строки n + 1 (2/3 строки 2 = 2/5 строки 3 = 2π). Мешала дырка в центре (5 % радиуса), оставленная во всех режимах, кроме ◐ / ✚ / ▮. «Убери эти 5 % дырки — это лишнее, пусть будет круг (и полукруг), из центра которого луч лазера или солнце просто из точки лучами»: кольца теперь всегда от самой точки центра, строка 1 — круг. Солнце без ◐ / ✚ / ▮ — точка в центре (было — золотой диск во всю строку 1); строка 1 вокруг — полупрозрачный круг цветом своего бита с цифрой: свет её проходит, как и прежде. Луч, вставший в строке 1, — красная дужка у самой точки. Щель затвора строки 1 у лазера — минимальная видимая ширина по внешнему краю (внутренний теперь — точка).
Zazerkalius v0.773 — вопрос «какие есть механизмы — шестерёнки, перпендикуляры, — чтобы вместить в 3 места, где 2 заняты, то, что больше оставшейся 1/3, если рядом в центре есть 1/2?». По углу половина в треть не войдёт ни на каком радиусе; по длине дуги — входит (π · 1 < 2π · 2 / 3). На «да» про режим «по длине»: «📏 по длине» в «Щелях» (Z.cutLen, солнце в вырезах): свет переходит на следующее кольцо той же длиной дуги, а не тем же углом — как полоса параллельных лучей (так переносятся биты в треугольнике, откуда пришло T−1). Радиус кольца — номер строки; с кольца строки m на m + 1 каждый кусок света сужается по углу в m / (m + 1) вокруг своей середины. Свет во весь круг так и остаётся — середины у него нет. Луна, лазер и ✺ — по углу, как были.
Zazerkalius v0.772 — «объясни, какое по логике должно быть 1-е кольцо: если 3 бита — кольцо из 3 частей, то 1 бит — кольцо из 1 части, но у него нет выреза, и это круг, а не кольцо; 2 бита — 2 части и 2 выреза, а как ещё можно?». Объяснено: в T−1 кольцо из n бит — 2n − 1 частей, вырез n − 1 = длина строки внутри; внутри строки 1 — только солнце («строка 0»), поэтому у неё вырез 0 — сплошной круг. На предложение «правило 2n отдельным режимом сразу для всех колец» — «да»: в «Щелях» четвёртый режим «вырезы 2n» (Z.coneSlits = "cut2"): кольцо из n бит — 2n частей, n бит подряд и вырез из n частей одним куском; строка 1 — полкольца бита и полкольца выреза: солнце светит только через открытую половину (◐ включается само, кнопка затемнена), луч тоже выходит только через неё (в T−1 строка 1 для луча прозрачна). Всё прочее — как в T−1: число частей и вырез считаются в одном месте (coneCutP), им пользуются рисунок колец и кольца за чертой, пустые «до 256», луч, свет, мышь, ½ шаг, сканер. Порядок по кругу: 1 щель → вырезы T−1 → вырезы 2n → все щели.
Zazerkalius v0.771 — по снимкам «☾ ≈4/9» и «☀ 2 · ☾ 3 · ◌ между 5 · лучей 4» — «сделай кнопку откл этих подсчётов и показов, похоже, они тормозят». «☀ доли» в «Солнце» (по умолчанию включено, как было): выключено — доли частей круга за крайним кольцом и сводка над конусом не считаются и не рисуются. Тяжёлое там — подбор общего знаменателя долей (до 240 проб с округлением всех частей) на каждом кадре кручения.
Zazerkalius v0.770 — две вещи. (1) «Нужна кнопка, чтобы луна светила, когда солнце перекрыто единицами» (на ответ, что есть «☾ затм.», просьба повторена — значит, нужно другое): «☾ за 1» в «Солнце» рядом с «☾ затм.» — луна светит, когда хоть часть солнца упёрлась в «1» на любом кольце (до кольца за чертой включительно), и зеркалит через центр весь остановленный ими свет — вылетел остальной или нет. «☾ затм.» светила только при полном затмении и только зеркалом последнего кольца. Две кнопки — либо-либо (Z.moonBlk / Z.moonEcl). Весь круг, остановленный разом, луны не даёт (как и прежде у обеих). (2) «При такой скорости он пропускать будет пойманные биты?» (360 бит/с, ▦ побитно, «Каждое»). Между кадрами положения не проскакивают: кадр идёт мелкими шагами не шире самой узкой щели, а что не уложилось в ~12 мс — досчитывается следующим кадром (кручение медленнее, но без пропусков). Нашлись две дыры, обе закрыты: а) при ▦ / ½ / ◫ обрыв кадра падал на дробную фазу, и следующий кадр округлял её до целого бита вперёд — хвост и само целое положение не просчитывались; теперь шаги кадра — целое число на бит (полбита) и обрыв только на целом; б) строка за чертой, готовая посреди кадра, уходила в поле только в конце кадра — до того свет светил на готовую строку (с ⊕ xor мог перевернуть её биты), а следующая строка эти положения пропускала; теперь у солнца строка уходит сразу, и остаток кадра светит уже на следующую. У лазера (не солнца) уход строки — как был, в конце кадра.
Zazerkalius v0.769 — «…и частями кольца предыдущего» (на вопрос выбрано: «на клетку соседа внутри»). Третья кнопка рядом с «▦ побитно» и «½ бита» — «◫ части пред.»: ▶ крутить идёт скачками, и за шаг каждое кольцо поворачивается не на свой бит, а на угол одной клетки кольца внутри него — кольцо из n бит на n / n₋₁ своих бит (из 4 бит — на 120°, из 5 — на 90°, из 9 — на 45°); строка 1 — на свой бит. Так и у кольца за чертой, и у пустых «до 256». Учтено везде, где шаг кольца считается: поворот колец, мелкие шаги, которыми лазер ищет проход между кадрами, ✺ все лучи, ◌ поиск следующего шага солнца, и цикл возврата: кольцо с периодом p, n бит и соседом внутри из q бит встаёт на место через p·q / НОД(n, p·q) шагов. Три кнопки — либо-либо (Z.coneBitStep: true, 0.5, "prev"). Включение и выключение при ненулевой фазе поворачивает кольца на новые места сразу (фаза та же, шаг другой). Проверено: на строках 1…9 бит — градусы за шаг 360 360 180 120 90 72 60 51,4 45, цикл 2 520, кручение с лазером без ошибок.
Zazerkalius v0.768 — по снимку «▦ побитно» — «крутить ½ бита — также кнопку сюда». Рядом с «▦ побитно» (группа «Кручение») — «½ бита»: ▶ крутить идёт скачками по полбита в каждом кольце, с той же скоростью в бит/с; во «Всё» и «Встреч Стр» включает «Каждое». Кнопки — либо-либо (Z.coneBitStep: true — бит, 0.5 — полбита). «Частями кольца предыдущего» — в v0.769.
Zazerkalius v0.767 — по снимку полосы вкладок групп — «сильнее затемни или как-то иначе выдели неактивные кнопки от активных». Вкладка спрятанной группы была лишь чуть бледнее (фон — 22 % своего цвета, надпись — 60 %), и от видимой её было не отличить. Теперь она почти чёрная (6 % цвета на фоне страницы) и полупрозрачная, надпись тусклая, обводка едва видна; при наведении проявляется. Вкладка видимой группы — как была, залита своим цветом.
Zazerkalius v0.766 — по снимку группы «Вид» — «все 3D кнопки вынеси в отдельное». Новая группа «3D» (своя вкладка — сразу за «Видом», синяя): 🧊 3D, ⧗ зеркало вниз (октаэдр — сам включает 3D; список развёрнут рядом кнопок «⧗ нет · ⧗ выдел. · ⧗ все», как списки лазера в v0.762), 01 — цифры бит в 3D, ↕ высота конуса, ▬ толщина бит в 3D. В «Виде» остались «◠ дуги» и «✨ свет» — они работают и в плоском виде. Записи «кнопка переставлена внутри Вида» у уехавших в «3D» один раз сняты (копия — Z.btnMove_pered_3d, Z.cgrpMove_pered_3d).
Zazerkalius v0.765 — по снимку «Щелей», оторванных от «Лазера», — «блииин))) пусть всё можно отцеплять». Обычное перетаскивание групп лазера — снова как до блока (v0.758): тянешь любую группу — она отцепляется, а прицепленные к ней едут следом. Весь блок целиком — с Shift; с Alt — группа совсем одна (прицепленные к ней остаются на месте). «Алгоритм» в блок по-прежнему не входит. Проверено: Shift + «Лазер» — весь блок; «Щели» — одни; «Лазер» — со своими прицепленными, без отцеплённых «Щелей».
Zazerkalius v0.764 — по снимку блока лазера и «Алгоритма» справа — «алгоритм не могу отцепить». «Алгоритм» — табло с итогом, и теперь он сам по себе: в блок лазера не входит, сам ни к чему не прицепляется, а тянешь его — едет один, и всё, что было прицеплено к нему (у сборки v0.758 — «Лазер»), остаётся на месте. Блок тянется за свою верхнюю группу без «Алгоритма». При сборке «Лазер» по-прежнему встаёт под «Алгоритмом», но не прицеплен к нему. Проверено: «Алгоритм» уезжает один, блок за «Лазер» — без него.
Zazerkalius v0.763 — по снимку «◌ след.» — «это удали». Кнопки «◌ след.» (группа «Солнце», v0.695: куда солнце посветит после следующего шага — белым пунктиром) больше нет; пунктир не рисуется, даже если у кого-то он был включён (Z.lasPeek в памяти остался, но ни на что не влияет).
Zazerkalius v0.762 — по снимку «вырезы T−1» — «все кнопки-списки — вынеси на показ». В группах лазера кнопки, что щелчком перебирали значения по кругу, и список развёрнуты рядом кнопок, выбранное горит: «1 щель · вырезы T−1 · все щели» и «▥ центр · ◧ лево · ◨ право» (Щели), «щели · Без щелей» (Солнце), шаг ↻ «45° · 1/T · 1/(1+…+T)» (Лазер). Прежние кнопки и список спрятаны, но работают: щелчок по значению ставит перед прежней кнопкой предыдущее по кругу и жмёт её — её обработчик делает всё, что делал (сообщение, пересчёт; у «вырезы T−1» — кольца на места); у списка — значение и change. Затемнение и причина — у каждой кнопки ряда, как у прежней.
Zazerkalius v0.761 — по снимку «За чертой · Солнце · Строка 1» — «как-то неровно между этими». Одна пара стояла сцепленной зубцами (остриё в выемку), другая — просто приставленной край к краю, со щелью в шаг t. Теперь группы лазера, что стоят бок о бок (правая — в пределах двух шагов от зубцов левой, ряды перекрываются), сцепляются сами: правая прицепляется к левой ряд в ряд (сдвиг по высоте — целыми рядами по 24 px) и встаёт остриём в выемку. Уже прицепленную к чему-то не трогает. Срабатывает после отпускания группы лазера и один раз при загрузке. Проверено: «Солнце», поставленное к «За чертой» со щелью, после загрузки встало вплотную, зубцами.
Zazerkalius v0.760 — «подсказки не на всех кнопках — они там просто одинаковые для всей группы Лазер… и другие» и «прилипли друг к другу, не оторвать». Подсказка группы висела на всей группе и всплывала везде, где мышь не над кнопкой, — в просветах и на срезанных краях шестигранников (кнопки обрезаны по форме, за краем мышь уже «в группе»). Теперь у всех групп конуса она только на заголовке (первой, следом — как тянуть): над кнопкой — подсказка кнопки, над заголовком — что за группа, в просветах — ничего; в 3D «лазер не работает» — тоже на заголовке. Блок лазера (v0.758) едет целиком, только если тянуть верхнюю группу — ту, что сама ни к какой группе лазера не прицеплена; прицепленную тянешь — отрывается, как прежде (её прицепленные — следом); с Alt любая группа тянется совсем одна (прицепленные к ней остаются на месте). Проверено: «Алгоритм» тянет блок, «Солнце» отрывается вместе с «За чертой», Alt + «Алгоритм» — уезжает один.
Zazerkalius v0.759 — по снимку групп лазера, сбившихся у правого края, — «у меня строки справа, прилипают к правому краю, не даёт двигать группы меню». Две ошибки v0.758. Первая: блок не собирался — соседями считались группы с зазором до 3 px, а группы стоят по сетке рядов 24 px, и под «Алгоритмом» у «Лазера» зазор 7 px; «Алгоритм» уезжал один, остальные догоняли его сцепками и по одной упирались в край окна, наезжая друг на друга. Теперь соседи — сцепленные или с зазором до полуряда. Вторая: места при отпускании замерялись после того, как группа из «на весу» (от края экрана) становилась обычной (от края окна), — блок прыгал вбок на отступ окна. Теперь замер — пока на весу, и в окно загоняется весь блок общим сдвигом. Проверено с полем строк справа: блок туда-обратно ходит целиком, у края встаёт весь, не рассыпаясь.
Zazerkalius v0.758 — по снимку шести групп лазера, составленных вместе («Алгоритм» сверху во всю ширину, под ним столбцами Лазер · Солнце · За чертой · Строка 1 · Щели), — «затемнённые кнопки сделай некликабельными» и «как-то так объедини, не размагничивай их». Затемнённые больше не жмутся: нажатие (щелчок, двойной, правый, клавиша) перехватывается раньше всех и гасится, вместо действия всплывает, почему кнопка сейчас не действует; наведение, подсказка и колесо (приближение конуса) — как были, курсор — «нельзя». Группы лазера, стоящие поверх холста и соприкасающиеся друг с другом (по цепочке), тянутся одним блоком — за любую из них: сцепки внутри не рвутся (прежде потянутая правая отцеплялась), к чужим группам блок не цепляется и на левую панель / поле строк не встаёт. Один раз (Z.lasPack) группы лазера, ещё стоящие в общем ряду, собираются в такой блок под остальными группами: столбцы самой узкой ширины, «Алгоритм» во всю их ширину, не влезающие в окно столбцы — следующим рядом. Если группы лазера уже расставлены руками (как у пользователя), раскладку не трогает.
Zazerkalius v0.757 — «надо разобрать группу кнопок Лазера на подвиды… разграничить лазер от солнца, и разные режимы построения строк и симметрии, все кнопки сразу показывать и на что они влияют, затемнять кнопки, которые неактивны при нажатых уже других, и внизу подсказку писать, что в итоге получается за алгоритм», и «вкладку Конус переименуй в Solarius». Прежняя группа «Лазер» (35 кнопок, полей и ползунков вперемешку) — шесть групп, у каждой своя вкладка и цвет: Лазер (⌖ луч-часы, ✺ все лучи, число лазеров и угол, ↻ шаг, 📌, ⌖→ след., ⏸, 🎯, 🔮), Солнце (☀, щели / Без щелей, ◌ след., ☾ затм., ☾ сквозь 1), Строка 1 (✚ 4 части, ▮ щель 1 и ∠, ◐ полукольцо, ☀ накрыты, ⌖◁ ⌖▷), Щели — симметрия колец (1 щель / вырезы T−1 / все щели, ширина, центр / лево / право, ⌖ меж битами), За чертой — как строится строка (▦ любые, ⊕ xor, ⟿ проход, ▦ до 256, ✎ в поле 2) и Алгоритм (↶ откат, шаг ↷, ½ шаг, ⌖✕ сброс). Кнопки те же, с теми же id и подсказками. Не действует в нынешнем режиме — кнопка затемнена, первой строкой подсказки — почему («только при ☀ солнце», «только в вырезах T−1», «✚ 4 части главнее»…); жать её можно — настройка запомнится и вступит, когда режим сменят. Внизу «Алгоритма» — что в итоге делается, по строкам: источник, строка 1, кольца, за чертой, луна, ход; наведи на строку — золотом светятся её кнопки, наведи на кнопку — её строка. Видимый текст на странице — по прямой просьбе пользователя. Переносы кнопок «в группу Лазер», сделанные руками (Z.btnMove, Z.cgrpMove), вернули бы их из новых групп обратно — один раз такие записи сняты, прежние лежат копией: Z.btnMove_pered_razborom и Z.cgrpMove_pered_razborom. Окно «◯ Конус» теперь «◯ Solarius» (шапка, список окон, вкладка браузера). Проверено в браузере: без луч-часов гаснет всё, кроме включателей; при луче — кнопки солнца и вырезов; при ☀ — лучевые; в вырезах с солнцем появляется строка «Луна»; в 3D неактивны все шесть групп.
Zazerkalius v0.756 — «при перетаскивании групп кнопок пропадают зубцы у левого меню». Слой зубцов (#paneZigOv, v0.755) стоял на постоянном z-index 45, а окно поднимается каждым щелчком по нему: Z.z растёт и хранится между заходами, и щёлкнул по группе в окне у края — окно легло поверх зубцов. Теперь слой всегда на ступень выше самого верхнего окна (Z.z + 1, не ниже 45); пересчёт — при каждом нажатии мыши (в захвате: заголовок окна гасит всплытие) и при каждой перерисовке зубцов. Проверено: окно вплотную к панели, Z.z = 60, щелчок — окно 61, зубцы 62, видны; перетаскивание группы конуса — окно 81, зубцы 82.
Zazerkalius v0.755 — по снимку края левого меню — «вкладывай в зубья левого меню все кнопки группы и верхнее меню полоску». Зубцы были вырезаны внутри панели (острие — на её краю), а вкладки и группы окна у края начинаются за ним: выемки их левого края с остриями не сходились, между ними оставались ромбики фона. Теперь край панели прямой, а зубцы — цветом панели, с чертой — выступают наружу на глубину выемки, поверх окон (слой #paneZigOv, щелчки сквозь него проходят): острие входит в выемку вкладки или ряда группы, что стоит у края. Сетка зубцов та же — остриё на середине полосы вкладок. Проверено замером: окно у края — острие на 267,9 px, вершина выемки вкладки — 268,9 px.
Zazerkalius v0.754 — после снятия конструктора групп (v0.752) — «вроде сделал (рисунки), сбрось все, посмотрим». По слову пользователя один раз при загрузке рисунки групп (Z.cgrpTri) снимаются — кнопки групп снова в обычной раскладке. Прежние рисунки не стёрты: копия — Z.cgrpTri_pered_sbrosom (вернуть — командой в консоли Z.cgrpTri = Z.cgrpTri_pered_sbrosom; save(); location.reload()).
Zazerkalius v0.753 — по снимку «⟿ проход» — «за один проход, а не по накапливающей, то есть слева направо полностью или справа налево». Проход больше не складывается из кусков разных заходов: копится только непрерывный освещённый кусок ячейки, что тянется за светом без перерыва; свет ушёл с ячейки — заново; кусок, оторванный от света, отпадает. Дотянулся от края до края — ячейка красится. Проверено расчётом на 1, 11 с «▮ щель 1» 2°: луч идёт по кругу шагом 0,9° (без разрывов) — ячейка 2 стала «1»; шагом 7° (луч прыгает) — ничего.
Zazerkalius v0.752 — по снимку заголовка группы «🧘 △ ◆» — «убери редактирование кнопок». Значка △ (конструктор группы в «△ Сетке», v0.452) в заголовках групп больше нет; 🧘 и ◆ остались. Уже сделанные рисунки групп не тронуты — раскладка кнопок та же.
Zazerkalius v0.751 — по снимку «▮ щель 1» с солнцем — «дай задать угол щели вплоть до 360° — это будет как режим солнца». У щели строки 1 свой угол: ползунок «∠» рядом с «▮ щель 1», 1…360° (не задан — как общая «щель»; двойной щелчок — 180°). Шире щель — шире свет солнца из неё и выход лазера; 360° — во весь круг, как солнце без щели. Общая «щель» колец (до 10°) не меняется. Проверено расчётом на 1, 11: 2° — свет 179°…181°, 90° — 135°…225°, 180° — 90°…270°, 360° — весь круг.
Zazerkalius v0.750 — по снимку «▮ щель 1» с солнцем — «толщина 1 бита всегда равна всем остальным, и там 1 тоже покажи цифру». Бит строки 1 при ▮ был тоньше колец (от 0,42 радиуса) — теперь во всю толщину кольца, от самого центра, как у ◐ и ✚; при ▮ и у лазера кольца тоже начинаются от центра. На бите строки 1 — его цифра, как у битов прочих колец: у ▮ — напротив щели, у ◐ — посередине полукруга, у ✚ — на обеих белых четвертях. Заодно: лазер с ✚ (v0.743) падал при рисовании — у круга от центра радиус прорези уходил в минус; исправлено.
Zazerkalius v0.749 — «убери эффект, когда на первое кольцо навожу — всё остальное пропадает, скрывается». В v0.736 наведение не брало только полукруг строки 1 (◐); при целом солнце, ✚, ▮ и в лазере кольцо строки 1 по-прежнему бралось — сканер и обводка гасили всё прочее. Теперь кольцо строки 1 наведением не берётся вовсе: ни обводки, ни рамки бита, ни сканера. Shift + щелчок по нему, как прежде, меняет бит.
Zazerkalius v0.748 — «режим солнца, когда красит в 1 или 0 луной — когда любой луч прошёл весь бит от начала до конца». Кнопка «⟿ проход» рядом с «⊕ xor»: ячейка строки за чертой красится не только когда свет накрыл её целиком разом, а когда свет за кручение прошёл её всю — по каждой ячейке копится, какие её доли уже были освещены (по её длине, от начала до конца); набралась вся — 1 от солнца, 0 от луны (там, где луна ставит нули). Копится, пока строка за чертой та же (ушла в поле, ✕, ⌖✕ — заново). Проверено расчётом на 1, 11 с «▮ щель 1» (узкий луч, целиком ячейку разом не накрывает): довод по кругу — без прохода строка за чертой «...», с проходом «.1.».
Zazerkalius v0.747 — по снимку «🎵 музыка × 7 щель 0 пишет Ø» — «перекинь из Лазера в Звук, там подгруппу сделай Лазер». Ряд музыки лазера (🎵 музыка, число головок, щель, «пишет», Ø) переехал из «Лазера» в «♫ Звук» — в конец группы, под подписью «⌖ Лазер». Кнопки те же (по своим id), работают как прежде; в 3D они больше не гаснут вместе с «Лазером».
Zazerkalius v0.746 — по снимку «▮ щель 1 · ☀ солнце» — «а так надо: солнце из щели». При «▮ щель 1» и солнце строка 1 — кольцо-бит со щелью (края золотом), солнце — маленьким кругом внутри; свет выходит только через щель — сектор шириной в щель, там, где она сейчас (крутится с кольцом строки 1, довод ⌖◁ ⌖▷), дальше идёт сквозь кольца как всегда; кольца, как у ◐ и ✚, — от центра. «☀ накрыты» проверяет всё кольцо, кроме щели. Проверено расчётом на 1, 11: довод 0° — свет 179°…181° (и дальше на кольцо 2), 90° — 269°…271°, 180° — у верха.
Zazerkalius v0.745 — по снимку лазера с одной строкой — «почему тут лазер вышел из 1 бита не через его щель?». В вырезах T−1 строка 1 прозрачна — так решено в v0.665 («у 1 строки нет выреза — пусть мимо идёт»), и луч выходит при любом её положении. Кнопка «▮ щель 1» (рядом с «✚ 4 части»): у строки 1 и в вырезах — щель, как в прочих режимах: луч выходит, только когда щель на нём (ширина — ползунок «щель», крутится с кольцом строки 1, довод ⌖◁ ⌖▷); щель рисуется прорезью. Без кнопки — как было. Проверено расчётом на 1, 11: со щелью луч встаёт на строке 1 при доводе 0° и 90°, выходит при 180°; без — выходит всегда.
Zazerkalius v0.744 — «солнце тоже должно тут работать в 4 частях — просто маленьким кругом внутри его сделай, и так же лучи». «✚ 4 части» теперь и для солнца: строка 1 — тот же круг из четвертей (чёрная, белая, чёрная, белая), солнце — маленьким светящимся кругом в центре; свет выходит только через чёрные четверти — два сектора по 90° с лучами-краями, дальше идёт сквозь кольца, как всегда. «☀ накрыты» при ✚ проверяет белые четверти. Проверено расчётом на 1, 11, 111: свет за строкой 1 — 40°…130° и 220°…310°.
Zazerkalius v0.743 — «нужен вариант лазер-луча, который из центра проходит через щель первого бита T−1, и где T−1 бит состоит из 4 частей — круг, поделённый на 4 части: чёрн-бел-чёрн-бел». Кнопка «✚ 4 части» (рядом с «⌖ меж битами»), для лазера в вырезах T−1: строка 1 — круг от самого центра на 4 четверти, от верха по часовой чёрная, белая, чёрная, белая (края — золотом). Лазер из центра выходит только через чёрную четверть (щель), на белой (бит) встаёт; круг крутится, как кольцо строки 1, — на четверть за шаг; кольца, как у ◐, начинаются от центра. Проверено расчётом на 1, 11, 111: при повороте круга на 0, ½, 2 — луч встаёт на круге, на 1, 1½, 3 — проходит дальше.
Zazerkalius v0.742 — по снимку солнца с луной — «значок для вкладки Конус стилизуй», «без чисел». Вместо кружка «◯» у «Конуса» — свой значок: солнце в центре, золотой сектор света с двумя лучами, напротив — голубой лунный сектор, пунктирное кольцо; подписей и долей нет. Стоит в верхней полосе, в заголовке окна и на отдельной странице «Конус» (там же — значком вкладки браузера).
Zazerkalius v0.741 — «если 0, то не становится 1 по Xor, а должно». Ноль свет проходит свободно (v0.724), и попаданием он не считался — xor его просто не видел. Теперь при ⊕ xor ноль строки за чертой, накрытый светом целиком, — тоже попадание: ячейка переключается в 1 (свет в этот миг идёт сквозь неё дальше). Проверено расчётом на 1, 11: «00.», свет заново на ячейке 2 → «01.», затем на ячейке 1 → «11.».
Zazerkalius v0.740 — «сделай кнопку Xor: если второй раз солнце тут, а уже 1 там, то 0, и если было 0, то ставить 1 — всё, в общем»; «Xor только на строке за горизонтом». Кнопка «⊕ xor» рядом с «☀ накрыты»: ячейка строки за чертой, на которую свет солнца упал заново (не держится с прошлого шага), меняется — 1 → 0, 0 → 1, пустая → 1; строки поля не трогаются. Нули луны — как были. Без xor — свет ставит 1. Проверено расчётом на 1, 11: «11.», свет заново на ячейке 2 → «10.», затем на ячейке 1 → «00.»; свет, что держится, не переключает.
Zazerkalius v0.739 — по снимку группы «Лазер» — «как запустить в режиме лазера T−1, чтобы между битами лазер переходил наружу». В вырезах T−1 лазер проходил кольцо только через вырез — биты стояли стеной сплошь. Кнопка «⌖ меж битами» (рядом с «▥ центр»): луч проходит и через щель между соседними битами (ширина — ползунок «щель», как в «все щели») — у колец строк, у кольца за чертой и у пустых «до 256». Проверено расчётом на 1, 11, 111: перебор положений колец 2 и 3 — луч выходит в 546 из 3600 вместо 480.
Zazerkalius v0.738 — две правки. (1) «В режиме 256 сделай, чтобы можно было за горизонт тянуть вверх, скрывая строки — временно; но если они окажутся затронуты автоматикой, то надо автоматом и расширить горизонт вниз». Черта вверх прячет строки, как и прежде; при «до 256», как только во время кручения или шага свет солнца или луч лазера дойдёт до места спрятанных строк (кольцо за чертой и дальше), черта сама опускается и строки возвращаются (↩ поднимет снова); краска этого мига не ставится — её поставит следующий кадр по настоящим строкам. Простая отрисовка (протяжка черты) строки не возвращает. (2) «T−1 — сделай кнопку расположения нулевого (начала вырезов): первое — как сейчас, по центру симметрии, второе — по левому, и по правому третье краю». Кнопка рядом с «вырезы T−1», щелчок — по кругу: ▥ центр (как было), ◧ лево — левый край выреза каждого кольца на вертикали (вырез идёт от неё по часовой), ◨ право — правый край выреза на вертикали. Проверено: 1, 11, 111 — ◧: вырезы колец 2 и 3 начинаются сверху (0°…120°, 0°…144°), ◨: кончаются сверху; черта вверх на 1, 11, 111, 1101 с «до 256» — на шаге свет дошёл, строка 4 вернулась.
Zazerkalius v0.737 — «масштаб меньше не делается, чем кольца первое, почему-то». Отдалять конус (колесо, кнопки, клавиши) можно было только до 0,3 окна: при многих кольцах — а масштаб с v0.715 при новом кольце не меняется — внешние оставались за краем. Теперь отдалять можно до 0,02.
Zazerkalius v0.736 — «сейчас при наведении на 1 бит, когда он полукруг, — 0 — всё остальное пропадает, убери этот эффект». С ◐ строка 1 — полукруг от центра, и наведение на него брало бит строки 1: сканер и обводка кольца гасили всё прочее. Теперь полукруг строки 1 наведением не берётся — ни рамки, ни сканера, ни обводки строки.
Zazerkalius v0.735 — «сделай перемещение не по Ctrl, а по правой кнопке». На холсте конуса всё, что тянулось с Ctrl, тянется правой кнопкой мыши: кольца крутятся (строки 1 — довод, кольцо за чертой, любое кольцо строки), в объёме — сдвиг вида. Правый щелчок без движения ничего не выбирает; по кольцу за чертой — как прежде, стереть его (после протяжки правой — не стирает); меню браузера над конусом не всплывает. Ctrl по-прежнему работает, Ctrl + щелчок — выделить кольцо. Проверено: протяжка правой по кольцу 2 — повернулось на 2,5 части.
Zazerkalius v0.734 — «нужна кнопка: ось из центра — вертикаль и горизонталь». Кнопка «✛ оси» в группе «Кольца» (перед «⌖ сканер»): две пунктирные черты через центр конуса — вертикаль и горизонталь во весь холст; едут вместе с центром при сдвиге вида.
Zazerkalius v0.733 — «по идее оно (солнце) же должно быть 0 толщины, а у полукольца внутреннее кольцо 0 длины, то есть это круг». С ◐ кольца начинаются от самого центра: строка 1 — полукруг от центра до толщины кольца (внутренний край — точка), солнце — светящаяся точка в центре поверх него; кольцо 2 — следующее, все одинаковой толщины. Прежнего отступа на толщину кольца (v0.732) нет.
Zazerkalius v0.732 — после объяснения, что полукольцо (180°) помещается под двумя битами кольца из трёх частей (240°) с запасом по 30°, — «да, все кольца одинаковой толщины должны быть». С ◐ полукольцо было тоньше колец (треть радиуса солнца). Теперь кольца отодвинуты от центра ровно на толщину кольца (внутренний радиус = шагу колец), полукольцо строки 1 — во всю толщину кольца, как все, а солнце — в освободившемся центре. Без ◐ — как было.
Zazerkalius v0.731 — по снимку «☀ 1/12» — «всё равно светит, почему». При одной строке (только солнце) строка 2 — это кольцо за чертой, а его «☀ накрыты» не проверял (оно считалось ещё пустым), и солнце светило. Теперь проверяется и оно: бит строки 1 должен быть целиком накрыт поставленными единицами кольца за чертой; нет — света нет. На снимке солнце целое (◐ выключено) — такое закрыть нельзя вовсе, света не будет; полукольцо включается кнопкой ◐ (или заново — «☀ накрыты»).
Zazerkalius v0.730 — про «☀ накрыты» («если хоть одна не закрыта, свет останавливается на этом кольце»): «это пусть только 1 строки касается, то есть солнце светит тогда, когда 1 бит первой строки весь накрыт единицами из 2 строки». Проверка осталась одна: бит строки 1 (полукольцо) целиком накрыт по углу единицами строки 2 — солнце светит, нет — света нет. Прочие кольца больше не проверяются: свет идёт сквозь вырезы и нули, как обычно.
Zazerkalius v0.729 — про «☀ накрыты»: «полукольцо там считается тоже: солнце светит, когда оно всё закрыто снаружи единицами, только». Строка 1 теперь проверяется всегда: солнце светит, только когда его полукольцо целиком закрыто единицами кольца 2 (без ◐ — целое солнце, закрыть его нельзя, света нет). Чтобы так не выходило, «☀ накрыты» включает «◐ полукольцо» вместе с собой. Дальше — как в v0.728: из кольца в следующее — только когда все единицы закрыты.
Zazerkalius v0.728 — «ещё кнопку рядом с полукольцом: что солнце из текущего кольца светит дальше только тогда, когда все единицы этого кольца закрыты единицами внешнего кольца». Кнопка «☀ накрыты» рядом с «◐ полукольцо»: свет идёт из кольца строки в следующее, только если каждая «1» этого кольца целиком закрыта (по углу) единицами следующего; нет — свет встаёт на нём. Проверяются кольца строк (кольцо за чертой ещё пустое — не проверяется); строка 1 — только полукольцом (◐): целое солнце закрыть нельзя. Проверено расчётом на 1, 11, 111 с ◐: фаза 0 — полукольцо не закрыто единицами кольца 2, света нет; фаза 1 — закрыто, свет входит в кольцо 2 и встаёт на нём (его единицы кольцом 3 не закрыты).
Zazerkalius v0.727 — «ещё кнопку, которая для солнца и T−1 режима делает 1 строку (1) не цельной, как сейчас, а половинкой кольца, а солнце внутри него». Кнопка «◐ полукольцо» рядом с «☾ сквозь 1»: строка 1 — не целый диск, а полукольцо с битом (золотые края), солнце — меньшим диском внутри. Свет выходит только через открытую половину (у бита «0» — весь круг, v0.724); полукольцо крутится, как кольцо строки 1, — полоборота на шаг. Проверено расчётом на 1, 11: свет за строкой 1 — полкруга, сдвигается с фазой (фаза 0 → 9°…189°, ½ → 99°…279°).
Zazerkalius v0.726 — про «☾ сквозь 1»: «пусть не так, а условие другое: свет должен пройти по всей длине через одинаковое количество единиц» → «каждая ячейка отдельно». Луна по-прежнему идёт из центра, но «1» больше не останавливает её — проходит насквозь, считая их на пути каждого луча (свет ведётся по частям: сколько «1» прошёл). Ноль на кольце за чертой — только в ячейку, которую целиком накрыл свет с одним и тем же счётом; накрыта лучами с разным счётом — свет есть, нуля нет. Проверено расчётом на 1, 11, 111 с ☾ затм.: фаза 1 — ячейку 3 накрывают лучи с разным счётом, нуля нет (без кнопки — 0); фазы 0 и ½ — нули на месте.
Zazerkalius v0.725 — «сделай кнопку и включи, что луна может проходить только через одну 1». Кнопка «☾ сквозь 1» рядом с «☾ затм.», по умолчанию включена: луна идёт, как солнце, из центра наружу, кольцо за кольцом — сквозь вырез и «0» свободно, одну «1» на своём пути проходит насквозь, на второй встаёт (свет ведётся двумя частями: ещё не проходил «1» и уже прошёл одну). Направление луны и где она ставит нули — как прежде (v0.711–v0.724). Выключено — как было: луна начинается у кольца за чертой.
Zazerkalius v0.724 — «солнце проходит через 0 свободно! надо так». В вырезах T−1 бит «0» свет больше не держит: и солнце, и луна проходят его, как вырез, — у колец строк это нули строки, у кольца за чертой — поставленные нули (в «▦ любые» — тоже). Стены — только единицы. Заодно куски света, сходящиеся встык с погрешностью счёта, склеиваются в один (весь круг — снова весь круг). Проверено расчётом: 1, 00 — свет проходит кольцо 2 целиком; 1, 10, 101 — через ноль строки 2 свет идёт дальше на кольцо 3.
Zazerkalius v0.723 — «когда ставит 0, то нельзя ставить их через кольцо от того кольца, где солнце упёрлось в единицы, — только прилегающему (следующему от того кольца, где солнце упёрлось)». Ноль на кольце за чертой (N) теперь — только там, где напротив, через центр, солнце упёрлось в биты кольца N − 1: свет до него дошёл, но в N не прошёл. Ячейка — 0, только если луна накрыла её целиком внутри зеркала такого света; где солнечный свет дошёл до кольца за чертой (или дальше) — нулей напротив нет. То же — в «▦ любые». Проверено расчётом на 1, 11, 101 с ☾ затм.: солнце упёрлось в кольцо 2 — нули на кольце 3; свет дошёл до кольца 3 — нулей нет.
Zazerkalius v0.722 — «нужна кнопка: считать кольцо T−1 — все ячейки могут стать битами, но становятся только те, в которые первыми попал свет, потом переход на следующее кольцо по счёту» → «первые n — биты» и «первый бит уже определяет, что все последующие будут только у него рядом — он либо крайний, либо где-то средний, поэтому вырез всегда будет какой нужно». Кнопка «▦ любые» рядом с «☾ затм.»: у кольца за чертой все 2n − 1 частей — места, готового выреза нет. Часть, которую свет накрыл целиком (☀ — 1, ☾ — 0), становится битом, если это первый бит или она вплотную к уже стоящим; прочие пустые свет проходит. Набралось n — строка готова и уходит в поле: эти биты подряд, кольцо повёрнуто так, что они на своих местах, а оставшиеся n − 1 частей — вырез одним куском; дальше — следующее кольцо. |◀, ↶ и перемотка помнят части. Проверено шагами на 1, 11: части «11..1» (сомкнулись через верх) → строка 111, кольцо повёрнуто на −4 части; следующее (7 частей) набирает «....111».
Zazerkalius v0.721 — по снимку перемотки — «ползунок прямо под центром солнца и шириною в 4 раза больше, чем сейчас». Ползунок перемотки стоял посередине холста и, как все, был 140 px (общее правило v0.313). Теперь — 560 px (не шире холста) и середина его — прямо под центром солнца: место берётся при каждой отрисовке, сдвинул вид — ползунок следом.
Zazerkalius v0.720 — «крутить, когда с солнцем T−1, — надо ползунок показать внизу в середине, длинный, и на нём чтобы можно было перемещать взад-вперёд, откатывая — не то что шаги, а как будто перемотку назад кручения». Лента перемотки: пока солнце в вырезах крутится (▶ крутить, «шаг ↷», «½ шаг», |◀ ▶|), каждый кадр пишется — фаза и поворот конуса и ссылка на состояние (строки, краска, строка за чертой, лог); само состояние пишется заново, только когда сменилось. Ползунок внизу посередине холста: назад — всё как было в тот миг (кручение встаёт, показ ничего не красит), вперёд — до конца записанного. Крутить дальше с отмотанного места — запись впереди стирается и идёт заново. Только в памяти страницы; ⌖✕ сброс — лента с нуля. Проверено: 8 шагов на 1, 11 — назад к первому: строки 1, 11, «.1.»; в конец: 1, 11, 111.
Zazerkalius v0.719 — по снимку «⌖✕ сброс» — «пусть возвращает всё до начала, когда есть только солнце и 2 строка». Сброс стирал золото и строку за чертой и ставил кольца на места, но строки, ушедшие в поле по шагу или кручению, оставались. Теперь снимаются и они: остаются строка 1 (солнце) и строка 2, за чертой — пустая третья, масштаб подгоняется заново. Перед сбросом — снимок, ↩ вернёт строки.
Zazerkalius v0.718 — по снимку «▶ крутить» — «когда не через шаги, а в кручении крутит, то надо также расширять горизонт, когда все биты заполнит». Готовая строка за чертой уходила в поле только по шагу (v0.702). Теперь и при непрерывном кручении (луч-часы или солнце): как только строка готова (у солнца в вырезах — без пустых ячеек, иначе — вся «1»), она уходит в поле, черта опускается, кручение идёт дальше и красит следующую. Масштаб при этом не меняется (v0.715), |◀ возвращает строку за черту.
Zazerkalius v0.717 — «сделай кнопку, по которой луна будет светить, только когда всё солнце скрыто за единицами, также через лучи из центра в обратном направлении». Кнопка «☾ затм.» рядом с «◌ след.»: луна — только при затмении. Ничего не вылетело (весь свет лёг на биты) — зеркалится свет, упавший на последнее кольцо, куда он дошёл, через центр в обратную сторону; вылетело хоть что-то — луны нет. Дальше всё как обычно: от кольца за чертой, нули там, где накрыла ячейку целиком, на кольцо наружу. Выключено — прежнее: луна зеркалит вылетевший свет. Проверено расчётом на 1, 11: строка за чертой «.1.» — свет вылетел, при затмении луны нет; «111» — не вылетел, луна −60°…60°.
Zazerkalius v0.716 — по снимку «☀ 1/3 · ☾ 0» — «когда стык битов, не рисуются вообще лучи, хотя солнце вылетело, и оно неверно посчитано» → выбрано «насквозь пустой ячейки». Пустая ячейка кольца за чертой, которую свет накрыл не целиком, его больше не держит: свет проходит её, как вырез, и вылетает дальше — отсюда зарево снаружи, луна напротив и подпись ☀ вылетевшей доли. Накрытая целиком — краска (1 от солнца, 0 от луны), закрашенная — стена. То же правило — у луны на кольце за чертой.
Zazerkalius v0.715 — «когда кольцо добавляет — пусть масштаб не меняет». Шаг колец делился на число колец, и каждое новое кольцо (строка ушла в поле, |◀, ↶, новая строка руками) сжимало весь конус. Теперь делитель держится, пока колец стало на одно больше или меньше: новое кольцо выходит наружу, дальше — колесом. По месту пересчитывается, когда строк сменилось сразу много (загрузка, вставка), сменились режимы (до 256, 3D) или сброс вида (Alt + двойной щелчок, ⌂).
Zazerkalius v0.714 — по снимку «☾ 1/3» — «луну, как и солнце, показывай в следующем кольце». Вылетевшее солнце видно заревом на кольцо наружу, а луна там рисовалась, только если прошла и вырезы кольца за чертой, — у одной строки «1» напротив выреза биты, и в следующем кольце луны не было. Теперь луна — весь зеркальный сектор — показана в следующем кольце на тех же радиусах, что зарево солнца, синим. Считается всё как в v0.713.
Zazerkalius v0.713 — по снимку «☀ 1/15» — «вот тут 1/15 часть солнца вылетела только из всех колец — значит, такая же луна с другой стороны только». Луна — зеркало света, вылетевшего из ВСЕХ колец, включая кольцо за чертой (прошёл и его вырез), той же доли напротив; прежде зеркалился свет, дошедший до кольца за чертой, и луна выходила шире солнца (☾ 1/6 при ☀ 1/15). Начинается у кольца за чертой — красит там нули, где накрыла ячейку целиком, — и идёт на кольцо наружу. Не вылетело ничего — луны нет. Подпись ☾ — доля этого зеркала.
Zazerkalius v0.712 — по снимку — «свет от луны правильно покажи». Луна — те же солнечные лучи, продолженные через центр, а рисовалась только у кольца за чертой, от диска до него — один бледный пунктир; выглядело пятном, взявшимся ниоткуда. Теперь, как солнце, она выходит из диска: от диска до кольца, где начинает действовать, — слабое синее свечение между лучами и сплошные голубые края. Заодно сектор луны, разрезанный на 0°, больше не рисует ложный край на стыке.
Zazerkalius v0.711 — «свет от луны задать таким, что только от вылетевших лучей солнца угол задаётся — от тех, что вышли за все кольца через зазоры, имеющиеся до кольца ниже горизонта, а не как сейчас». Антисвет — зеркало только того солнечного света, что прошёл вырезы всех колец строк и дошёл до кольца за чертой; начинается у этого кольца. Не дошёл ничего — антисвета нет (прежде зеркалился первый же неполный пучок). Строки 1, 11: свет 120°–240° у строки за чертой → антисвет −60°…60°; 1, 11, 101: свет за черту не дошёл — антисвета нет.
Zazerkalius v0.710 — две правки. (1) По снимку — «свет лучей также продолжи на следующую строку во внешнюю»: антисвет шёл от самого центра и упирался в биты первого же кольца (напротив выреза у симметричного кольца — его биты). Теперь он начинается там же, где солнечный пучок, — перед кольцом, на которое пучок падает (свет вышел за крайнее — сразу за ним), и идёт дальше наружу; от диска до этого уровня — только голубые пунктирные лучи-края. Строки 1, 11: антисвет −60°…60° — у строки за чертой, сквозь её вырез — наружу. (2) «Верни отображение частей»: подписи частей за крайним кольцом пропадали, когда свет занимал весь круг или не доходил вовсе (делить нечего) — теперь всегда: тогда одна часть на весь круг («☀ 1/1» / «◌ 1/1») и сводка.
Zazerkalius v0.709 — «шаг назад также и строки из-под горизонта должен обратно возвращать». |◀ — зеркало шага вперёд: строка, ушедшая в поле по шагу, возвращается за черту первым же |◀ (черта вверх, со своей закраской, счётом попаданий, накруткой и поворотом кольца за чертой), ничего не крутя; крутит назад следующее нажатие (fillUncommit, память перед каждым fillAutoCommit; строки менялись иначе — забыта). Строки 1, 11, за чертой «111»: ▶| — «1, 11, 111» → |◀ — «1, 11», за чертой снова «111» → |◀ — кручение назад.
Zazerkalius v0.708 — на «сектор напротив солнца убран» — «нет, свет лучей — это антисолнце-лучами, как было: они так же, как солнце, светят, но синим, и только когда полностью бит осветят — тогда красить в 0». Антисолнце — лучи солнца, продолженные через центр в обратную сторону (как луна v0.690): направления — зеркало солнечного пучка (первый освещённый не весь круг; нет такого — свет, вышедший за крайнее кольцо). Светит, как солнце: из центра наружу кольцо за кольцом — сквозь вырез проходит, на битах останавливается; ячейка строки за чертой, накрытая им целиком, — 0. Рисуется синим перед каждым кольцом (у первого — от диска), прошёл крайнее — ещё на кольцо наружу; подпись ☾ — по нему. Правила «свет сквозь единицу» (v0.701–v0.707) сняты. Строка «1»: антисвет −60°…60° накрывает ячейки за чертой наполовину — нулей нет.
Zazerkalius v0.707 — по снимку — «тут луна только часть бита осветила, но поставила 0». Рисовалась одна «луна» (сектор напротив солнца через центр, v0.690), а нули ставила другая — свет, прошедший сквозь одну единицу (v0.701–v0.706). На вопрос, какая настоящая, выбрано «луна = свет сквозь 1»: синим теперь рисуется именно он — перед каждым кольцом, синеватым градиентом с голубыми краями; где синее накрыло ячейку целиком — там 0. Сектор напротив солнца снят; подпись ☾ за крайним кольцом — тоже по этому свету. Строки 1, 11: синее 240°–120° задевает крайние ячейки за чертой краем — за чертой «.1.», подписи «☀ 1/3 · ☾ 2/3».
Zazerkalius v0.706 — две правки. (1) «Откат не сработал»: история писалась только у «шаг ↷» и «½ шаг», а строки в снимке были лишь подписью — стоило черте опуститься (готовая строка уходит в поле), откат стирал всю историю. Теперь снимок полный (строки поля и за его границей, текущая, поворот кольца за чертой), откат возвращает и черту, и в историю идут все шаги: «шаг ↷», «½ шаг», |◀ ▶| и нажатие, которое только опускает черту (lasRec). Прежнее состояние пользователя не восстанавливалось — по его слову, это просто функция, которая должна работать. (2) «Пусть только за одной единицей луна красит в 0, а не за несколькими»: «нулевой» свет, упавший на вторую «1», гаснет, дальше идёт только сквозь вырез. Проверено и «частично — не красит в 0»: строки 1, 11, 111 — за чертой «.00.», крайние ячейки задеты краем и пусты.
Zazerkalius v0.705 — «красить 1 или 0 только когда весь бит будет лучами покрыт». В вырезах T−1 ячейка красится светом (1) или «нулевым» светом (0), только если он покрывает её дугу целиком; задетая краем — не красится и остаётся пустой (coneCellCovered). Строки 1, 11: за чертой «.1.» — целиком освещена только средняя; 1, 11, 101: у кольца 3 закрашен только средний бит, за чертой «0000» — нулевой свет покрыл все четыре.
Zazerkalius v0.704 — «в режиме лазера дай крутить последнее кольцо руками». Кольцо за чертой при луч-часах крутится мышью с Ctrl, как прочие кольца (v0.248): свой поворот Z.coneFillTurn поверх кручения; отпустил — на целую ячейку, в вырезах T−1 — на половину части. Ушла строка в поле — поворот переходит к кольцу этой строки (рисунок не прыгает), у новой строки за чертой — 0; ⟲ и вход в вырезы — тоже 0. Протяжка на 50° по часовой у кольца из 5 частей — на полчасти (4,5 из 5).
Zazerkalius v0.703 — «лучи прошли через единицы 2 строки и единицы 3 строки на 4-ю — там надо 0 ставить, почему-то не ставит». В v0.701 свет сквозь «1» красил только следующее кольцо и гас. Теперь «нулевой» свет идёт по кольцам: на кольце он красит нулями ячейки, куда упал, и проходит дальше сквозь вырез и сквозь биты «1» (на «0» гаснет); к нему добавляется основной свет, упавший на «1». На строке за чертой — нули, дальше нет. Строки 1, 11, 101: строка 4 за чертой — «0000».
Zazerkalius v0.702 — «когда строка вся битами заполнена, следующий шаг — сначала просто сдвинуть горизонт без кручения, а потом следующее нажатие крутить». Готовность строки за чертой проверяется в начале шага («шаг ↷», «½ шаг», |◀ ▶|): готова — это нажатие только уводит её в строки и опускает черту, ничего не крутит; крутит следующее. Строки 1, 11: «111» за чертой → шаг: «1, 11, 111», фаза 0 → шаг: кручение.
Zazerkalius v0.701 — «теперь так: пусть свет от лучей проходит, когда через единицы, — то он закрашивает следующую нулями; и когда все биты строки закрасятся либо 1, либо 0 — строка готова» («keys» — «лучи» в английской раскладке). Солнце в вырезах T−1: свет, упавший на бит «1» кольца строки, проходит его и красит ячейки следующего кольца нулями (по тем же расходящимся углам; дальше не идёт); свет через вырез — как был, единицами; единица сильнее нуля. Пустые ячейки строки за чертой больше не заливаются нулями сами («остальные — нулями» было для лазера), и строка готова, когда пустых нет — все 1 или 0; в поле она уходит по шагу, как прежде. Вне вырезов и у лазера — по-старому (готова, когда вся «1»).
Zazerkalius v0.700 — по снимку «☀ ≈2/15 · ☾ ≈2/15 · ◌ ≈4/11 · ◌ ≈4/11» — «потом остальное же 11/15, обе части — если их как 11/30? неправильно». Каждая часть округлялась сама по себе: у ◌ ближайшей простой вышла 4/11, и в сумме не выходил целый круг. Теперь доли частей подбираются к одному знаменателю q, при котором все части — целые p и Σ p = q: точный — первый такой; иначе (q до 60, ошибка до 0,004 у каждой, «≈») — заметно (вдвое) точнее прежнего найденного; дроби сокращаются по одной. ☀ ≈ 0,1335: «≈2/15 · ≈2/15 · ≈11/30 · ≈11/30».
Zazerkalius v0.699 — на вопрос «шаг в Лазере на сколько частей круга поворачивает?» (ответ: ни на сколько заранее — мелкими подшагами до следующего события) — «сделай кнопку — шаг ровно на 1/2 часть текущего кольца» (набрано «1.2»: в русской раскладке на месте «/» точка). «½ шаг» рядом с «шаг ↷»: поворот ровно на полчасти кольца текущей строки (частей n, в вырезах T−1 — 2n − 1), в выбранном направлении. «Каждое» / «Встреч Бит» — фаза +½ части, все кольца на полчасти своих; «Встреч Стр» — на 360° / частей / 2; «Всё» — весь конус на тот же угол. Запоминается для «↶ откат», готовая строка за чертой уходит в строки, как при шаге. Строки 1, 11, 101, текущая 2: кольцо 2 — на 60°, свет 120°–240° → 180°–300°.
Zazerkalius v0.698 — две правки. (1) По снимку «◐ 2/3 · ☀ 1/3» — «луна 2/3 показывает, солнце 1/3, а что остаётся между ними? покажи у каждой части её количество от целой»: «◐» был всей тёмной частью и читался как луна. Теперь круг за крайним кольцом делится на солнце ☀ (свет), луну ☾ (сектор напротив света через центр) и остаток ◌ между ними (оба сразу — ☀☾); у каждой части — доля целого круга, в сводке — сколько частей каждого вида и лучей. Строки 1, 11: «◌ 1/6 · ☀ 1/3 · ◌ 1/6 · ☾ 1/3». (2) «Только при шаге надо расширять линию горизонта вниз, а не автоматом»: готовая строка за чертой (вся «1») уходит в строки только по шагу — «шаг ↷» в «Лазере» или |◀ ▶| в «Кручении», по одной за шаг; само по себе (кручение ▶, отрисовка) — нет. Строка «1»: «11» ждёт за чертой → шаг → «1, 11» → шаг → «1, 11, 111».
Zazerkalius v0.697 — две правки. (1) По снимку солнца — «по краям за последним кольцом покажи, сколько частей разделило солнце светом, то есть сколько частей света и сколько лучей и между ними» (набрано в английской раскладке: «keys b vt;le» — «лучи и между»). Свет, дошедший до крайнего кольца (или вышедший за него), делит круг на светлые и тёмные части; за крайним кольцом у каждой — её доля круга: «☀ 1/3», «◐ 2/3» (не простая дробь — «≈»), сверху сводка «☀ частей 1 · лучей 2 · ◐ между 1». (2) «Убери клик по пустому биту, что делает его 1 и 0 по очереди — отмени это, удали»: щелчок по ячейке кольца за чертой на конусе больше её не меняет (было с v0.114), и само кольцо за чертой для щелчков — как пустое место (ни выделить, ни крутить). Щелчок по ячейке строки за чертой в поле строк остался.
Zazerkalius v0.696 — «если все биты заполнились единицами в кольце, то строка готова — её открывай в строках, линию под неё смещай, горизонт». Строка за чертой, ставшая вся «1» (лазером или солнцем), сама уходит в строки поля, черта — под неё (снимок ↩ на каждую; замок строк ⛔ не пускает). Счёт попаданий не теряется: кольца нумеруются так же, попадания в следующее кольцо (теперь оно за чертой) переходят в его ячейки — «1», остальные «0»; стала и она вся «1» — уходит следом (fillAutoCommit). Строка «1», солнце, T−1, «до 256»: «11» → в строки, следом «111», дальше свет перекрыт.
Zazerkalius v0.695 — по снимку «↶ откат · шаг ↷» — «при шаге показывай, куда будет светить солнце в следующем шаге, если включить кнопку; сделай кнопку рядом с кнопкой Шаг». «◌ след.» рядом с «шаг ↷» (Z.lasPeek): на конусе белым пунктиром — края секторов, куда ☀ будет светить после следующего шага, и слабая белая заливка. Следующий шаг ищется тем же ходом, что ▶| у солнца (фаза мелкими шагами, пока свет не упадёт иначе), на копии; итог запоминается и пересчитывается, только когда сменились фаза, строки, накрутка или режимы (coneSunPeek). Строки 1, 11, 101, «Каждое»: сейчас 120°–240°, показ 60°–180° — после шага ровно так.
Zazerkalius v0.694 — по снимку строк пустых колец под чертой — «строки наложились на номера». Строки поля стоят в сетке (у строки display: contents), а обёртка #voidRows встала в неё одной ячейкой — номер и биты каждой строки шли друг под другом. Обёртка теперь тоже display: contents, строки пустых колец — в сетке, как прочие.
Zazerkalius v0.693 — по снимку конуса с пустыми кольцами — «пусть вживую сразу дорисовывает биты в строках под чертой (и сдвигать черту при выходе на уровень — но это пока непонятно как), в общем под чертой проставь в режиме 256 сразу все 0000 и сразу их заполняй». При «▦ до 256» внизу поля строк (под строкой для заполнения и строками за границей) — строки пустых колец N + 1 … 255, каждая на бит длиннее: 0, где луч или свет ещё не попадал, 1 золотом — где попал (счёт Z.voidHits). Обновляются на ходу, когда счёт поменялся. Это вид, а не строки поля — в счёт и правку не идут. Сдвиг черты при выходе на уровень — отложен, пользователь сам сказал «пока непонятно как». Строка «1» под солнцем в T−1: свет сквозь вырез кольца за чертой — на кольцо 3, его строка сразу «111».
Zazerkalius v0.692 — три правки. (1) «▦ до 256 — не могу нажать при режиме T−1»: галку гасило «Без щелей» солнца (там пустые кольца не нужны), а в вырезах проход задают вырезы — теперь в T−1 «до 256» доступно и работает при любом выборе солнца (coneVoidOn, coneSunUi). (2) По снимку «Вида» — «ВИД)) к мин)неп)неп))одинак) и т. д. — направление стрелок вправо всё время»: каждая кнопка рисунка конструктора (два ряда, сплошь) показывается стрелкой вправо — слева выемка, справа остриё; кнопки строки — вплотную, остриё в выемку (прежде между ними оставалась щель в ромбик: следующая ставилась на столбец дальше нужного). Рисунок не меняется. (3) «Почему сканер при наводке на 1 синий тут не делает ничего»: ячейка кольца за чертой при ⌖ сканере — тоже «бит под мышью»: рамка и ось сканера (coneFillHoverAt).
Zazerkalius v0.691 — две правки. (1) По снимку «Вида» — «кнопки наложились тут»: на месте одной кнопки рисунка (номер места сдвинулся) стоит блок-обёртка из трёх кнопок «выдел. · ✳ лучи · все», и они вылезали на «1-й бит». Блок, которому мало места, теперь дорисовывается до размаха своих кнопок (у них своя ширина, от коробки не зависят), соседи справа сдвигаются — как у ползунка. Первая попытка мерила саму коробку, уже расширенную (+2 px), и группа росла по кругу при каждом пересчёте — «сама удлиняется группа, чуть монитор не вышибла справа»; поймано до коммита. (2) По снимку солнца с одной строкой — «лучи также пусть на 1 кольцо выходят из 2 в пустоту, и также зарево между ними»: свет, прошедший последнее кольцо, — золотое зарево и края-лучи ещё на одно кольцо наружу, напротив — луна.
Zazerkalius v0.690 — по снимку солнца — «у нижнего бита границ не видно совсем под солнцем; и покажи за солнцем — из через центр проходящих его лучей — в обратную сторону от выреза также подсвет, лунный, синевой, и всё продолжи даже немного дальше крайнего кольца». (1) Поверх золотого свечения — черты между ячейками колец, на которые падает свет (цветом фона), края вырезов — золотом. (2) Луна: края каждого светового сектора продолжены через центр в обратную сторону (голубые линии от диска солнца), сектор напротив — слабый синеватый градиент. (3) Пунктир солнца и лунные лучи — до чуть дальше крайнего кольца (на 0,6 кольца).
Zazerkalius v0.689 — по снимку «Вида» — «левая граница группы двойная почему-то». Рамка группы ждёт первую кнопку ряда выемкой у самого края (у границ рядов — 0, в середине — t), а раскладка конструктора ставит её со столбца 1 — её край тот же зубец, но на t правее: две одинаковые ломаные рядом. Теперь у группы с рисунком конструктора рамка на t правее, ровно по кнопкам (tzgFrame), а строка при переносе начинается со столбца 1 (выемкой в рамку) или 2 (остриём в её выемку), а не 0, где остриё срезалось рамкой (tzcApply).
Zazerkalius v0.688 — по снимку сканера («83%», «67%») — «а можно не в %, а в точных дробях? и показать линиями части; где 83% — сколько линий разделяет бит?». Проценты были там, где ось режет бит не в простой дроби: после шагов лазера кольца стоят на мелких фазах (−4,001 бита), и место разреза — не кратное части. Теперь подпись — дробь, где стоит ось от начала бита: точная (знаменатель до 64) — «5/6», бит поделён синими чертами на 6; иначе ближайшая простая дробь (знаменатель до 32, ошибка до 0,005) — «≈5/6», черты пунктиром; не нашлось — десятичная «0,83» без черт.
Zazerkalius v0.687 — «для лазера надо сделать отдельные кнопки кручения, которые как шаги можно откатывать назад, всё стирая закрашенное на место». В «Лазере» (последним блоком) — «↶ откат» и «шаг ↷». Шаг — тот же, что ▶| / |◀ (до следующего события лазера, выбранным режимом и направлением), но перед ним запоминается всё, что меняют кручение и луч: фаза и поворот конуса, накрутка колец, довод строки 1, краска и остановленные кольца (Z.voidHits), строка за чертой, лог, счёт проходов, память конца луча (и солнца). Откат возвращает последнее запомненное, подряд — дальше назад, до 500 шагов; шаг, который ничего не сдвинул, не запоминается. История — на время сессии; сменились строки — забыта. Строки 1, 11, 101, 1001, «Каждое»: 4 шага закрасили биты кольца 3 и ячейку за чертой, 4 отката вернули всё ровно к началу.
Zazerkalius v0.686 — по снимку солнца в вырезах — «между 2 лучами солнца как-то градиентом сектор золотой, несильно, только светить». Сектор между краями света — мягкий золотой радиальный градиент поверх колец: от места выхода (вырез кольца, сильнее) к внешнему краю кольца, куда свет упал (слабее). Сектор во весь круг (сразу за солнцем) не заливается — там своё свечение диска.
Zazerkalius v0.685 — сканер переделан: «сканер вообще не то делает: просто от середины бита, на который навёл, — линию через центр (ось, солнце) и наружу, и у всех битов и даже частей вырезов покажи, на сколько частей он делит; синими линиями — сам бит, то есть дострой разбивку этого бита на части» и «когда навожу на бит — затемни остальные, которые не участвуют в показе». Теперь одна золотая ось — через середину бита под мышью и центр, в обе стороны до крайнего кольца (строка за чертой). Каждая ячейка, которую она режет, — бит или часть выреза T−1, на любом кольце, и сам бит под мышью, — делится на q равных частей (место оси f = p / q, q до 64): синие черты на 1/q, 2/q…, подпись «÷q»; не сводится к дроби — проценты; ось по границе — точка. Всё, что ось не режет, — под вуалью цветом фона (ось по границе — обе соседние ячейки открыты). Прежние три луча и «p:q» сняты.
Zazerkalius v0.684 — «в режиме T−1, если включено «до 256», — сразу все кольца отобразить с вырезами и местами для битов, симметрично также». Пустые кольца за строкой для заполнения (каждое на ячейку длиннее) в вырезах — как кольца строк: 2n − 1 частей, n мест для бит, вырез n − 1, сдвиг по чётности (чётные — места по центру сверху, нечётные — вырез). На рисунке дуги — только над местами (вырез пустой), черты мест, края выреза золотом; луч в место — ловится, в вырез — идёт к следующему; солнце видит их так же; метки попаданий — по тем же местам (coneVoidCut).
Zazerkalius v0.683 — по снимку солнца в вырезах T−1 — «пусть показывает расходящиеся лучи от солнца, границы, до строки за чертой». Края каждого освещённого сектора — золотые линии: сплошные — от места, где свет вышел (вырез кольца), через кольцо, куда он упал; дальше — бледный пунктир, продолжение той же границы до внешнего края строки за чертой. Сектор во весь круг краёв не имеет, стык сектора через 0° — не край.
Zazerkalius v0.682 — две правки. (1) По снимку ромбового пульта — «сделай подсказки при наведении этим»: у всех кнопок пульта подсказки были, но шли в уведомление внизу по центру страницы (так с v0.294) — от пульта в углу далеко, не видно. Теперь у самой кнопки — плашка с коротким названием (до « — », «: », « (») слева от пульта; полный текст — по-прежнему внизу (#c3tip). (2) Сканер симметрии — «так и не показывает части разделённые; пусть ещё и следующую строку, крайнюю, — в общем все биты делит, которые проходит линия от бита»: лучи идут не на одно кольцо наружу, а через все кольца до крайнего (строка за чертой, если есть), и доли подписаны у каждого задетого бита. Строки 1, 11, 101, 1001, бит 1 кольца 2: кольцо 3 — «1:2», кольцо 4 — «5:1», остальное — в вырезах или по границам (точки).
Zazerkalius v0.681 — по снимку солнца с одной строкой «1» в вырезах T−1 — «в какой момент он будет красить?». Солнце красит сразу, без кручения (при каждой отрисовке), но попадания в кольцо за чертой шли только в счёт Z.voidHits и нигде не были видны: кольцо и строка за чертой показывают Z.fillCells, а туда пишет только лазер (coneClockMark). Теперь и солнце: освещённая ячейка строки за чертой — «1», пустые — «0» (coneSunPaint). Строка «1»: обе ячейки за чертой — «11», протяжка черты вниз в режиме «⌖ лазер» берёт их.
Zazerkalius v0.680 — по снимку сканера («2:1» на кольце за чертой) — «тут надо все части разрезать показать, вот тут на 3 части поделен будет». Лучи сканера, попавшие в один бит, теперь считаются вместе: подпись одна на бит, посередине него, со всеми частями по порядку по часовой — два разреза внутри дают «1:1:1», «1:2:3»… (общий знаменатель до 96, сокращено; иначе проценты). Луч по границе бит — по-прежнему точка (coneScanParts).
Zazerkalius v0.679 — по снимку полосы под чертой — «тут надо возможность отключать Серп 90, и чтобы когда вниз тянуть — заполнялось то, что подсвечено лазером, те биты». Новый способ достройки «⌖ лазер» (Z.cutGen = "las"): кнопка после «маски», и повторный щелчок по горящей «Серп 90» / «30» / «маске» выключает её и включает лазер. Черта вниз — новая строка из строки за чертой: ячейка, где лазер поставил «1» или куда попал луч / свет солнца (счёт попаданий кольца за чертой), — 1, остальные — 0; одна строка за протяжку, сколько бы ни тянул (для следующей лазер ещё не прошёл). Строки из-под черты при «⤒» по-прежнему возвращаются первыми (cutLaserRow в cutAt).
Zazerkalius v0.678 — по снимку края левого меню у вкладки «Лазер» — «так и осталась вертикальная полоса из-за фона». v0.675 брала цвет у края верно по месту, но у холста конуса — его CSS-фон (синий, 23 28 40), а холст сам заливается цветом темы --bg (чёрный, 11 13 18): выемки снова выходили синими. Теперь у холста берётся --bg — выемки того же чёрного, что рядом (paneZig).
Zazerkalius v0.677 — «режим солнца должен работать и на T−1: светит из первой (там 1), через вторую на 3, по расходящемуся». Прежде вырезы при ☀ выключались (coneCutOn требовал «не солнце»). Теперь при вырезах T−1 солнце видит кольца, как луч: кольцо строки — 2n − 1 частей, проход — только его дыра (n − 1 частей), биты — стена и ловят краску; свет из строки 1 идёт расходящимися секторами (угол сохраняется): через дыру кольца 2 на биты кольца 3, через его дыру дальше. Кольцо для заполнения — с вырезом, пустые за ним — сплошные (coneSunCutR в coneSunTrace). На строках 1, 11, 101, 1001: свет 120°–240° сквозь дыру кольца 2 ложится на все три бита кольца 3, его дыра сверху — дальше темно.
Zazerkalius v0.676 — «сделай кнопку — сканер симметрии: навожу на бит в кольце — из него в центр линии от его границ и наружу на 1 уровень, и от его середины также; когда эта линия проходит через другой бит — показать, на сколько частей он его делит». Кнопка «⌖ сканер» — последней в группе «Кольца» (в конце, чтобы номера мест в рисунках групп не сдвинулись; Z.coneScan). При наведении на бит — три луча из центра до внешнего края следующего кольца: границы бита золотом, середина — бирюзой пунктиром. На каждом другом кольце (строки и кольцо для заполнения, с учётом накрутки и вырезов T−1) луч попадает в бит на месте x; доля f = x − ⌊x⌋ подписана рамкой «p:q» — части бита по обе стороны (f = p / (p + q), знаменатель до 48; иначе проценты), луч по границе бит — точка. Кольцо из одного бита (строка 1) не подписывается — круг луч не делит, в дыре выреза бита нет (coneScanDraw / coneScanFrac).
Zazerkalius v0.675 — три правки по снимкам. (1) Край левого меню — «убери лишний фон у всех окон, когда раскрыты, сейчас это Конус, чтобы не было прямой вертикальной линии» (уточнение: «это зубцы левого меню»): выемки зубцов заливались цветом, взятым в 12 px от края и вверх по родителям, — попадал холст или группа внутри окна (синие выемки, а у самого края чёрный фон — прямая черта). Теперь цвет — вплотную к краю, по стопке слоёв (что видно глазом), в девяти точках по высоте, и пересчёт ещё раз после разворота или сворачивания окна (paneZig). (2) Группа «Вид» — «не должно быть такого пустого пространства»: рисунок конструктора помнит кнопки без id по номеру места, а порядок кнопок с тех пор сдвинулся — часть мест рисунка легла на спрятанные элементы (пустой ряд), «👁 выдел.» и «✨ свет» в рисунок не попали и стояли строкой под ним. Теперь спрятанное места не держит, а кнопки вне рисунка идут в поток после него стандартной ширины (tzcApply); рисунок не менялся — по экспорту «💾 Всё» вышло 5 плотных рядов. (3) «В режиме T−1 рисуй кольцо за чертой также с вырезом, и для битов части покажи их все»: кольцо для заполнения в вырезах — 2n − 1 частей, n ячеек своими контурами и вырез n − 1 (золотые края, части пунктиром), сдвиг по чётности, как у колец строк; луч в ячейку ловится, в вырез — идёт к пустым кольцам; щелчок в вырезе ячейки не трогает (coneFillCut / coneFillPart).
Zazerkalius v0.674 — «в конусе, когда лазер T−1, нужно расставить симметрично вертикали: кольца чётные — между центральными битами, нечётные — по средней границе-части выреза». Сама расстановка v0.673 верна (проверено по пикселям: у строк 2, 4, 6 у вертикали середина бит, у 3, 5 — середина дыры), но держалась только без своей накрутки: вход в режим оставлял прежнюю накрутку колец, а ⟲ и ⌖✕ сброс при умолчании ⭐ возвращали накрутку из ⭐. Теперь кольца с вырезом (строки 2, 3, …) встают на 0, общий поворот конуса и фаза кручения — тоже на 0, остановленные кольца отпускаются — при входе в «вырезы T−1» и при каждом сбросе в этом режиме (coneCutHome).
Zazerkalius v0.673 — по снимку колец 1–3 в вырезах — «не располагает: луч лазера — вертикаль вверх, по нему 1; 2 строка — так, чтобы между битами вертикаль; у 3 строки — вертикаль между 2 частями пустоты, и так далее». Начальная расстановка вырезов T−1 (накрутка 0) теперь чередуется по вертикали: у строк 2, 4, … по центру сверху биты (вертикаль между средними битами), у строк 3, 5, … — дыра (вертикаль между средними частями пустоты). Сдвиг в coneCutGeo по чётности строки; луч, мышь, рамки и сообщение о симметрии считают по нему. Сброс ⟲ возвращает к этой расстановке.
Zazerkalius v0.672 — по снимку колец 2 и 3 в вырезах T−1 — «не могу выстроить симметрично, кольцо само докручивается; его бы привязывать к осям симметрии и расположить относительно вертикали симметрично». У такого кольца одна ось симметрии — через середину бит и середину дыры; вертикальна она при накрутке 0 (биты по центру сверху) и n − ½ (дыра по центру сверху), а второе целыми частями не достать — кольцо докручивалось мимо. Теперь кольцо в вырезах встаёт на половины частей, полчасти запоминается (coneRotKeep вместо округления до целого), и сообщение говорит, когда положение симметрично. Остальные кольца — целыми битами, как было.
Zazerkalius v0.671 — «как войти в режим кручения по одному кольцу, для выставления начального уровня?» → «не крутит». Кольцо мышью крутится только с Ctrl (так с v0.248, по слову пользователя), без Ctrl протяжка двигает вид — подсказал. Заодно протяжка в режиме вырезов T−1: шаг был битом, а кольцо там из 2E − 1 частей — теперь поворот целыми частями, по кругу из 2E − 1, и только на вид (строку частью не сдвинуть).
Zazerkalius v0.670 — по снимку поля строк — «дай возможность менять строки прямо там по правому клику на строке». Правый щелчок по строке (биты или номер) — правка на месте, как F2 / Enter (editRowInPlace). Свои правые щелчки у замка, ↻, строки для заполнения и строк под чертой остались как были.
Zazerkalius v0.669 — «вырез тоже покажи разделённым на части»: в режиме вырезов T−1 внутри дыры кольца — границы её E − 1 частей, золотым пунктиром (края дыры — сплошные, как были). Видно, что дыра — те же части, что и биты.
Zazerkalius v0.668 — «почему-то кнопки сброса кручения и лазера делают потом 3D-вид». Причина — своё умолчание ⭐: «⟲ всё на места» (и «⌖✕ сброс», который его зовёт) брал из ⭐ не только положения колец, но и настройки конуса (v0.125) — 3D, октаэдр, свечение, лучи, зеркало, переключатели лазера; ⭐ было запомнено в 3D. Теперь сброс возвращает только положения и кручение (кольца, режим и скорость кручения, замки, оси, Аниматрица); вид конуса и лазер не трогает.
Zazerkalius v0.667 — по снимку вырезов T−1 — «не вижу у 2 кольца выреза в 1 бит; получается, всё кольцо разделить надо на E + E − 1 частей, где E − 1 — это вырез». Вырез v0.665 был только золотой полосой по краю, биты занимали весь круг. Теперь в режиме вырезов кольцо строки из E бит — 2E − 1 равных частей (coneCutGeo): E бит подряд и дыра выреза из E − 1 частей, на рисунке пустая, края золотые. Изначально биты по центру сверху, вырез снизу; накрутка «на бит» — на одну часть. По той же раскладке — расчёт луча, рамки попаданий, бит под мышью (в дыре бита нет), рамка бита под мышью, головки «Звука» и красная стена.
Zazerkalius v0.666 — по снимку конуса с лазером (вырезы T−1, всё в золотых полосах и чёрных ячейках) — «так ничего непонятно, надо биты показать, не надо затемнять, когда включён лазер, где 1, где 0 у строк». С v0.131 при луч-часах ячейки колец гасли в чёрные, а попадания заливались золотом с «1», «11»… — битов строк было не видно. Теперь кольца показывают биты как без лазера, а попадание — золотая рамка ячейки, повторные — «×2», «×3» мелко у внешнего края.
Zazerkalius v0.665 — «ещё режим: изначально расположить вырезы в порядке, как у строк» с уточнением «центры падают между 1–2 и 3–4 четвёртой строки, там 2 бита вырез; у каждой строки вырез = T − 1; у 1 строки выреза нет — пусть мимо идёт; изначально вырезы под битами следующей строки в своих местах». Кнопка «1 щель» стала трёхпозиционной: 1 щель → вырезы T−1 → все щели. Вырезы T−1: строки — треугольник по центру, центры бит строки k на строке k + 1 ложатся на её границы, между крайними k − 1 бит — это вырез кольца k (coneCutWin), дуга в бит следующей строки, изначально под её битами 2…k (стена — у верха, её первый и последний бит), крутится со своим кольцом. Строка 1 прозрачна, затвора и ⌖◁ ⌖▷ не нужно. На рисунке вырез — золотая полоса по внешнему краю кольца и золотые края; прорезей между битами нет.
Zazerkalius v0.664 — после разбора режимов лазера: «понял, в чём ошибка: выход из кольца — одна щель, только на границе между первым и последним битом строки-кольца, а не через каждый бит; нужен такой режим по умолчанию». Новая кнопка «1 щель / все щели» в «Лазере» (Z.coneSlits, по умолчанию — одна): у кольца строки один выход — граница «последний | первый бит», остальные границы — стена; на рисунке прорезь только там. Расчёт луча (coneClockTrace) — для луч-часов, ✺, 🎯 и 🔮 разом; золото и подсветка ближней щели у стены — тоже по одной щели. Не тронуто: вырез-затвор строки 1, кольцо для заполнения и пустые «до 256» (ловят как прежде), ☀ солнце со своим пропуском, 🎵 музыка. Прежнее поведение — «все щели».
Zazerkalius v0.663 — по снимку конуса, весь в золоте от лазера, — «как сбрасывается всё накрученное лазером?». Сброс был в два шага: ✕ у строки для заполнения стирает золото, её единицы, метки пустых колец и отпускает кольца, но кольца остаются где стоят; ⟲ всё на места возвращает кольца, но золото не трогает. «Да» на одну кнопку: «⌖✕ сброс» в группе «Лазер» делает оба шага. Строки поля и лог не трогает.
Zazerkalius v0.662 — по снимку «⌖◁ ⌖▷ ⏸ на проходе» — «тут непонятно, что это, обнови все подсказки». Подсказки всей группы «Лазер» переписаны: значок и имя в начале, «вкл / выкл» у переключателей, что значит «горит» и «не горит», дальше — что делает, по строкам. ⌖◁ ⌖▷ — «довод строки 1»: крутит только кольцо строки 1, пока вырез не встанет под лазер. У «щели» — что от неё зависит (золотые биты, кривизна остановленных колец, предел 0,9 бита). Только текст, поведение не менялось.
Zazerkalius v0.661 — по снимку шапки («🧪 Структура») и окна «🧊 Вид» — «здесь надо не Структура, а это окно, и его надо переименовать как-то». В ряду окон шапки (PIN_WINS) шестым теперь окно строк-лесенок, а «🧪 Структура» вернулась в список «Другое» слева. Окно «🧊 Вид» переименовано в «🧊 Лесенка»: оно рисует каждую строку лесенкой в объёме (1 — вправо, 0 — к себе), а «Вид» путался с одноимённой группой конуса.
Zazerkalius v0.660 — по снимку лазера с кольцом строки 1 из одного бита — «почему у 1 бита 2 щели?», выбран вариант «1»: убрать собственную. У кольца строки 1 при луч-часах были два прохода на рисунке: вырез-затвор (золотые края, v0.139) и напротив него щель бита с самим собой (v0.573). Луч из центра идёт только через вырез (coneClockTrace проверяет лишь его), так что вторая щель ничего не делала и путала. Теперь у затвора строки 1 нет ни щелей между битами, ни черт границ — один вырез. При ☀ солнце выреза нет, там всё как было.
Zazerkalius v0.659 — по снимку «△ Сетки» со сценами 1, 2 — «не вижу»: колец v0.658 не было. triState() зовётся ещё до load(): флаг Z.triRingsV вставал на умолчании вместе с кольцами, потом load() клал сохранённые сцены поверх (Object.assign), а флаг оставался и записывался — кольца больше не добавлялись. Теперь дописываются только после load() (zzLoaded), флаг новый (2), у каждого кольца метка ring — дважды не встанет.
Zazerkalius v0.658 — вопрос «какая минимальная фигура с внутренними зубцами кольцевая?» и «да» на «положить их сценами в △ Сетку». Посчитано перебором: самое малое кольцо — 12 треугольников вокруг одного (зубцы только снаружи, дыра — гладкий треугольник); вокруг шестиугольника — 18 (внутри тоже гладко); зубцы ВНУТРИ даёт только зубчатая дыра, и самая малая — шестиконечная звезда из 12, цельное кольцо вокруг неё — 30 (одни соседи по стороне, 12 штук, рвутся на куски, касающиеся вершинами). Три кольца золотом дописаны в конец сцен один раз (флаг Z.triRingsV) — свои сцены пользователя не тронуты, лишнюю убирает правый щелчок по номеру.
Zazerkalius v0.657 — по снимку ромбового пульта 3D — «эти все стандартного размера, как Дзен», «подсказки там сделай». Ромбы пульта — 40 × 40, как ◎ дзена и кнопки записи (были 34). Подсказки всех ромбов переписаны: значок в начале, что делает, «держи — дальше» у повторяющихся и «только в 3D» у тех, что в плоском виде тусклые; ⠿ — ручка пульта (тянуть, двойной щелчок — в угол).
Zazerkalius v0.656 — по снимку «Лазер» над прижатым «Звуком»: «убери отступ, который мешает зубцами синхронизироваться группе кнопок, когда прижата к верхнему меню, и фон у всех окон убери, чтобы не было вертикали, также и у поля строк». Полоса вкладок групп: снизу было 4 px поля и 4 px между рядами вкладок — теперь ряды шагом 24 px (25 с заходом −1, как кнопки), снизу поля нет. Полоса групп конуса под вкладками стояла с отступом 34 px (остался с v0.154, когда вкладок ещё не было) и 4 px между группами — теперь вплотную: группы идут прямо под вкладками и друг под другом, их высоты — по 24 px, поэтому каждая встаёт на ряд сетки зубцов левой панели (проверено: все шесть — на сетке, расхождение полпикселя). Плавающая группа, которую тянут, по вертикали тоже встаёт на ряды сетки — шагом 24 px от низа полосы вкладок. Окна и поле строк — фоном страницы (прежде свой, светлее: --panel у окон, --fieldBg у поля), граница между ними и зубцами больше не читается вертикалью.
Zazerkalius v0.655 — по снимку пульта 3D у холста конуса и образцу ромбового пульта — «пересобери в ромбовид». Пульт теперь из ромбов 34 × 34, касающихся сторонами (решётка, повёрнутая на 45°), своей подложки и рамки у него нет. ⌂ вид по умолчанию — в середине; ▲ ▼ (наклон) и ⟲ ⟳ (поворот) — по сторонам света, через клетку; вплотную к ⌂ — зелёная ↺ «всё на места», + и − (масштаб) и ⠿ ручка (тянуть пульт, двойной щелчок — на место); сверху 🧊 3D и ⧗ зеркало, снизу ▶ крутить (⏸ — пока крутит) и направление ↻ / ↺. Ромбы — как у дзена и записи: рамка цветом акцента, тёмная середина; включённое (🧊, ⧗, ▶) — золотом. В плоском виде кнопки 3D, как прежде, тусклые. Место каждого ромба задано в разметке (--x, --y).
Хаб v0.076 — по снимку «Сцены 1» из «△ Сетки» Zazerkalius (надпись из треугольников) — «в хаб надо как-то закинуть». Надпись встала на прежнее место заголовка хаба — сверху, над нотами (ряд под неё был оставлен ещё с v0.038, сама надпись снята в v0.039). Те же 126 треугольников из сцены 1 — маской (SVG; каждый треугольник чуть сжат к своему центру — между ними швы), заливка — та же переливающаяся радуга, что была у прежней надписи, с тенью. Не нажимается и кнопкам не мешает.
Zazerkalius v0.654 — по снимку ромба 🔗 — «правой кнопкой сохраняет текстовый файл со ссылкой». Правый щелчок по 🔗 — та же ссылка на всё состояние страницы, но не в буфер, а файлом zazerkalius-ssylka-ГГГГММДД-ЧЧММ.txt в «Загрузки»: одна строка. Открыть — скопировать её в адрес браузера.
Zazerkalius v0.653 — два вопроса. «Почему при F5 сначала показывает старый дизайн?» — ромбы, цепочки, зубцы границы и раскладку групп ставит zz-ui.js, а он большой (11 тысяч строк) и начинает работать, когда браузер уже нарисовал обычные прямоугольные кнопки из HTML: секунду-другую виден «старый» вид. Теперь шапка страницы сразу делает её прозрачной (html.zzload, opacity 0 — раскладка при этом считается как обычно), а скрипт снимает прозрачность, когда закончил: шрифты загружены и прошло три кадра на пересчёт. Если скрипт упал — прозрачность снимается сама через 8 с. «Пусть Гамма меняет цвет заголовка Zazerkalius» — надпись из треугольников теперь цветом единиц выбранной гаммы (--b1): Янтарь — золотой, Океан — голубой, Роза — розовый…, «Своя» — свой цвет единиц.
Zazerkalius v0.652 — по снимку окна «▲ Пирамида Паскаля» у левой панели: «тут дополнительный фон у Паскаля убери, и возможность без 0 биты показать». У холста пирамиды был свой фон (--panel2) со скруглёнными углами — темнее окна, отдельным прямоугольником; теперь холст прозрачный, под ним фон окна. Запись видео берёт фон окна сама (recBg). Новая форма точек 1 — биты без нулей: только единицы цифрами (рядом с «1 0», где нули бледнее).
Zazerkalius v0.651 — «Паскаль должен строить из строк, а не по-своему». Пирамида Паскаля по умолчанию берёт строки поля верхним этажом (выделенные, если их ≥ 2), а не свою «1»: строки поменялись — пирамида перестроилась. У всех, у кого был выбран «от 1», один раз переключено на строки (по прямому слову); дальше — как выберут. В списке первым — «из строк поля», затем «от текущей строки», последним — «от «1» — Серпинский».
Zazerkalius v0.650 — по снимку цепочки ◎ ● mp4 ↻1 ▣ внизу левой панели — «надо сохранять ссылкой, кнопку сюда». В цепочке новый ромб 🔗: всё состояние страницы (строки всех полей, окна, конус, лазер, сетка, настройки — Z целиком, кроме ⭐ умолчания, оно копия) — одной ссылкой в буфер обмена. Внутри: JSON → сжатие deflate (CompressionStream браузера) → base64url после #z= в адресе. С localhost и с диска ссылка всё равно ведёт на 1001100.online. Открыли ссылку: шапка видит #z=, страница раскрывает её (это не мгновенно), кладёт в sessionStorage и перезагружается — второй раз состояние берётся как пресет (?preset=…): память гостя не читается и не пишется (на первом, раскрывающем, открытии — тоже), в заголовке вкладки — «по ссылке от …». Вставили ссылку в адрес той же вкладки (браузер такую не грузит) — страница перезагружается сама. Проверено в чистом браузере: строки, сетка и прочее — как у отправителя, его память не тронута. Длиннее 60 000 знаков — сказано, что мессенджер может обрезать, надёжнее «💾 В файл».
Zazerkalius v0.649 (вместе с v0.648, одним заходом) — два снимка. «▲ Пирамида Паскаля»: «надо кнопку — зеркало вниз всей фигуры, и кнопки все покажи эти, и добавь точки — мелкие шарики, и чтоб чисто грани, если кубы или треугольники, — вид такой». Формы точек — теперь каждая своей кнопкой (● · ▲ ■ ◆ 1 0, горит выбранная) вместо одной по кругу; новая — · мелкие точки (видно насквозь всю структуру). ▱ грани — шарики, треугольники, кубы и ромбы одной обводкой, без заливки (каркас). ⇣ зеркало — под основанием та же пирамида, отражённая остриём вниз, вместе — бипирамида (и каркас штрихом тоже); середина вида — плоскость основания. Свёрнутая левая панель (столбик значков): «поправь синхрон с зубцами границы» — кнопки шли через 27 px (промежутки 3 px, поля и черта-разделитель блоков); теперь ровно по 24 px вплотную от сдвига зубцов — каждая кнопка на свой зубец, проверено по всем; между кнопками шов в 1 px. Колесо и в столбике листает по одной кнопке.
Zazerkalius v0.647 — по снимку выделенной «Z» в «△ Сетке» — «так, когда выделить надо — Ctrl, несколько, и цвет менять у выделенных». Ctrl + щелчок инструментом ☝ добавляет группу к выбранным или снимает её (Shift — как прежде, тоже). Пока ☝ горит и есть выбранные группы, щелчок по цвету палитры перекрашивает их все этим цветом — одним шагом ↩; инструмент остаётся ☝, выбор — тот же. Без выбранных групп палитра, как прежде, выбирает кисть.
Zazerkalius v0.646 — по снимку «▲ Пирамиды Паскаля»: «всё в ромбовидные кнопки, и менять шарики на треугольники, кубы, ромбы в построении и на биты 1, 0». Полоса инструментов окна — цепочкой из треугольников (lpTools, класс .tools.lpw — любое окно можно перевести так же): список, ползунки с подписью, галки (включённая — заливкой, без квадратика), кнопки; первая в ряду — остриём, следующие — выемкой на остриё соседки, ряды вплотную; перенос на новый ряд начинает его остриём. Новая кнопка ● шарики — форма точек по кругу (правый щелчок — назад): ● шарики → ▲ треугольники (остриём вверх, лицом к зрителю: в плоскости этажа при малом наклоне выходили щепки) → ■ кубы (видимые три грани, тремя оттенками, крутятся с пирамидой) → ◆ ромбы → 1 0 биты (единицы цифрами, нули тоже — бледнее, на своих местах). Совсем мелкие точки — квадратиками, как прежде. Форма запоминается.
Zazerkalius v0.645 — по снимку «▲ Пирамиды Паскаля», развёрнутой у левой панели: «у окон левую границу надо как-то убрать и продолжить фон под меню, чтобы не было вертикали». Своей левой рамки у развёрнутого окна нет — вертикалью была полоса прокрутки стола: она стояла у его левого края, вплотную к зубцам панели, и читалась границей окна. Теперь полоса — у правого края стола (у поля строк). Выемки между зубцами границы заливались фоном страницы, темнее окна, — теперь цветом того, что справа от панели (окно на столе — его фон; берётся тот цвет, что чаще на трёх высотах), и фон окна продолжается под зубцы.
Zazerkalius v0.644 — по снимку узкой левой панели с обводкой: «надо сузить название, чтобы в минимальную ширину левого меню влезло, или уменьшить масштаб», «у меню посмотри границы кнопок — где-то не видно», «стрелка сворачивания криво встала». Надпись в шапке — не шире левой панели (за вычетом значка Хаба): при узкой панели она мельче, при широкой — 222 px, как была. Нижняя черта последнего ряда кнопок раздела (ряд 25 px с заходом −1) после v0.638 ложилась под заголовок следующего раздела и пропадала — кнопки теперь рисуются поверх заголовков. ‹‹ (сворачивание панели в столбик) стояла на 4 px от верха, а ряды с v0.638 сдвинуты на сдвиг зубцов — теперь она на высоте первого ряда.
Zazerkalius v0.643 — по снимку «△ Сетки» — «тут надо, чтоб отмена, повтор работали». Правки сетки — шаги в общих ↩ / ↪ (и Ctrl+Z / Ctrl+Y), вперемешку с правками строк, по порядку: закраска и ластик (протяжка — один шаг), ✦ точка, ╱ линия, перенос групп ☝ (шаг — как только группа сдвинулась, простой выбор шагом не считается), обводка / сетка внутри / символ выбранной группы (правки одним движением — поле цвета, набор символа — в пределах 1,5 с один шаг), «как было» у группы, «✕ очистить» и открытая сцена (↩ вернёт то, что было в сетке). Шаг хранит снимок сетки целиком: закраска, настройки групп, точки, линии, выбор. Замок строк 🔒 шаги сетки не держит. Подсказка ↩ теперь говорит про сетку тоже.
Zazerkalius v0.642 — по снимку надписи «ZAZERKALIUS», выложенной треугольниками в «△ Сетке» (сцена 1, текст из «⧉ в буфер»), — «примерно так можно заголовок HTML?». Название в шапке теперь эта надпись: те же 126 треугольников в 4 ряда, вектором (SVG), залиты золотом, швы между треугольниками — цветом фона, как в сетке; высота 20 px. Номера из текста сцены переведены в места сетки (ряд, место) по правилу «номер = ряд · 216 + место + 1». Для чтения экраном у надписи остаётся текст «Zazerkalius». Щелчок по ней, как прежде, перезагружает страницу, а в «◯ Конусе» отдельно (?solo=cone) надпись — ссылка на всю страницу.
Zazerkalius v0.641 — по снимку надписи «ZERKALIUS», выложенной треугольниками в «△ Сетке», — «сделай, чтобы можно было перемещать выделенные группы цветов». Инструментом ☝ (или Alt + щелчок любым) группу теперь можно не только выбрать, но и сразу потянуть: выбранные группы едут по сетке целиком. Shift + щелчок добавляет группу к выбранным или снимает её — так двигается несколько букв разом. Сдвиг всегда такой, что треугольник остаётся той же ориентации (ряд + место — чётное число): иначе вверх смотрящие стали бы вниз смотрящими и буква развалилась бы. Нечётный сдвиг под мышью поправляется на соседнее место, ближнее к мыши. За край сетки группы не уводятся. Пока тянешь, всё, что лежало под ними, на месте; где отпустил — там группы встают поверх. С группой едут её обводка, «сетка внутри» и символ. Точки ✦ и линии ╱ стоят в узлах и рёбрах и не двигаются. Попутно: место, откуда тянут, берётся уже после выбора — строка «группа», появляясь над сеткой, сдвигает холст на ряд, и без этого группа прыгала.
Zazerkalius v0.640 — по снимку свёрнутой левой панели (столбик значков) — «поправь ромбоид для числа». Поле «16» (высота ▲ нарезки) в столбике оставалось прямоугольником со скруглёнными углами: ромбоид из v0.633 строится только в развёрнутой панели. Теперь и в столбике это такой же шестигранник, как кнопки рядом, — 24 px, острия по бокам, заливка акцентом; само поле прозрачное, цифры посередине, без стрелок-счётчиков (число — набором с клавиатуры или стрелками ↑ ↓ в поле).
Zazerkalius v0.639 — по снимку заголовка «Другое» — «сделай скрываемой группой, как все». Список окон «Другое» теперь сворачивается щелчком по заголовку, как остальные разделы левой панели, и свёрнутость помнится. Раньше его заголовок не трогался: его показывает и прячет код — смотря, есть ли в списке окна. Теперь показ остаётся за кодом, а свёрнутость — за щелчком. Скрытые кнопки шести окон шапки работают и при свёрнутом списке.
Zazerkalius v0.638 — по снимку «Построений»: «подгони стандартные высоту кнопок и отступы, чтобы все вписались изначально в зубцы границы, а потом сделай скролл ступенчатым по зубцам — одна кнопка скролл». Ряды левой панели теперь идут вплотную по 24 px: у заголовков разделов снят отступ 4 px сверху, у блоков кнопок — 4 + 1 px. Весь столбец сдвинут сверху на тот же сдвиг, что и зубцы границы (по вкладкам конуса, v0.636), и остриё каждого ряда приходится на остриё границы; проверено по всем 45 рядам. Колесо над панелью листает ровно на один ряд за щелчок, и место всегда кратно ряду. Листнули иначе (пальцем, клавишами) — по остановке панель встаёт на ближайший ряд. Светящиеся ▲ ▼ листают тоже целыми рядами. Список окон «Другое», если он длинный и листается сам, колесо листает как прежде.
Zazerkalius v0.637 — по снимкам кнопок записи (● mp4 🎞 ↻1 ▣) и шапки окон: «поставь под меню, где стоит Дзен, и пусть они работают на любое открытое окно», «и подсказки обнови». Кнопки записи ушли с холста конуса вниз левой панели: вместе с ◎ дзена это одна цепочка ромбов — ромбы касаются сторонами, каждый следующий на полромба правее и попеременно на полромба выше. Низ панели под неё — 72 px вместо 48. В дзене панели нет — цепочка записи стоит в левом нижнем углу экрана. ⏺, mp4 и ▣ теперь берут верхнее из открытых окон с холстом (поднятое последним; из шапки — нажатое): ◯ Конус, ◆ Гранидус (холст из его рамки), ✦ Развёртку, △ Сетку, ▲ Паскаля, 🧊 Вид. Окно берётся в миг старта и пишется до стопа, имя файла — по окну (Zerkalius-piramida-…, -setka-…, -granidus-…). Рамка ▣ встаёт у этого окна, вверху рамки — его имя и размер кадра. 🎞 и ↻1 крутят сам конус, поэтому они, как прежде, только для конуса — это сказано в их подсказках. Подсказки и сообщения переписаны под любое окно.
Zazerkalius v0.636 — два снимка. Про границу левого меню: «нет, граница пусть стоит, просто подвинь её так, чтобы кнопки эти (вкладки групп конуса) в неё вписались, а кнопки левого меню — пускай не всегда». Зубцы по рядам панели из v0.635 сняты: граница снова ровная сетка по 24 px и стоит на месте. Сетка сдвинута по высоте так, что остриё приходится на середину полосы вкладок «Лазер · Кручение · …» — оно входит в выемку «Лазера», а при переносе вкладок на второй ряд — и в выемку второго ряда. Сдвиг пересчитывается, когда вкладки могут уехать: листание стола, смена размера окна, отпущенная мышь. Про «Кручение — границы обводки»: у группы, растянутой ручкой, короткие ряды не доходили до рамки на 5–13 px, и справа шли две ломаные — острия кнопок и рамка. Ряд добирался только целыми сторонами треугольника; теперь остаток отдаётся долей крайней кнопке, как в левой панели, и острия всех рядов стоят у рамки. Ромб-ручка встаёт по остриям рядов, а не по краю коробки группы, и за рамку не торчит.
Zazerkalius v0.635 — по снимку «Оформления» у края левой панели: «отступ сверху для меню, чтобы вклинились зубцы». В v0.634 зубцы шли ровной сеткой по 24 px от верха панели, а ряды — со своими отступами: заголовок раздела начинается на 4 px ниже, между разделами ещё 4 + 1 + 4 px. Поэтому острия рядов попадали мимо выемок. Теперь зубец рисуется у каждого ряда панели (кнопки и заголовки разделов): остриё — на середине ряда, между разделами — прямая черта. Рисунок строится во всю высоту листаемого содержимого и листается вместе с рядами; пересобирается вместе с раскладкой панели (свернул раздел, сменил тему, поменялись ряды).
Zazerkalius v0.634 — два снимка. «Кручение — поправь границы»: под кнопками этой группы есть ещё строка «вариантов цикла» (не из треугольников), а ромб-ручка размера искал нижний ряд только среди кнопок и вставал на третий ряд, поверх зубца рамки. Теперь нижним рядом считается и эта строка, и ромб стоит в правом нижнем углу группы. «Сделай ромбовидной вертикальную границу левого меню»: прямая черта справа от левой панели заменена зубцами из тех же треугольников — ряд 24 px, остриё вправо посередине ряда, выемка на стыке, глубина t, как правый край групп. Зубцы нарисованы фоном панели у её правого края, поэтому стоят на месте, пока панель листается; за линией — фон страницы. Цвета берутся из темы и пересобираются при её смене. На телефоне панель стоит сверху — там граница прежняя.
Zazerkalius v0.633 — по снимку «Нарезать треугольник» (✂ ▲ 16) — «для выбора числа также ромбовидный». Поле высоты «16» стояло в ряду прямоугольником, своей шириной. Теперь оно — в ромбовидной подписи, как кнопки ряда: остриё на краю ряда, цифры посередине, само поле прозрачное и без рамки. Ширина у него постоянная: поле тянется по подписи, и мерить его, как надпись кнопки, нельзя — при каждом пересчёте оно росло бы.
Zazerkalius v0.632 — по снимку инструментов «△ Сетки» (☝ ✦ ╱ ⌫): «сделай настройку обводки — жирн и нет»; на вопрос выбрано — линии ╱ в сетке. В верхней строке окна, рядом с «═», — ▬ жирн: горит — все линии ╱ рисуются вдвое толще своей «═» (в сетке, в живом виде кнопок и в группах конуса, где линии — обводка группы); ещё щелчок — обычные. Толщина, записанная у каждой линии, не меняется: это только вид, поэтому переключать можно сколько угодно без потерь.
Гранидус v0.070 — по снимку окна «◆ Гранидус» в Zazerkalius, где раздел «⟳ Вращение» лёг поверх «🎲 Картины»: «окна друг на друга не ставим». Плавающий раздел больше не ложится на другой. Отпустил его на чужом месте или показал вкладкой, а место занято — он сам уходит на ближайшее свободное: вплотную к соседу (справа, слева, снизу, сверху) или по сетке через 12 px, в пределах окна. Прилипшие снизу едут вместе с ним. При открытии и при смене размера окна разделы, лёгшие друг на друга, разводятся на экране, но сохранённая раскладка переписывается, только когда раздел тронут руками.
Zazerkalius v0.631 — по снимку списка «Окна» слева: «переименуй — Другое, и убери из них дубликаты, что в верхнем меню теперь всегда». Список назван «Другое», и шести окон шапки (◯ Конус, ◆ Бирамида, ✦ Развёртка, △ Сетка, ▲ Паскаль, 🧪 Структура) в нём больше не видно. Их кнопки в списке не удалены, а скрыты: через них шапка сворачивает окна и показывает нажатое, и эту механику ломать незачем.
Zazerkalius v0.630 — по снимку: «✦ Развёртка» открылась из шапки, но в своём прежнем размере — «разворачивать сразу на все поле». Кнопка окна в шапке теперь, кроме того что сворачивает остальные пять, ставит нажатое окно на весь стол — тем же ⛶ из шапки окна (соседи уходят ниже, ⛶ горит, повторный ⛶ возвращает прежнее место). Если окно уже развёрнуто во всю ширину, его не трогаем: иначе ⛶ сработал бы наоборот и вернул его назад.
Zazerkalius v0.629 — по снимку шапки (◯ Конус · ◆ Бирамида · ✦ Развёртка · △ Сетка · ▲ Паскаль · 🧪 Структура): «если нажать — пусть либо-либо переключает: только одно окно оставляет, и сразу развёрнутым». Щелчок по любой из шести кнопок разворачивает и показывает это окно, а остальные пять из них сворачивает; горит одна кнопка. Окна вне этих шести не трогаются.
Zazerkalius v0.628 — «по проходам за шаг есть?» → «да, и в автоплей по проходам тоже». Рядом с «🌊 аниматрица» в окне пирамиды — «▷| проход»: один щелчок — один проход волны по всем этажам (идущий автоплей при этом встаёт). Автоплей и так идёт целыми проходами, по 6 в секунду; теперь на его кнопке, пока идёт, — «⏸ проход N», а на «▷|» — номер прохода от исходной пирамиды.
Zazerkalius v0.627 — «Паскаль — надо там Аниматрицу крутить». В окне «▲ Пирамида Паскаля» — кнопка «🌊 аниматрица»: по каждому этажу пирамиды (а этаж — треугольник) идёт волна, как в «Аниматрице»: строка переписывается операцией с уже переписанной строкой над ней, бит сверху берётся по углу, операция — та, что выбрана в «Аниматрице» (XOR по умолчанию). Шесть проходов в секунду, пирамида меняется на глазах; можно одновременно ⟳ крутить. «⤓ этаж в строки» берёт этаж таким, каким он стал. Вернуть исходную пирамиду — сменить «этажей» или затравку.
Zazerkalius v0.626 — по снимку кнопки «⤓ этаж в строки» (окно «▲ Пирамида Паскаля»): «класть с первой строки, а то, что было, — удалить». Этаж больше не вставляется под текущей строкой: он заменяет всё поле строк, начиная с первой; прежние строки убираются (↩ вернёт).
Zazerkalius v0.625 — по снимку поля строк с треугольником: «всегда при изменении строк — скроллить в середину видного поля, по первой строке, первому биту». Как только меняется число строк или их длина (достроил, срезал, заготовка, шаблон, другое поле), поле прокручивается по ширине так, что первый бит первой строки стоит посередине видимой части. Смена одних битов (волна Аниматрицы, щелчки по битам) прокрутку не трогает — иначе её было бы не сдвинуть рукой.
Zazerkalius v0.624 — по снимку кнопки «◆ Гранидус» в шапке: «Бирамида». В шапке кнопка этого окна — «◆ Бирамида»; само окно и список «Окна» слева — пока «◆ Гранидус».
Zazerkalius v0.623 — по снимку шапки справа от «🧪 Структура»: «какие-то скроллы тут». Это была полоса прокрутки ряда кнопок окон в шапке (тонкая, со стрелками ▲ ▼). Полосы больше нет ни при каких размерах; ряд в шапке и так не обрезается (v0.621).
Zazerkalius v0.622 — по снимку кнопки «▲ Пирамида Паскаля» в шапке: «Паскаль». В шапке кнопка окна — короче, «▲ Паскаль»; само окно и список «Окна» слева называют его по-прежнему полностью.
Zazerkalius v0.621 — по снимку «📌 ◯ Конус» в шапке: «(закреп)конус)». 📌 — остриями с обеих сторон, «◯ Конус» — выемкой слева, в которую входит остриё 📌, и остриём справа. Так и было задумано, но ряд кнопок окон обрезал по своему краю левый заход «Конуса» на 📌, и стык не сходился; теперь ряд не обрезает.
Zazerkalius v0.620 — «только этих» (по тому же снимку списка): в шапке — не все окна, а шесть: ◯ Конус, ◆ Гранидус, ✦ Развёртка, △ Сетка, ▲ Пирамида Паскаля, 🧪 Структура, в этом порядке; закреплённые 📌 из них второй раз не повторяются, прочие закреплённые кнопки — как были.
Zazerkalius v0.619 — по снимкам списка «Окна» и шапки: «эти все — дублируй в верхнее меню». В шапке после закреплённых 📌 кнопок — кнопки всех окон, как в списке слева: горит — окно развёрнуто на столе; щелчок по горящей — свернуть, по тёмной — развернуть, поднять и показать. Закреплённые окна второй раз не повторяются. Кнопки сами следят за окнами.
Zazerkalius v0.618 — по снимку раздела «Окна»: «у групп не скрывать внутри группы — только всё целиком скроллить». Список окон больше не листается сам внутри раздела: все разделы левой панели — во всю свою высоту, листается вся панель целиком (колесо мыши, светящиеся ▲ ▼).
Zazerkalius v0.617 — три правки. «Осталась граница» (по снимку левого края группы при выключенной ▱): обводка кнопок цветом фона ложилась по внешнему краю группы тёмной каймой; без обводки группа теперь обрезается на эти 2 px по всему контуру — швы между кнопками остаются, каймы нет. «Стрелки при скролле пусть перекрывают и не дают там нажать кнопки»: ▲ ▼ левой панели — сплошные, кнопки под ними не видны и не нажимаются. «Стрелки только две — вверху и внизу»: у списка окон своих ▲ ▼ больше нет — его листают те же две стрелки панели.
Zazerkalius v0.616 — по снимку шапки «Zazerkalius ◯ Конус»: «при клике на заголовок Zazerkalius — переход из соло-режима». На странице одного конуса слово «Zazerkalius» в шапке — ссылка: щелчок открывает всю страницу (тот же адрес без ?solo=cone), с полем строк, окнами и панелями; при наведении подсвечивается. У страницы конуса и у всей страницы настройки по-прежнему свои.
Zazerkalius v0.615 — по снимку правого края группы: «границы группы и кнопки наложить друг на друга». Острия кнопок кончались на 1,2–1,8 px левее края группы: ширина группы — целое число пикселей, а кнопки — из дробных треугольников; с линией рамки выходила видимая щель. Теперь правый зубчатый край рамки идёт ровно по остриям кнопок (проверено по всем группам — совпадает до сотых пикселя).
Zazerkalius v0.614 — по снимку «🎨 Гамма · ▱ обводка · ☀ Светлый» в шапке: «убери в левое меню, в верх; по умолчанию и в мобильной — Тёмный, без обводки». Три кнопки ушли из шапки в левую панель — первым разделом «Оформление», над «Страницей целиком»; в столбике значков — тоже. Тема по умолчанию теперь тёмная везде, и на телефоне (прежде шла за системой); выбранная руками — помнится, как раньше. Обводка по умолчанию и так выключена.
Zazerkalius v0.613 — по снимку «🔴 неп. ⇄ · 🟢 неп. ⇄🔁» в «Виде»: «выровняй ширину у этих малых кнопок». По размеру они и были одинаковы (по 91 px), но в цепочке остриё первой входит в выемку второй, и у первой видно на t (≈7 px) меньше. Первая теперь шире ровно на t — видимые части одинаковые. Для таких случаев у кнопок групп появилась пометка data-tzadd (на сколько t шире).
Zazerkalius v0.612 — «подсвечивай, когда есть что отменять, повторять». ↩ в шапке горит, пока есть шаги назад; ↪ — пока есть отменённое, что можно вернуть. Новая правка повторы стирает — ↪ гаснет.
Zazerkalius v0.611 — по снимку ↩ ↪ в шапке: «посередине горизонтали браузера». Стрелки «отменить» и «повторить» стоят ровно посередине шапки по ширине окна браузера, остальные кнопки — где были. На узком экране (телефон) — как прежде, в общем ряду.
Zazerkalius v0.610 — по снимку ◎ и ромбов записи: «подсказки проверь». Сверены с кодом. ◎ Дзен: значок теперь ◎, а не 🧘; дописано, что дзен — во весь экран браузера и что группы, отмеченные 🧘, остаются у конуса. ⏺ и mp4: наведение показывает рамку кадра, при записи рядом появляется ⏸. ↻1: названия режимов были старые («Всё целиком», «по биту») — теперь «Всё», «Встреч Стр», «Каждое», «Встреч Бит». 🎞, ⏸ и ▣ — верные, не менялись.
Zazerkalius v0.609 — по снимку низа страницы (◎ дзена слева и ромбы записи на конусе): «по вертикали выровняй». Ромб дзена теперь стоит на одной высоте с полосой кнопок записи на холсте конуса, когда она у низа экрана; окно конуса двигают или тянут — ромб подстраивается. Если полоса записи далеко, ромб — как был, у низа панели.
Zazerkalius v0.608 — по снимку «Лазера» поверх «Аниматрицы»: «группы не могут найти себе место и дёргаются туда-сюда по вертикали» и «не дай группам наезжать на кнопки меню». Дёрганье: раз в 0,3 с наложенные группы расталкиваются (v0.558); если подходящего места рядом не было, группу всё равно сдвигало, а потом её возвращало в пределы окна — она снова налезала, и так по кругу. Теперь двигается только туда, где есть место, иначе стоит. И верх, выше которого группа не встаёт, теперь — под полосой вкладок: группы на вкладки больше не заезжают. На странице одного конуса и полоса групп начиналась от самого верха, под вкладками; теперь она опущена на высоту полосы вкладок.
Zazerkalius v0.607 — по снимку «проход 0 · волна 0/8» поверх первой строки: «убери в самый низ поля». Счёт волны Аниматрицы стоял справа у первой строки и наезжал на неё; теперь он у нижнего края поля строк, справа.
Zazerkalius v0.606 — по снимку полосы вкладок и «Лазера» рядом с ней: «на уровне полоски меню невозможно захватить заголовок группы». Полоса вкладок (v0.593 — поверх групп) тянулась на всю ширину окна конуса и забирала щелчки и в пустом месте справа от вкладок. Теперь щелчки ловят только сами вкладки, пустое место полосы пропускает их к группе под ней — заголовок группы на этой высоте снова хватается.
Zazerkalius v0.605 — по снимку «Кручения»: «сюда кнопку — кручение побитно: один шаг — один бит крутится в каждом кольце». Новая кнопка «▦ побитно» рядом со скоростью: ▶ крутить идёт не плавно, а скачками — за шаг каждое кольцо поворачивается ровно на один бит, шагов в секунду — столько, сколько бит/с на ползунке. Включённая во «Всё» или «Встреч Стр» сама переводит кручение в «Каждое»; «Встреч Бит» тоже идёт скачками. Ещё раз — снова плавно.
Zazerkalius v0.604 — две правки. «(выдел)лучи(все)»: лучи к центру в группе «Вид» — сцепка из трёх: «выдел.» и «все» — шестигранники с остриями с обеих сторон, «✳ лучи» посередине — с выемками, в которые они входят. «Лучи» включает и выключает (помнит сторону), «выдел.» / «все» выбирают, от каких колец, и при выключенных лучах включают их; горят «лучи» и выбранная сторона, выключены — гаснут все три. И по снимку кнопок записи на холсте — «ромбами, как дзен»: ● mp4 🎞 ↻1 ⏸ ▣ — ромбы 40 × 40 с тонкой рамкой акцента и тёмной заливкой, как ◎ дзена; ⏺ — красным, идущая запись — золотом.
Zazerkalius v0.603 — по снимку низа столбика значков: «дзен накладывается на кнопки». В столбике значков панель листается, а ромб дзена был приколот к ней изнутри — ехал вместе с кнопками и ложился на них. Теперь ромб стоит на месте у низа панели, а нижняя полоса панели под ним срезана: кнопки при прокрутке уходят под её край, а не под ромб; ▼ светится над ромбом, пока ниже что-то есть.
Zazerkalius v0.602 — по снимку всей страницы: вкладка «ТЕКСТ» горит, а окна текста нигде нет. Причина — слои: у окон номер слоя растёт с каждым щелчком по ним, и окно конуса со временем уходило выше окна текста (у того был постоянный 900) — текст открывался, но под конусом. Теперь окно текста всегда выше всех окон.
Zazerkalius v0.601 — по снимку столбика значков: «всё равно показывает скролл». Родную полосу прокрутки левой панели v0.599 спрятала, но у панели с v0.270 есть ещё своя — тонкая полоса у левого края (её ставили, чтобы полоса не стояла вплотную к номерам строк). Эта своя полоса для левой панели снята; листать — колесом и светящимися ▲ ▼.
Zazerkalius v0.600 — «если кнопкой скрыть — потом не появляется» (окно текста конуса). В проверке окно пряталось и открывалось и на главной, и на странице одного конуса; не видно его бывает, когда оно сохранено свёрнутым до заголовка (полоса с пустой коробкой) или откреплено и стоит в стороне. Теперь «📝 Текст» всегда открывает его развёрнутым и в правом верхнем углу конуса; свёрнутое — одна полоса заголовка, без пустой коробки.
Zazerkalius v0.599 — по снимку столбика значков левой панели: «убери скролл слева, сделай светящиеся стрелки вверх-вниз, если уходят из видимости». У левой панели больше нет полосы прокрутки. Когда кнопки ушли за верх — над панелью светится ▲, за низ — ▼ (над ромбом дзена), так же, как у списка окон; щелчок по стрелке листает на три четверти высоты, колесо мыши — как прежде.
Zazerkalius v0.598 — «„Текст“ так и не появляется окно» и следом «может, просто в поле конуса текст писать — сверху справа». Приколотое окно текста конуса и лога лазера вставало вплотную под окном конуса, а оно обычно тянется до низа экрана — и текст уезжал за край. Теперь оно стоит поверх самого холста, в правом верхнем углу: шириной до 45 % холста, высотой не больше 70 %, полупрозрачное, ходит за конусом. Открепить и поставить куда угодно — по-прежнему, потянув за заголовок.
Zazerkalius v0.597 — по снимку столбика значков левой панели: «тут отступы поправь». Между кнопками — по 3 px, и от черты раздела до первой и последней кнопки — тоже по 3 px (было 6: разделы стояли вдвое дальше друг от друга, чем кнопки внутри). Стрелка вверху — на 4 px от края.
Zazerkalius v0.596 — по снимку «Страница целиком» и стрелки сворачивания левой панели: «стрелка криво лежит». В v0.592 заголовки разделов поднялись на 4 px от верха, а стрелка осталась на 8 — встала на 4 px ниже первого заголовка. Теперь она вровень с ним.
Zazerkalius v0.595 — по снимку «слева · строки · справа»: «строки и справа — обе подсвечены, либо вообще все три выключены, когда скрыты». Поле строк видно — горят «строки» и сторона, где оно стоит; спрятано — гаснут все три. Щелчок по «слева» / «справа» при спрятанном поле сперва его показывает (и ставит на эту сторону).
Zazerkalius v0.594 — по снимку свёрнутой левой панели (столбик значков): «эти кнопки тоже в ромбоид». В столбике значков каждая кнопка — шестигранник с остриями по бокам, как кнопки из треугольников, 24 px высотой, без рамки и скруглений; горящая (⭐ и др.) — ярче. Между кнопками — по 3 px.
Zazerkalius v0.593 — «?solo=cone — Текст, кнопка не работает». На странице одного конуса плавающие группы лежали поверх полосы вкладок, и щелчок по «📝 Текст» доставался группе под ней. Полоса вкладок теперь всегда над группами — «Текст» и вкладки групп щёлкаются.
Zazerkalius v0.592 — по снимку заголовков левой панели: «тут отступы и высоты стандартизируй». Заголовки разделов — 24 px, как ряд кнопок; между заголовками, между заголовком и его кнопками и после кнопок до следующего заголовка — везде по 4 px (было 8 над заголовком, 2 под ним и 8 после кнопок).
Zazerkalius v0.591 — по снимку «⇆ строки справа · ▭ поле строк»: «(слева(строки)справа) — вот так, включена либо-либо». Две кнопки шапки стали одной сцепкой из трёх: «слева» и «справа» — где стоит поле строк, горит одна из них; «строки» посередине — острия с обеих сторон, входят в выемки соседок; горит, пока поле видно, щелчок прячет его и возвращает.
Zazerkalius v0.590 — по снимку кнопки дзена Пирамиды: «вот дзен-значок из Пирамиды — сюда». Ромб дзена в левом нижнем углу левой панели теперь как в Пирамиде: ◎ в ромбе 40 × 40, тонкая рамка цветом акцента, внутри тёмная заливка, значок акцентом; при наведении рамка ярче.
Zazerkalius v0.589 — по снимку вкладки «Дзен»: «отсюда удали». Во вкладках групп конуса больше нет «Дзена»: это пульт, который виден только в режиме дзен, прятать и показывать его вкладкой было незачем.
Zazerkalius v0.588 — по снимку «🧘 дзен» в шапке: «в левое меню, вниз в угол, ромбоидным квадратной формы значком, без текста». Кнопка дзена ушла из шапки в левый нижний угол левой панели — ромбом 34 × 34 с одним 🧘 (что делает — во всплывающей подсказке). Панель держит под ним место, чтобы ромб не закрывал список окон; в столбике значков ромб — по середине.
Zazerkalius v0.587 — по снимку «📝 Текст» в шапке: «эту — в конус-кнопки перемести». Кнопка текста конуса и лога лазера ушла из шапки в полосу вкладок над группами конуса — последней, тем же шевроном, золотистым; горит, пока полоса текста открыта. Делает то же, что прежде.
Zazerkalius v0.586 — «кнопки конуса выглядят выше — почему? граница там, обводка?» Да: у кнопок из треугольников по краю обводка (при выключенной ▱ — 2 px цветом фона), а у вкладок групп её не было, и их заливка была на 4 px выше. Выбран первый вариант — дать вкладкам ту же обводку: при ▱ выкл — 2 px цветом фона холста, при вкл — 1 px светлая. Теперь вкладки и кнопки рядом одной видимой высоты.
Zazerkalius v0.585 — по снимку шапки над вкладками групп: «у верхнего меню отступ меньше, чем у этих, — сделай средний размер отступа для всех». Шапка, вкладки групп конуса и полоса над полем строк — теперь у всех по 4 px над и под кнопками (у шапки было 2, у вкладок и полосы — 6). Шапка — 34 px.
Zazerkalius v0.584 — по снимку вкладок групп: «нажатие на кнопки — скрывает и показывает сами группы». Не скрывало: вкладка меняла цвет, а группа оставалась на месте — правило раскладки групп в окне конуса (inline-grid / inline-flex с !important) было сильнее правила «спрятана». Теперь «спрятана» сильнее, и щелчок по вкладке (и двойной по заголовку) убирает группу и возвращает её.
Zazerkalius v0.583 — по снимку полосы над полем строк и вкладок групп рядом: «стандартизируй отступы по вертикали между кнопками». Вкладки групп конуса — той же высоты, что кнопки полосы над полем строк (25 px вместо 22), и с теми же отступами сверху и снизу (6 px вместо 2 и 4); перенесённый второй ряд вкладок — тоже через 6 px. Теперь обе полосы стоят вровень.
Zazerkalius v0.582 — по снимку вкладки «Лазер»: «первая кнопка также — )), а не !)». У первой вкладки левый край был прямым; теперь и у неё слева выемка, как у всех остальных.
Zazerkalius v0.581 — по снимку свёрнутой «Звука» под вкладками: «двойной клик по заголовку — просто скрыть всю группу и затемнить кнопку вверху». Двойной щелчок по заголовку группы больше не сворачивает её до заголовка, а прячет целиком — как щелчок по её вкладке; вернуть — щелчок по вкладке. Цвет вкладок перевёрнут: группа видна — вкладка горит своим цветом, спрятана — тёмная.
Zazerkalius v0.580 — по снимку меню «🎨 Гамма»: «цвета в „Своя“ — прямо в ней должны, 3 значка». Ошибка переноса v0.578: разметка строки «Своя» резалась по первому закрывающему тегу — он оказался внутри подписи «1», — и строка кончалась сразу после «1», а три выбора цвета вываливались под неё большими квадратами. Теперь 1, 0 и а — три ромба прямо в строке «Своя», справа от слова.
Zazerkalius v0.579 — по снимку свёрнутых групп рядком: «в конусе сверху так расположи кнопки вызова групп, и погашай их цвет при включении; сами кнопки на месте, а группы можно скрывать в них». Над группами конуса — полоса вкладок: Лазер · Кручение · Вид · Звук · Кольца · Аниматрица, каждая — шеврон цветом своей группы. Щелчок по вкладке прячет группу «в неё», ещё щелчок — показывает развёрнутой. Пока группа видна, вкладка погашена (бледная); спрятана — горит своим цветом. Вкладки стоят на месте, что бы ни делали с группами. Заодно показанная группа больше не уезжает на левую панель, если её не видно.
Zazerkalius v0.578 — по снимку «Гаммы» с ✕ («не закрывается крестиком») и следом: «сделай её не группой конуса, а просто в меню — списком вниз, но в стиле ромбов». Группы «Гамма» на конусе больше нет. Кнопка «🎨 Гамма» в шапке открывает под собой список: первой строкой «Своя» и три ромба цветов 1 / 0 / а, ниже — Янтарь, Океан, Лес, Роза, Огонь, Контраст; каждая строка — шестигранник, окрашенный цветами своей гаммы, выбранная горит. Выбор гаммы список не закрывает — можно перебирать; закрывает ещё щелчок по «🎨», Esc или щелчок мимо. Правый щелчок по «🎨» — следующая гамма, как раньше. (✕ у группы в проверке закрывал и открытую, и свёрнутую группу — причину у себя не поймал; с меню вопрос снят.)
Zazerkalius v0.577 — по снимкам «▱ обводка» и «Кручения»: «когда отключена — убери эту общую обводку у групп». Выключенная ▱ обводка теперь убирает и общую цветную рамку вокруг группы (зубчатый контур цветом группы); включённая — рамка на месте, как раньше.
Zazerkalius v0.576 — по снимку списка «✳ все» в группе «Вид»: «разложи на кнопки». Лучи к центру от бит выбираются тремя кнопками рядом — ✳ нет, ✳ выдел., ✳ все; горит выбранная. Список остался скрытым и держит значение — пресеты и сохранённые настройки читаются как раньше.
Zazerkalius v0.575 — по снимку шапки «📐 Разложить · ▭ Свернуть»: «эти не нужны, удали — всё переехало в Окна в левую панель». Обе кнопки сняты с шапки. И «Подсказки — сделай значком ?»: кнопка «📖 Подсказки» теперь просто «?», что она делает — во всплывающей подсказке.
Zazerkalius v0.574 — по снимку шапки: «высоту сократи, уменьшив отступы от кнопок по вертикали». Шапка страницы — 30 px вместо 40: кнопки те же (25 px), над и под ними осталось по 2 px; всё остальное поднялось на 10 px. На телефоне шапка, как и была, по высоте кнопок.
Zazerkalius v0.573 — по снимку конуса: «почему нет щели у 1 строки: 1 бит — одна щель должна быть». У кольца из одного бита граница одна — бит встречается сам с собой; расчёт лазера её и так знал (луч проходит строку 1 через неё), а рисунок щели ставил только там, где бит больше одного, и кольцо строки «1» выходило сплошным. Теперь у него одна щель и одна черта границы — в плоском виде, в объёме, у краски лазера и у стены.
Zazerkalius v0.572 — по снимку «Шаблонов» в левой панели: «обнови кнопки шаблонов в ромбовидном стандарте». Свои шаблоны («Столбик · 9 стр.» и др.) были прямоугольными рамками — их нарочно не брали в раскладку треугольниками. Теперь каждый шаблон — ряд той же цепочки, что «Сохр / + новый» над ним: имя — кнопка во всю ширину, ✕ — маленький ромб в конце ряда (при наведении краснеет). Текущий шаблон горит заливкой и золотой надписью, как раньше горел жёлтой рамкой.
Zazerkalius v0.571 — по снимку «Аниматрицы» на левой панели: «группы конуса не надо в левую панель, чтоб попадали». Группу конуса, которую тянут за заголовок, левая панель больше не ловит: нет ни магнита у её края, ни подсветки, группа остаётся там, где её отпустили. Группы, которые уже стояли на панели, при загрузке возвращаются на полосу конуса; список того, что там стояло, сохранён — если понадобится вернуть.
Zazerkalius v0.570 — «Аниматрица — так же подсказки». Подсказки группы сверены с кодом. У самой группы перечислено всё, что в ней есть, и сказано, что заготовки, сид и число строк живут под чертой поля строк. ▶ волна: пока идёт, на кнопке ⏸, а ↩ возвращает к тому, что было до пуска. ⤺ возврат: объяснено, что такое «до первой волны». ⏮: сколько истории хранится. ▦ 256: сид и число строк берутся из-под черты, карта остаётся открытой для перебора. ▮ Столб: сколько бит влево и вправо — в двух полях рядом (было «один столбец»). 🧱 Бит: на кнопке — сколько заморожено. У часов цикла появилась своя подсказка — что показывают стрелки и цифры.
Zazerkalius v0.569 — «обнови подсказки к кнопкам» (группа «Лазер»). Подсказки сверены с тем, что кнопки делают сейчас. У самой группы перечислено всё, что в ней есть (было только про луч-часы). ⌖◁ ⌖▷ доводят строку 1 до нынешнего лазера, а не до «смотрящего вверх». 🎯 сам переключает «Всё» на «Встреч Стр», отпускает остановленные кольца и не работает при ☀. ☀ и ✺ включают луч-часы и выключают друг друга. ✎ хранит прежнее поле в запасе. Свои подсказки получили поля ⌖× и «от °», поле номера у 🎯, ☀, переключатель «щели / Без щелей», ↻ и список шага.
Zazerkalius v0.568 — по снимку группы «Лазер»: «поправь кнопки, ничего не видно». В полях «⌖×» (сколько лазеров) и «от …°» (угол первого) числа не помещались: эти поля лежат во вложенной обёртке, и общее оформление полей групп до них не доставало — оставались узкие поля со стрелками и отступом под подпись. Теперь поля растянуты на всю кнопку, без стрелок, числа видны; подписи «⌖×», «от», «°», «×» сдвинуты со скошенного края, где их резало. И «45°» у ↻ больше не прячется под острием соседней кнопки.
Zazerkalius v0.567 — «только когда включена — красная». 🗑 под чертой выключена — рамка обычная, как у соседних кнопок; включена — красная двойная рамка и красноватая подложка. Значок остался крупным. Что делает включённая, не менялось: черта вверх — строки под ней стираются насовсем, когда черту отпускаешь (↩ вернёт).
Пирамида v0.105 — по снимку «↶ отменить | ✕ как было»: «подсвечивать, когда есть что отменять». ↶ отменить теперь горит цветом кнопки, пока есть шаги назад, и гаснет, когда отменять нечего. ✕ как было горит, пока на пирамиде есть что-то достроенное, сдвинутое или перевёрнутое, а когда всё стоит как было — приглушена.
Zazerkalius v0.566 — по снимку 🗑 под чертой поля строк: «корзина — красной обводкой и побольше значок». Рамка у 🗑 теперь красная всегда (раньше — как у всех кнопок, а включённая горела жёлтым, как прочие переключатели), сам значок крупнее. Включённая «стирать под чертой» — красная двойная рамка и красноватая подложка: сразу видно, что стирает.
Пирамида v0.104 — «пусть только по нажатию переключает». Свет по ярусам больше не бежит сам: каждый щелчок по ☼ зажигает следующий ярус, правый щелчок — предыдущий, после последнего подсвет выключается. Номер горящего яруса написан на ромбе.
Пирамида v0.103 — «нужна кнопка подсвета по ярусам». Наверху справа — ромб ☼: по ярусам бежит свет. Горящий ярус ярче и белее, остальные приглушены; свет идёт от верхнего яруса к нижнему (у звезды — от центра наружу), ярус за 0,4 секунды, и начинается снова. Работает во всех трёх режимах, вместе с вращением, размытием и видеозаписью. Включённый подсвет помнится и едет в ссылке 🔗.
Пирамида v0.102 — третий вариант: «у бипирамиды 2 вершины на оси и 3 на плоскости — пусть следующий уровень из двух ляжет на 2, а из трёх — на 3». Новая кнопка ✶ звезда рядом с «укладкой» и «бипирамидами». В центре одна бипирамида; второй ярус — две на её остриях, остриё к острию вдоль оси; третий — три на вершинах пояса, пояс к поясу, наружу. Дальше всё растёт так же от каждой новой бипирамиды: по оси — следующий ярус, через пояс — через один. Поэтому в третьем ярусе к трём на поясе добавляются ещё два продолжения столбика, и ярусы идут 1, 2, 5, 8, 14, 20… Бипирамиды друг в друга не входят: по высоте они стоят столбиками остриё к острию, а в плоскости их пояса касаются углами, как треугольники в узоре «кагоме».
Пирамида v0.101 и Битмультфильмы v0.012 — две ссылки 🔗 с пирамидой и слово «добавь в мультфильмы». В «Битмультфильмах» появился раздел «Пирамиды — живые»: обе пирамиды крутятся прямо в карточках, щелчок — открыть на весь экран с кнопками. Для карточек у Пирамиды завёлся режим «кино» (?kino в адресе): на экране только сама пирамида, а страница ничего не запоминает — чтобы карточка не перетёрла настройки того, кто смотрит. Заодно ссылка 🔗 теперь помнит размер экрана, и сдвиг вида на другом мониторе или телефоне пересчитывается — пирамида встаёт на то же место.
Пирамида v0.100 — «нужна кнопка типа размытие: кадр не сразу уходит». Наверху справа — ромб ≋: прежний кадр гаснет не мгновенно, а тянется за пирамидой шлейфом. Щелчок перебирает силу: выкл → 1 → 2 → 3 → 4 → выкл; на 1 шлейф короткий, на 4 — длинный, почти как засветка. На стробоскопических скоростях шлейф рисует узор, по которому видно, куда «бежит» картинка. Сила помнится, едет в ссылке 🔗 и попадает в видеозапись; 📷 со шлейфом сохраняет кадр ровно как на экране. Сделано так, чтобы старые кадры гасли до конца, а не оставляли вечную тень.
Пирамида v0.099 и общий recorder.js — «на всех видео это что, водяной знак?». Не водяной знак: это значок «в Хаб» — маленький вращающийся знак у заголовка, он тоже нарисован на холсте. Запись сводит в кадр все видимые холсты страницы и растягивает каждый до размера самого большого, поэтому крошечный значок ложился на весь ролик огромными размытыми песочными часами — и так на всех страницах, где есть и значок, и запись. Теперь значок (и любой холст с пометкой data-no-rec) в запись не попадает. Чинится сразу для всех страниц.
Пирамида v0.098 — «нужна кнопка — сохранить текущее движение, или, если можно, ссылкой». Наверху справа — ромб 🔗: щелчок кладёт в буфер ссылку на то, что сейчас на экране, — режим, слои, раздвинутость, срез, грани, рёбра, цвета, ось, поворот, наклон, вращение и его скорость, приближение и всё достроенное. Открыл ссылку — пирамида встаёт точно так же и крутится с той же скоростью. Ссылка заодно попадает в адрес вкладки, поэтому и обновление страницы возвращает этот вид.
Пирамида v0.097 — по снимку ромба: «так не нажимаются пауза и ×N». Их закрывал невидимый квадрат вокруг ромба видов — он ловил щелчки даже там, где пусто. Теперь пустое место вокруг кнопок щелчки пропускает, и ⏸ с ×N нажимаются, где бы ни стояли.
Пирамида v0.096 — по снимку ромба кнопок: «пусть паузу с ×N тоже вокруг себя собирает; и второй вариант — всё в ряд или в два, как на телефоне». Двойной щелчок по ✥ теперь ходит по кругу: ромб → один ряд над скоростью → два ряда зигзагом (как на телефоне) → снова ромб. В ромбе ⏸ и ×N тоже собираются вокруг ручки, слева снизу. На узком экране один ряд не влезает и пропускается.
Пирамида v0.095 — «ещё две ромбо-кнопки + − масштаб». Рядом с кнопками видов — ромбы + и −: приближают и отдаляют пирамиду; в ряду над скоростью они стоят по бокам от ⌖ (вид как был), в ромбе — по углам справа. Их, как и остальные, можно утащить куда угодно.
Пирамида v0.094 — «пауза возможна при записи?» → «отдельная кнопка паузы рядом с ⏺ — да». Пока идёт видеозапись, слева от ⏺ появляется ромб ⏸: щелчок — запись на паузе (и картинка, и звук), на кнопке ▶, ⏺ перестаёт мигать; ещё щелчок — запись продолжается в тот же файл, без дыры. Время записи паузу не считает. Остановил запись — кнопка паузы исчезает.
Пирамида v0.093 — по снимку кнопок, собранных ромбом вокруг ✥: «из такого положения пусть следующий двойной щелчок в ряд ставит их». Двойной щелчок по ручке ✥ теперь переключает: из ромба — в ряд над шкалой скорости, из ряда (или если кнопки растасканы) — обратно ромбом вокруг ручки, там, где она стоит.
Пирамида v0.092 — «дзен — по колёсику мыши; видеозапись со звуком — ещё кнопку». Щелчок колёсиком мыши по пирамиде включает и выключает дзен (если колёсиком тянуть — как раньше, сдвигается вид). Наверху справа, рядом с 📷, — ромб ⏺: видеозапись пирамиды со звуком. Звука у самой пирамиды нет, поэтому Chrome спросит, что показать, — выбери вкладку или весь экран и отметь «звук»: запишется то, что играет на компьютере. Отказался — запишется без звука. Пока идёт запись, ⏺ горит и мигает; второй щелчок или клавиша R — стоп, и файл сохраняется.
Пирамида v0.091 — по снимку кнопок, выстроенных в ряд над шкалой скорости: «по умолчанию и при двойном щелчке на ✥ — всё так собирает и кладёт вниз, сверху скоростей». Теперь при первом заходе и по двойному щелчку на ручку ✥ все ромбы-кнопки — ⊤ ◁ ⌖ ⏸ ×N ◇ ⊥ ⬙ ✥ ◢ — выстраиваются одним рядом над ползунками скорости, по середине экрана (на телефоне — зигзагом, чтобы влезли). Когда вращение выключено, ряд уезжает вниз вместе с ползунками, ⏸ остаётся у края.
Пирамида v0.090 — по снимку с телефона: «на мобильном это меню — под ползунки скорости и за низ экрана». Панель теперь никогда не заходит на полосу скорости и не уходит за низ экрана: её нижний край всегда над кнопками ⏸ ×N и ползунками (а когда вращение выключено — над низом экрана); если всё не помещается, панель листается внутри.
Пирамида v0.089 — по снимку ручки ✥: «эта пусть собирает всё вокруг себя, магнитит по горизонтали, вертикали и рёбрам». Вокруг ручки теперь невидимая сетка ромбов: соседние места ребром к ребру, в ряд по горизонтали и столбиком по вертикали. Тащимая кнопка прилипает к этой сетке в первую очередь. Щелчок по ручке собирает все растащенные кнопки обратно вокруг неё — в ближайшие свободные места сетки. А кнопки, которые стоят в сетке, ездят вместе с ручкой, когда тащишь весь ромб.
Пирамида v0.088 — «магнитить кнопки по горизонту и по рёбрам». Когда тащишь ромб-кнопку рядом с другим ромбом, она прилипает — ребром к его ребру или остриём к острию в ряд; а если просто ведёшь где-то на той же высоте, что соседняя кнопка, — выравнивается с ней по горизонтали.
Пирамида v0.087 — «не дать перетащить кнопки на кнопки и на ползунки». Пока тащишь кнопку, над другой кнопкой, над панелью или над ползунками скорости она бледнеет; отпустишь там — она сама встанет в последнее свободное место, где была по пути, или вернётся туда, откуда её взяли. Ромбы при этом могут стоять вплотную друг к другу.
Пирамида v0.086 — «кнопки тоже вниз — они фиксированы, это я на время перетаскивал». Кнопки, которые утащены к полосе скорости, теперь уезжают вниз вместе с ней, когда вращение выключено, и возвращаются, когда включено; ⟳ съезжает только до нижнего края экрана, чтобы её было чем включить вращение снова.
Пирамида v0.085 — по снимкам кнопок, растащенных над шкалой скорости: «и когда включено вращение — ещё и эти; скрыть и сдвинуть ползунки, если выключено вращение». Теперь ползунки скорости видны, только пока пирамида крутится. Нажмёшь ⏸ — полоса скорости плавно уезжает вниз за край экрана, ×N прячется, а кнопка ⟳ остаётся у нижнего края, чтобы включить вращение снова; включишь — полоса возвращается.
Пирамида v0.084 — по снимку ромба видов: «сделай те (⏸ и ×N) размером с эти, и дай растащить каждую по отдельности по полю». Кнопки вращения и множителя стали размером с ромбики видов. И теперь любую из этих кнопок — виды, ⌖, ⏸, ×N — можно утащить куда угодно на экране: ведёшь — тащится, просто щёлкнешь — нажимается, как раньше. Места запоминаются; двойной щелчок по ручке ✥ в центре ромба видов возвращает все кнопки на свои места.
Пирамида v0.083 — по снимку ромба ⏸: «сверху от скорости, посередине, и ×N с ним». Кнопка вращения и множитель ×N теперь парой ромбов над полосой скорости, по её середине; ползунки скорости снова во всю ширину полосы.
Пирамида v0.082 — по снимкам строки счёта и кнопок «▲◆ укладка | ⧫ бипирамиды»: «это показывать при наведении, сбоку». Строки со счётом частей под ползунками скорости больше нет. Наведёшь мышь на кнопки режима — справа от панели появится счёт: сколько тетраэдров вверх, октаэдров, тетраэдров вниз (или бипирамид), по слоям.
Пирамида v0.081 — по снимку полосы скорости: «ромб-кнопку вращения сюда перемести, и множитель справа / слева». Кнопка вращения ⟳ / ⏸ и множитель ×N переехали из ромба видов в полосу скорости: вращение — большим ромбом слева от ползунков, множитель — таким же ромбом справа. Они по-прежнему мигают, пока пирамида крутится.
Пирамида v0.080 — по снимку ромба-точки поверх деления «48»: «у прозрачных отметок приоритет в нажатии». Щелчок по ромбу-точке на нижнем ползунке теперь сразу ставит ровно её скорость — ромб ловит нажатие раньше ползунка и делений. Только когда бегунок уже стоит на ромбе, ромб уходит под него, чтобы бегунок можно было утащить.
Пирамида v0.079 — по снимку строки кнопок стробоскопа: «эти покажи ромбами с обводкой, без фона, прямо на втором ползунке скорости, только стоячие». Точки, где пирамида стоит или стоит её рисунок из нескольких положений, теперь — пустые ромбы с цветной обводкой прямо на нижнем ползунке скорости, каждый на своём месте; строки кнопок больше нет. Подведёшь бегунок к ромбу — он прилипает ровно в точку, и ромб загорается ярче.
Пирамида v0.078 — по снимку крайнего деления с дорожкой: «и дальше цветом этим же, как у бегунка». Контур длинного ромба-дорожки у ползунков скорости теперь того же цвета, что бегунок и обводка крайних делений, — сплошной цветной контур от края до края.
Пирамида v0.077 — по снимку крайнего деления: «обводка слева нормально, а справа — по треугольнику, правее». Цветная обводка крайних делений теперь идёт по всему их контуру: с внешней стороны — по рёбрам ромба размером с бегунок, с внутренней — по рёбрам треугольника, до его острия.
Пирамида v0.076 — «ось вращения — дальнюю от меня половину затемнить немного, после центра». Половина оси за центром пирамиды, уходящая от зрителя, теперь бледнее — сразу видно, какой конец оси ближе. Если смотреть строго сбоку, обе половины одинаковые.
Пирамида v0.075 — по снимку «¼ ×¼»: «бегунок везде на первый план; убрать надо было только левую половину». Понял неверно в прошлый раз — исправил: у крайних делений скорости вернулся плоский тёмный ромб, но только его внутренняя половина (наружная, торчащая за шкалу, убрана), а в середине — ромб размером с бегунок одной цветной обводкой. И бегунок теперь всегда впереди: когда он подходит к крайнему делению, деление уходит под него и щелчки достаются бегунку.
Пирамида v0.074 — по снимку крайнего деления ¼: «левую чёрную часть удали, а ромб обесцветь, но обводку сделай ему». У крайних делений скорости больше нет широкого тёмного ромба вокруг — остался только ромб размером с бегунок: тёмный внутри, с цветной обводкой, число в нём — светлое.
Пирамида v0.073 — по снимку строки «◐ цвет»: «на этой же строке — показать / скрыть ось вращения, кнопка в форме (())». Рядом с «◐ цвет» — кнопка «↕ ось»: шестигранник с двойными остриями внутри, как «(( ))». Включишь — через центр пирамиды проходит штриховая ось, вокруг которой она крутится; при виде сверху или снизу ось смотрит прямо на тебя и видна точкой.
Пирамида v0.072 — по снимку залитого ромба ¼: «крайние обесцветь, внутри них — ромб размером с бегунок, слева / справа». Крайние деления скорости снова тёмные, как остальные, а внутри каждого, посередине, — цветной ромб размером с бегунок, с числом на нём (у самого острия такой ромб не помещается — плоский ромб деления его обрезал бы). Нажимать на них — как раньше: шаг, удержание — повтор.
Пирамида v0.071 — по снимку кнопки ⟳: «значок паузы, когда крутится». Пока пирамида крутится, на кнопке вращения — ⏸ (нажмёшь — встанет), а когда стоит — ⟳ (нажмёшь — закрутится).
Пирамида v0.070 — по снимку бегунков «4», «0», «∞»: «убери жирность с чисел». Числа на бегунках панели и на крайних ромбах скорости теперь обычные, не жирные.
Пирамида v0.069 — по снимку стрелки у шкалы скорости: «у скоростей убери стрелки, а крайние ромбы закрась». Треугольных стрелок у ползунков скорости больше нет, ползунки стали шире. Крайние ромбы-деления — ¼ и 1024 на верхнем, концы промежутка на нижнем — залиты цветом ползунка и работают как стрелки: щелчок — шаг (вверху — к соседней метке, внизу — чуть-чуть), удержание — повтор.
Пирамида v0.068 — по снимку бегунка «Среза» с надписью «все»: «не „все“, а знак бесконечности». Когда показаны все слои, на бегунке и в подсказке теперь ∞.
Пирамида v0.067 — по снимку таблички «Раздвинуть 79»: «подсказку без рамки». Подсказка справа от панели теперь просто текст — без рамки и подложки (с лёгкой тёмной тенью, чтобы читалась поверх пирамиды).
Пирамида v0.066 — «числа на бегунках должны нормально читаться на фоне бегунка, и побольше». Ромбы-бегунки у ползунков панели стали шире, число на них — крупнее и жирнее. Цвет числа теперь не обратный, а чёрный или белый — смотря что лучше видно на цвете ползунка: обратный цвет у средних тонов почти сливался с ромбом.
Пирамида v0.065 — «числа — на бегунке, антицветом, фон их — за бегунком». В ползунках панели число теперь стоит прямо на ромбе-бегунке, по его середине, и едет вместе с ним; фоном ему служит сам ромб, а цвет числа — обратный цвету ползунка (на жёлтом — тёмно-синий и т. п.).
Пирамида v0.064 — «числа оставь». В ползунках панели у бегунка снова видно число; убрано только название — оно появляется в табличке справа при наведении и перетаскивании.
Пирамида v0.063 — «убери текст из ползунков; справа от них показывай его при наведении и перетаскивании бегунка». В ползунках панели («Слоёв», «Раздвинуть», «Срез») подписи больше нет — дорожка чистая. Название и число появляются в табличке справа от панели, напротив своего ползунка, пока над ним мышь или пока тянешь бегунок и жмёшь края; число в табличке меняется на ходу. Если панель стоит у правого края экрана, табличка появляется слева от неё.
Пирамида v0.062 — «по высоте пусть для мыши площадь больше будет по краям для стрелок». Щелчок у края теперь ловится во всю высоту строки ползунка, а не только по цветному треугольнику: треугольник лишь показывает, где край.
Пирамида v0.061 — «когда она узкая — увеличь длину до 2 раз, чтобы больше захвата было для стрелок». Цветной край дорожки, где щелчок работает как стрелка, теперь сам вытягивается: когда бегунок уходит к другому краю и ребро ромба становится пологим, край удлиняется — до двух раз, — и по нему легче попасть. Бегунок при этом не перекрывается: край длинный, только когда бегунок далеко.
Пирамида v0.060 — по снимку с закрашенными концами дорожки: «края внутри фоном залей, ограничь ромбами — там, где нажимать как стрелки». Концы ромба-дорожки, где щелчок работает как стрелка, теперь залиты цветом ползунка — ровно по рёбрам ромба, поэтому заливка меняет форму вместе с бегунком и видно, куда нажимать.
Пирамида v0.059 — по снимку цветных стрелок у ползунков панели: «теперь эти стрелки можно убрать и расширить ползунок, но клик по краям должен работать как по стрелкам». Стрелок больше не видно, а ромб-дорожка растянулся на их место, до самых краёв. Щелчок у левого или правого края — шаг на одно деление, удержание — повтор, как раньше стрелкой.
Пирамида v0.058 — по снимку ползунков панели: «пока только тут: эти серые ромбы зависят от бегунка — рёбра меняют длину, вершины привязаны к бегунку и к вершинам стрелок». У «Слоёв», «Раздвинуть» и «Среза» дорожка теперь не ровный ромб: боковые вершины стоят у стрелок, а верхняя и нижняя — над и под бегунком и едут вместе с ним, так что рёбра то удлиняются, то укорачиваются. Шкалы скорости пока не трогал.
Пирамида v0.057 — «можно ли открывать новое окно» (по значку хаба). На телефоне долгое нажатие на значок хаба снова открывает меню браузера с «Открыть в новой вкладке» — для всей остальной страницы это меню выключено, чтобы не мешало. Обычное нажатие по-прежнему переходит в хаб в этой же вкладке; на компьютере новая вкладка — колесом мыши или Ctrl+щелчком.
Пирамида v0.056 — по второму рисунку поверх ползунков: ромб дорожки стал во всю высоту ползунка, его острия доходят до стрелок, а контур — светлый и толще, как на рисунке.
Пирамида v0.055 — по рисунку поверх ползунка «Слоёв»: «вместо горизонтальной линии в бегунках — такое, фоном». Дорожка каждого ползунка теперь не полоска, а длинный плоский ромб во всю ширину — острия у стрелок, серый контур, тёмная середина; бегунок, числа и подписи ездят поверх него.
Пирамида v0.054 — по снимку «×1», наполовину спрятанного под ромбом скорости: «текст бегунка — на передний план». Цветные значения у бегунков скорости теперь поверх ромба и чуть дальше от него; подписи у ползунков панели («Слоёв», «Раздвинуть»…) остаются за бегунком, как просил раньше.
Пирамида v0.053 — по снимку ромба видов: «кнопки тоже в цвет». Ромбики видов, ручка в центре и отдельные ◎ 📷 ✥ теперь обведены цветом — радугой по порядку или выбранным цветом, приглушённо; при наведении и у включённого вращения — ярко.
Пирамида v0.052 — по снимку «Раздвинуть 26»: «текст назад, за бегунок». Подпись у бегунка теперь лежит под ромбом, а не поверх него — ромб всегда виден целиком.
Пирамида v0.051 — по снимку заголовка: «прыгает размер при открытии меню». Свёрнутая панель раньше сжималась до ширины заголовка и меняла поля, а стрелка меняла размер — поэтому при раскрытии всё прыгало. Теперь заголовок одинаковый в обоих видах: ширина и поля те же, стрелка только поворачивается на месте.
Пирамида v0.050 — по снимку стрелки «свернуть»: «другой треугольник того же ромба». Стрелка теперь — нижняя половина того же ромба, что у бегунков ползунков: уже и острее прежнего плоского треугольника.
Пирамида v0.049 — по снимку панели: «ползунки — цвет тоже менять». Ромбы-бегунки, стрелки по бокам, подписи у бегунков и горящие метки шкал теперь красятся так же, как кнопки: с радугой — каждый ползунок своим цветом нот, без радуги — все в выбранный цвет.
Пирамида v0.048 — по снимку маленькой ▾ в заголовке: «стрелку вниз — из ромбов, размер». Кнопка «свернуть» стала крупным треугольником — половинкой ромба, как стрелки у ползунков: остриём вниз, а у свёрнутой панели — вправо.
Пирамида v0.047 — «углы 60°». Ромбы делений на шкалах скорости собраны теперь из двух равносторонних треугольников: острые углы 60° смотрят влево и вправо вдоль линии, тупые 120° — вверх и вниз. Все деления одного размера, число — посередине.
Пирамида v0.046 — по снимку деления «2» на шкале скорости: «засечки тоже ромбами — их рёбрами, только серыми, тёмно». Каждое деление теперь — контур ромба тёмно-серыми рёбрами, высотой с бегунок, число — внутри ромба. Чёрточек над и под числом больше нет.
Пирамида v0.045 — по снимку карточек меню: «углы обводки меню — ромбами». У обеих карточек панели углы теперь не скруглены, а срезаны под 45°, как грань ромба, — в одном стиле с кнопками.
Пирамида v0.044 — по снимку кнопок панели: «цвет кнопок — в цвет выбранный или радугой». Обводка горящих кнопок теперь идёт за «◐ цвет»: пока радуга включена — каждая кнопка своим цветом нот, по порядку, как слои пирамиды; выключил радугу — все кнопки, заголовок и стрелки ползунков в тот цвет, что выбран в квадратике.
Пирамида v0.043 — по снимку ручки ⋮⋮ в центре ромба видов: «значок как у курсора в момент перетаскивания». Вместо точек там теперь четыре стрелки крестом — тот же знак, что у курсора, когда тащишь, — сразу понятно, что за него ромб и переставляется.
Пирамида v0.042 — по снимку «◐ цвет» с квадратиком цвета рядом: «объедини одной обводкой ромбоидной». Кнопка «◐ цвет» и квадратик выбора цвета теперь одна фигура: общий шестигранник с одной обводкой, квадратик — внутри, справа от надписи. Когда радуга включена, квадратика нет и это обычная кнопка.
Пирамида v0.041 — по снимку стрелок ▶: «все стрелки сделай, как у ромбов, углом». Стрелки у всех ползунков теперь — половинка ромба: остриё под прямым углом, как углы ромбиков видов и кнопок ◎ 📷 ✥, а не прежний острый клин.
Пирамида v0.040 — по снимку ромба видов: «в пустое место перемести вращение и сбоку от него также ромбом ×2; поменяй местами то, что в центре, с кнопкой перемещения всего меню». ⟳ вращение встало в пустой ромбик ромба видов, ×N — ромбиком рядом с ним, в нижнем левом углу. Ручка ⋮⋮ (перетащить всё) теперь в центре ромба, а ⌖ — на её прежнем месте. Наверху посередине кнопок больше нет; ⟳ и ×N мигают прямо в ромбе, пока пирамида крутится.
Пирамида v0.039 — по снимку «10 ×10,000»: «так бегунок не схватить; число с засечкой — под ползунком всегда; и ползунки увеличь на 50 %». Числа шкалы закрывали ромб-бегунок, и его было не ухватить. Теперь слои идут так: линия, поверх неё числа с засечками, а поверх всего — бегунок; щелчок по числу проходит в ползунок и ставит его в это место. И все ползунки — скорости и в панели — стали в полтора раза крупнее: линия, ромб, стрелки, числа.
Пирамида v0.038 — по снимку «✕ как было»: «отменить (пошагово) и как было». Рядом с «как было» — «↶ отменить»: каждый щелчок возвращает на один шаг назад — убирает последнее отражение, разворачивает переворот, возвращает перетащенную часть, а после «как было» — возвращает всё, что было до него. На компьютере то же делает Ctrl+Z. Помнится до 200 шагов; когда отменять нечего, кнопка бледная.
Пирамида v0.037 — по снимку ромба видов: «повысь размер ромбов до больших». Ромбики видов стали крупнее (46 px вместо 34) и значки в них тоже; весь ромб теперь 144 px, панель на компьютере опущена под него.
Пирамида v0.036 — по снимку шкал скорости: «нет, я о том, что перед линией — числа и засечки, и числа на линии, а не ниже». Числа делений теперь стоят прямо на линии ползунка, поверх неё — линия под числом прерывается, а короткие засечки торчат над и под числом. Под линиями больше нет отдельной строки чисел, и полоса скорости стала ниже.
Пирамида v0.035 — по снимку «⟳ вращение ×2»: «убери прямоугольную рамку». Вокруг кнопок вращения наверху больше нет прямоугольной подложки — висят одни шестигранники.
Пирамида v0.034 — по снимку счёта частей: «это в одну строку под скоростями; деления скоростей покажи прямо на линии ползунка». Счёт (▲ … по слоям … · ◆ … · ▼ …) ушёл из панели в полосу скорости — одной строкой под обоими ползунками; не влезает — обрезается многоточием. Засечки делений скорости теперь пересекают саму линию ползунка, числа — под ней.
Пирамида v0.033 — по снимку группы «отражать, двигать, перевернуть, как было»: «отдели пустотой от меню — как бы два меню друг под другом, но примагничены всегда». Теперь это две отдельные карточки: сверху основное меню, под ним, через небольшой промежуток, карточка действий со щелчком. Тащатся они всегда вместе, за заголовок, и сворачиваются вместе.
Пирамида v0.032 — по снимку кнопки «⧫ бипирамиды»: «здесь две кнопки, одна какая-то включена». Верхняя строка панели теперь выбор из двух: «▲◆ укладка» (тетраэдры и октаэдры, слои 1, 3, 6…) и «⧫ бипирамиды» (ярусы 1, 2, 3…); горит та, что показана сейчас.
Пирамида v0.031 — по снимку «Слоёв 64»: «32 максимум в ползунке, но стрелкой можно довести до 64». Ползунок слоёв теперь идёт от 1 до 32 — на нём проще попасть в нужное число, а стрелка ▸ ведёт дальше, до 64. После 32 бегунок стоит у края, а подпись показывает настоящее число слоёв.
Пирамида v0.030 — по снимку кнопок «⟳ вращение ×178»: «посередине наверху и мигать, когда движение». Вращение и скорость ×N ушли из панели наверх, на середину экрана, и пока пирамида крутится, они мигают — сразу видно, идёт движение или стоит.
Пирамида v0.029 — по снимку кнопки «⧫ бипирамиды»: «на самый верх меню, под заголовком». Переключатель режима теперь первой строкой панели, сразу под «ПИРАМИДА», над ползунками: он меняет всю фигуру, ему место в начале.
Пирамида v0.028 — по снимку кнопок ⟲ ✥ ⇅ ✕: «объедини в группу». Отражать, двигать, перевернуть и «как было» теперь одна группа в общей рамке — всё, что меняет саму пирамиду, в одном месте.
Пирамида v0.027 — по снимку кнопки «📷 снимок»: «к режиму дзен слева, и дзен в ромбо-вид кнопку». Снимок ушёл из панели в правый верхний угол, рядом с ◎ дзен, слева от него. ◎, 📷 и ✥ (сдвиг вида справа посередине) стали ромбами, как кнопки видов. В дзене 📷 остаётся бледным, как ◎, — можно снять кадр, не выходя.
Пирамида v0.026 — по снимку полоски видов: «в ромб по вершинам и сторонам и помести слева вверху». Кнопки видов собраны в ромб из ромбиков: по вершинам — сверху (вверху), ребро (справа), снизу (внизу), сбоку (слева); по сторонам — 3D, грань и ручка ⋮⋮ для перетаскивания; в центре — ⌖ (приближение как было). Ромбики сходятся сторонами вплотную. Ромб стоит в левом верхнем углу, панель на компьютере опущена под него. Следом — «пусть над ползунками появляется, чтобы не дёргались»: кнопки стробоскопа теперь висят над полосой скорости, а не под ней, и ползунки больше не прыгают, когда кнопки появляются или исчезают.
Пирамида v0.025 — по снимку кнопок «◌1571 0,50 …» на медленном участке: «при таких скоростях эффекта нет? зачем они? пусть появляются, только когда что-то есть». Да, там эффекта нет: 1571 положение за круг глаз видит как обычное вращение. Теперь кнопки стробоскопа появляются, только если положений не больше 12 — это примерно от ×32 и выше (у бипирамид — от ×64). На медленных участках строка кнопок исчезает совсем.
Пирамида v0.024 — по снимку кнопок ⟲ отражать / ✥ двигать / ⇅ перевернуть: «нужно отключать всё, чтобы ничего не менять». Повторный щелчок по горящей кнопке режима теперь её гасит. Когда не горит ни одна, щелчки по пирамиде ничего не достраивают, не двигают и не переворачивают — мышь и пальцы только крутят вид, грань под курсором не обводится. Выбор (и «ничего») запоминается.
Пирамида v0.023 — «у бегунков скорости — значения покажи на комп-версии». На компьютере рядом с каждым ромбом скорости теперь едет его значение: у верхнего — ×N (зелёным), у нижнего — точное, до сотых (голубым). На телефоне подписи спрятаны, чтобы не теснить полосу.
Пирамида v0.022 — по снимку полосы скорости во весь экран: «на компе не на всю ширину, а посередине, на 2/3 ширины браузера примерно». На компьютере полоса скорости теперь занимает две трети ширины окна и стоит по центру; на телефоне — как была, во всю ширину.
Пирамида v0.021 — «(верх(окта)низ) — так выровняй края ромбами». Запись скобками, как в Zazerkalius: средняя кнопка — шестигранник с остриями на обе стороны, кнопки слева от неё смотрят остриём влево, справа — вправо, и все сцеплены вплотную. Так у каждой строки оба края — острия наружу, ровно и симметрично. Правило одно на все строки панели, стробоскоп и полоску видов; если строка переносится, каждая её часть выравнивается сама. Следом — «ползунки как у скоростей, числа слева-справа от бегунков и название там же»: у «Слоёв», «Раздвинуть» и «Среза» теперь ромб-бегунок и треугольные стрелки по бокам, а название с числом едут прямо рядом с бегунком — справа от него, у правого края — слева. Отдельных строк-подписей над ползунками больше нет, панель стала ниже.
Пирамида v0.020 — по снимку панели: «сделай перемещаемой, кнопки в стандарте ромбов, как последние правки в Zazerkalius — в стиле, не обязательно точно» и «виды — отдельно кнопки». Панель теперь тащится за заголовок и помнит место; двойной щелчок по заголовку возвращает её на место. Кнопки стали шестигранниками с остриями, как у конуса Zazerkalius: первая в ряду — остриём, следующие — выемкой, и входят друг в друга; нажатая обведена зелёным. Виды (сверху, снизу, сбоку, ребро, грань, 3D) и ⌖ ушли из панели в отдельную полоску вверху посередине — она тоже перетаскивается за ⋮⋮ и помнит место.
Пирамида v0.019 — «на других скоростях тоже надо — пусть при перемещении ползунков для каждого участка найдёт». Кнопки стробоскопа теперь считаются под тот участок, который показывает нижний ползунок: двинул верхний — участок сменился, и под ним свои точки. Ищутся скорости, где поворот за кадр — простая доля трети оборота: целая — пирамида стоит (■), половина — двоится (✶), треть — три положения (△), дальше ◌q — q положений по кругу. Самая простая точка участка идёт с ⟲ и ⟳ по бокам — чуть медленнее и чуть быстрее, чтобы видеть, как вращение меняет сторону; следом ещё до трёх. На медленных участках доли мелкие (сотни положений) — там глаз видит обычное вращение, но точки всё равно показаны.
Пирамида v0.018 — «сделай бегунки ромбами и стрелки из треугольников равнобедренных». Бегунки ползунков скорости теперь ромбы (верхний зелёный, нижний голубой), метки встали точно под их середину. Стрелки ◂ ▸ по бокам — равнобедренные треугольники цвета своего ползунка, при нажатии становятся ярче.
Пирамида v0.017 — вопрос «как скоростями поймать момент, когда кажется, что крутится в одну сторону, а потом в другую; есть ли частота стояния» и следом «просто кнопки такие под ползунками, сразу показать». Пирамида поворачивается шагом за кадр (0,004 × скорость), а совпадает сама с собой через треть оборота — поэтому при ×523,6 каждый кадр она встаёт ровно туда же и кажется неподвижной. Под ползунками теперь строка кнопок: ■ 523,6 — стоит; ⟲ 523,1 — медленно назад; ⟳ 524,1 — медленно вперёд; ✶ 261,8 — двоится (две картинки чередуются); △ 174,5 — три положения по кругу. В режиме бипирамид набор свой, от ×785,4 (пол-оборота). Шаг привязан к кадру, поэтому стояние точное на любом мониторе.
Пирамида v0.016 — «в режиме без радуги нужен выбор цвета». Когда ◐ цвет выключен, рядом с кнопкой появляется квадратик цвета: щелчок — и выбираешь любой. В него красятся и грани, и рёбра; прежде без радуги всё было одним светлым. Выбор запоминается.
Пирамида v0.015 — «кнопка дзен — отдельно от всех, вверху справа; и кнопку справа посередине по вертикали — нажал и повёл, двигает всё». ◎ дзен переехал из панели в правый верхний угол и стоит сам по себе; в дзене он остаётся бледным, и нажатие на него выводит обратно (долгое нажатие и Esc тоже работают). У правого края посередине высоты — ✥: нажми и веди, и сдвигается весь вид, как правой кнопкой мыши. В дзене ✥ спрятан.
Пирамида v0.014 — «у ползунков скоростей с боков стрелки». По краям обоих ползунков скорости — ◂ и ▸. Верхние переводят на соседнюю метку (вдвое медленнее или быстрее), нижние двигают на сотую часть промежутка между метками. Если держать стрелку, шаги повторяются.
Пирамида v0.013 — «ещё режим би-три-рамиды — в каждом ярусе плюс одна». Кнопка ⧫ переключает пирамиду на ярусы треугольных бипирамид — два правильных тетраэдра основанием к основанию, остриё вверх и остриё вниз. Сверху одна, под ней две, под ними три — и так до 64 ярусов, цвет по ярусу. Сбоку это стопка ромбов 1, 2, 3…: соседи в ярусе касаются уголками треугольника-зеркала, ярус с ярусом — тоже в одной точке, не пересекаясь. Целыми гранями одинаковые бипирамиды друг к другу не встают (об этом было ещё в v0.001), поэтому касание здесь — точками. Раздвинуть, срез, грани/рёбра/цвет, виды, отражать, двигать и переворачивать — всё работает и тут; сдвинутая бипирамида защёлкивается в узел ярусов. При переключении режима достроенное убирается.
Пирамида v0.012 — «убери выделения текста; под ползунком скорости ещё один — от и до между текущими метками скорости». Текст на странице больше не выделяется — ни мышью, ни долгим нажатием на телефоне (оно теперь только выводит из дзен). Под полосой скорости — второй, голубой ползунок: он идёт ровно, без степеней, от метки слева от текущей скорости до метки справа (скорость ×3 — от 2 до 4, ×700 — от 512 до 1024), с метками на концах и четвертях. Пока его тянешь, промежуток не прыгает; меняется он, когда двигаешь верхний ползунок, жмёшь ×N или метку сверху.
Пирамида v0.011 — «кнопка дзен и выход по долгому нажатию; картинку — так, как видно на скорости; ×1024; ползунок на всю ширину экрана, плавный, но с метками». ◎ дзен прячет панель и полосу скорости, остаётся одна пирамида; выход — долгое нажатие на ней (0,6 с, не двигая) или Esc. Скорость теперь — полоса внизу во всю ширину: ползунок плавный, но идёт по степеням двойки, поэтому метки ¼ ½ 1 2 4 … 1024 стоят на равных расстояниях; у меток он чуть прилипает, а щелчок по метке сразу ставит её скорость. Кнопка ×N удваивает до ×1024. Снимок 📷 на вращении складывает 8 последних кадров в один — на большой скорости глаз видит не один кадр, а их наложение, и картинка выходит такой, как видно на экране; без вращения — один кадр, как раньше.
Пирамида v0.010 — «двойной клик — пауза / старт вращения». Двойной щелчок (или двойное касание на телефоне) где угодно на холсте включает и выключает вращение. Чтобы он не путался с одиночным, отражение и переворот по щелчку срабатывают теперь с задержкой 300 мс — если второго щелчка не было. А в режиме ✥ часть снимается с пирамиды только когда её потащили, а не от простого нажатия: иначе двойной щелчок оставлял бы на месте «сдвинутую» часть.
Пирамида v0.009 — «смена вида пусть не останавливает вращение». Кнопки видов (⊤ ⊥ ◁ ◇ ◢ ⬙) больше не выключают ⟳: пирамида плавно встаёт в вид и крутится дальше вокруг вертикали с тем же наклоном; сверху и снизу — вращается на месте.
Пирамида v0.008 — «×512». Кнопка скорости удваивает теперь до ×512 (было до ×32), после ×512 — снова ×¼.
Пирамида v0.007 — «номер версии не видно после заголовка». Номер стоял в правом нижнем углу экрана, а на телефоне с v0.004 был спрятан вовсе. Теперь он в заголовке панели, сразу после «ПИРАМИДА», мелко и серым — виден везде, и в свёрнутой панели тоже.
Пирамида v0.006 — «кнопку скорости — умножает на 2 каждый раз». Рядом с ⟳ — кнопка ×N: каждый щелчок вдвое ускоряет вращение (×1, ×2, ×4 … ×32), после ×32 скорость возвращается к ×¼, чтобы можно было и замедлить. Если вращение было выключено, щелчок по ×N его включает.
Пирамида v0.005 — «а если до 64 слоёв? и возможность отключать цвет, чисто рёбрами, и несколько видов сверху, сбоку, и ещё кнопки». В 64 слоях 45 760 тетраэдров вверх, 43 680 октаэдров и 41 664 тетраэдра вниз — около 700 тысяч граней; прежний холст 2D сортировал каждую грань в каждом кадре и на таком числе встал бы. Поэтому рисует теперь WebGL2: каждая часть — запись в текстуре данных (сдвиг, матрица, цвет), видеокарта собирает её из заготовки. Прозрачность держится тем же «художником», только по частям: части сортируются от дальних к ближним (поразрядно, быстро), внутри части сначала дальние грани, потом ближние. Новые кнопки: ▣ грани, ╱ рёбра, ◐ цвет (выключишь грани и цвет — останутся чистые светлые рёбра); «Срез» — показать один слой; виды ⊤ сверху, ⊥ снизу, ◁ сбоку, ◇ на ребро, ◢ прямо на грань, ⬙ 3D (поворот плавный, вращение останавливается); 📷 — снимок PNG; у ползунков стрелки ◂ ▸. Отражать, двигать и переворачивать можно по-прежнему, на любом числе слоёв.
Пирамида v0.004 — «на мобильном поправь меню, на пол-экрана, всё перекрывает, минимализируй». На узком экране панель была во всю ширину внизу, со словами на кнопках и ползунками друг под другом — закрывала половину пирамиды. Теперь там кнопки только значками (▲ ◆ ▼ ⟳ ⟲ ✥ ⇅ ⌖ ✕; что делает — во всплывающей подсказке), оба ползунка в одну строку, счёт мелким шрифтом, номер версии в углу спрятан. И у заголовка — ▾: сворачивает панель до одной строки «ПИРАМИДА ▸». На телефоне она с самого начала свёрнута, на компьютере открыта; выбор запоминается.
Пирамида v0.003 — «а также переворачивать ромбы и перемещать». Режим щелчка теперь выбирается: «⟲ отражать» (как было), «✥ двигать» — хватаешь любую часть и тащишь в плоскости экрана, отпустил — она защёлкивается: первая вершина встаёт в ближайший узел решётки, где стоят все вершины укладки, поэтому часть снова может сесть грань к грани; «⇅ перевернуть» — щелчок переворачивает часть вверх ногами (поворот на 180° вокруг горизонтали): тетраэдр остриём вверх становится остриём вниз, ровно как в провалах укладки, а октаэдр совпадает сам с собой. Двигать и переворачивать можно и части самой пирамиды — тронутая становится своей копией. «✕ как было» возвращает всё.
Пирамида v0.001 → v0.002 — по снимку пирамиды — «сделай приближение, масштабирование и достройку отражения от любой грани по клику». Колесо мыши или два пальца — ближе и дальше, к точке под курсором; правая кнопка, Shift или два пальца — сдвиг вида. Щелчок по любой грани достраивает зеркальную копию этой части через эту грань: она садится по ту сторону вплотную, грань к грани. По достроенным частям тоже можно щёлкать, и фигура растёт куда угодно; если такая часть на этом месте уже стоит, второй раз она не ставится. Грань под курсором обведена белым. «⌖ вид» — приближение как было, «✕ отражения» — убрать достроенное.
Просмотр GIF v0.001 (новая страница prosmotr/Zerkalius-prosmotr.html) и хаб v0.071 — «нужен GIF-просмотрщик нормальный, чтобы покадрово, через кадр 2, 4, и разные участки выбирать, склеивать». Открыть один или несколько GIF (кнопкой или бросив на страницу) — слева список; листать ◀ ▶ (← →, Shift — по одному кадру), шаг — каждый кадр, через 2, 4, 8, 16, играть ▶ с любой задержкой, назад ⇆, по кругу 🔁, масштаб «вписать» / ×1 … ×8, 🖼 кадр в PNG. «[ с» и «по ]» отмечают участок, «➕ В склейку» кладёт его с выбранным шагом (обратный участок — задом наперёд); справа — склейка: участки из разных GIF, ↑ ↓ ✕, «▶ Смотреть склейку» — в том же просмотре, «💾 Скачать GIF» — одним файлом (кадры разного размера — по центру на чёрном, общая палитра до 256 цветов). Разбор и сборка GIF — свои, без библиотек (LZW, палитры, прозрачность, способы смены кадра, чересстрочность; сборка — тот же LZW, что в Code). Кнопка — в хабе в «Знаке и записях», за Битмультфильмами; _js/hub-link.js знает новую папку prosmotr.
Code 35.105 — «надо прям на холсте выбрать ромб — и скачать все проходы по этому столбу этих ромбов». В ◇ разделе, под 🎞 Ромбами в кино — 🎯 Выбрать ромб: следующий щелчок по холсту переводится в строку и столбец текста по раскладке последнего кадра, находится ромб сетки (шаг — «Шаг» сетки, «авто» — 32), в котором точка, и весь его столбец — ромбы с той же вершиной по столбцу через S строк, касаются вершинами — обводится голубым; в строке состояния — строка, столбец, сдвиг от оси и сколько ромбов в столбе. 🎞 Столб ромбов — все проходы — GIF: волна гонится на копии текста, кадр — проход (шаг — как у 🎞 GIF), в кадре все ромбы столба друг под другом, до повтора текста (не больше 1024 кадров) — на цикле 512 это весь цикл. Под радаром и 3D-вращением выбор не работает; смена шага сетки снимает выбор.
Code 35.104 и Битмультфильмы v0.010 — цикл нашёлся («ура, цикл найден — как теперь всё записать»: 512 строк, период 512, повтор после 129-го прохода), и пользователь прислал два файла: «💾 Данные» (Zerkalius_Data.txt, 512 строк) и «📤 Сцены в файл». Проверено вне страницы (numpy, тот же XOR волны — проход = накопленный XOR строк сверху вниз): текст из «Данных» возвращается к себе ровно через 512 проходов. А в файле сцен — «Мой шедевр» другого размера: 256 строк, цикл 256 после 129-го (проход 17742). Нашлась дыра: файл «💾 Данные» Code обратно не читал — брошенный на холст, он грузился как текст со скобками и кавычками. Теперь processTextData узнаёт этот формат (JSON-массив строк с полем text) и ставит строки как были, строка в строку, с пустыми. Оба файла положены в Битмультфильмы, в «Иероглифы Аниматрицы», ссылками для скачивания.
Code 35.103 — по снимку ◇ сетки на большом треугольнике — «надо ромб 128 добавить, не хватает 64», и следом по снимку столба ромбов на оси — «как вот эти ромбы собрать по очерёдности». В «Шаг» ромбической сетки добавлены 128, 256 и 512 (было 8 … 64); «авто — по проходу» тоже рисует 512 (свой оранжевый); остальное, что берёт шаг (🔤 буквы, 🎞 ромбы в кино, ▶ ромбы-кадры), читает его числом. В 🎞 Ромбах в кино — «ромбы по оси — сверху вниз»: GIF только из ромбов, чья вершина стоит на оси симметрии (строки 0, S, 2S …), по очереди от вершины вниз по столбу, над кадром «ромб по оси i/n · строка r».
Code 35.102 — «надо кадры и в гиф-анимацию», следом «столб надо по горизонтали порубить: берём кадр прогона, режем горизонтально на сколько-то частей, нумеруем, воспроизводим, потом следующий кадр» (про столб по оси, где «целая история» и пингвин). В Аниматрице, над ⧖ Зеркалом — ширина столба (±8 … ±64 столбцов от оси), на сколько частей резать (целиком, 2 … 32) и две кнопки: 🎞 Столб по частям в GIF — части кадра по очереди, 1 (сверху, у вершины) … K, потом следующий кадр, над частью «проход · часть i/K», 0,25 с на часть; ▦ Лист частей — PNG, строка — кадр прохода, в ней пронумерованные части слева направо. Ось — середина первой строки, волна гонится на копии текста тем же правилом, что в 🎞 GIF (холст и счёт не трогаются), следующий кадр — через столько проходов, сколько выбрано у 🎞 GIF, до повтора текста (GIF — не больше 1024 частей всего, лист — не выше ~9000 px). Биты — как на холсте: ◆ ромбы и ◆ вплотную рисуются ромбами (на «все-таки ромбы рулят!»), иначе квадратами; с битами-фигурами без «Фигура 0 / 1» — «1» белым, «0» чёрным на тёмно-сером.
Битмультфильмы v0.009 — «охренеть, тут целая история по вертикальному столбу идёт — пингвин появился»: в «Иероглифах Аниматрицы» — карточка «Столб: пингвин» (stolb-pingvin.png), столб по оси крупно. Столб стоит на оси симметрии кадра, поэтому узор в нём всегда зеркальный — отсюда фигуры и лица.
Битмультфильмы v0.008 — следом пользователь прислал весь кадр (проход 406, кадр GIF): в «Иероглифах Аниматрицы» первой карточкой — «Весь кадр — проход 406» (ieroglify-kadr-406.webp): знаки идут столбиком по оси симметрии через равные промежутки, по бокам — такие же, мельче.
Битмультфильмы v0.007 — «закинь это в битмультфильмы». Пользователь крутил Аниматрицу (Формы: Правило 90, сид 1, 512 строк; ⧖ Зеркало «низ → вверх»; около 406 проходов, повтора нет; биты — ◆ ромбами вплотную) и увидел узоры, похожие на китайские знаки; спросил, есть ли такие. Есть: ряд, две черты и крест — 交 jiāo «пересекаться, обмениваться» (по сути XOR), 父 fù, два креста — 爻 yáo, черта гексаграмм И-цзин; две половины с точками — 兆 zhào, трещины на гадательной кости, «знамение», и рядом 非 «не» и 北 — зеркально. Новый раздел «Иероглифы Аниматрицы» между «Зеркалом» и «Другими треугольниками»: оба снимка (ieroglif-jiao.png, ieroglif-zhao.png, лежат в rezultaty/) с подписями и тем, как узор получить.
Code 35.101 — «перенеси вниз в центр и дай возможность перетаскивать», «не показывает цикл», «а это что за китайские иероглифы в Аниматрице?». Циферблат стоит внизу по центру холста, над строками уведомлений; тянется мышью (место — доли ширины и высоты холста, запоминается, при смене размера окна не уезжает), двойной щелчок — на место; щелчок по нему не ставит паузу. Цикл: на снимке — «пройдено 406 · повтора пока нет» после ⧖ Зеркала: текст стал другим и за 406 проходов не повторился, а длину цикла заранее не узнать — только когда повтор случится; до того циферблат показывает номер прохода и длинную стрелку, подпись теперь «повтора нет», как в строке внизу. «Иероглифы» — не знаки: в тексте только 0, 1 и пробелы; это мелкие куски битовой картинки (ромбы по 8 строк) после XOR-зеркала — узор похож на письмена.
Code 35.100 — «можно прямо на холсте окружность со стрелкой и числом кадра из цикла?». В Аниматрице — галка ⏲ Циферблат цикла на холсте: в правом верхнем углу холста (под увеличением 1·2·4) — окружность с делениями и двумя стрелками («можно две стрелки») — как часы. Кадр — проход волны. Когда повтор найден (🔁 период P), в середине — номер кадра в цикле и «/ P», делений — P (до 128, больше — 12), короткая жёлтая стрелка — (кадр + доля строк, пройденных волной) / P оборота, длинная — оборот за проход, по строкам волны. Пока повтора нет — номер прохода и «цикл ?», видна только длинная. SVG поверх холста, щелчки проходят сквозь; в дзене не показывается, как и увеличение. Номер после 35.99 — 35.100 (у Code номер с сотыми, счёт не обрывается на 99).
Пирамида v0.001 (новая страница oktaedr/Zerkalius-piramida.html) и хаб v0.070 — вопрос «а можно ли вообще расположить единичные [тела] гранями друг к другу так: 1, 2, 3» → «верх, под ней 3, под ней ещё больше, и т. д.», после показа — «в черновики». Одними бипирамидами нельзя: боковые грани у них наклонные, цепочка грань к грани закручивается спиралью, а вокруг ребра пять тетраэдров оставляют щель около 7,4°. Без щелей это делают тетраэдры вместе с октаэдрами: большой тетраэдр режется на тетраэдры остриём вверх — по слоям 1, 3, 6, 10…, — октаэдры между слоями и тетраэдры остриём вниз в провалах, и каждая грань прилегает к грани соседа целиком. На странице пирамиду можно крутить, выбрать число слоёв (1–7), раздвинуть части и спрятать любой вид; тетраэдры вверх раскрашены по слоям цветами нот. Кнопка «Пирамида» — последней в «Черновиках». (Сделано в облачной сессии параллельно с Code 35.8x–35.99 и Zazerkalius v0.40x–v0.440; при слиянии хаб поднят до v0.070.)
Code 35.99 — по снимку экрана (два треугольника сверху, треугольник под стыком) и нумерованной треугольной сетке — «сделай, чтобы можно было вручную и авто двигать вот такое по рёбрам: берём 1 и 3 — зеркало по нижнему ребру и вниз, а 23 как бы ставим на ребро — горизонт 2 выше — и так же вниз зеркало»; на вопрос, как понимать шаг, — «надо разные, все варианты». Под ⧖ Зеркалом — ⟱ Перекат по рёбрам, три варианта: «все вниз» — каждая полоса высотой в треугольник переворачивается через нижнее ребро на полосу ниже, по кругу текста (при высоте ½: 1 и 3 ложатся перевёрнутыми на 22 и 24, а 23, уйдя вниз по кругу, встаёт на место 2 — ровно «на ребро горизонта 2»); «все вниз, XOR» — то же, но отражение ложится на старое по правилу волны; «1, 3, 23 → 22, 24, 2» — только три куска, прочее не трогается. Высота треугольника — ½, ¼, ⅛, 1/16 всех строк. ▶ — шаг вручную, «авто» — шаг каждые 0,15 … 2,5 с (память браузера пишется, когда авто выключили), ↶ — текст, каким он был до первого шага. Геометрия — как у ◇ сетки: вершина — середина первой строки, край — столбец на строку. Меняет сам текст, счёт циклов Аниматрицы начинается заново.
Code 35.98 — по снимку битов ромбами — «как тут у ромбов убрать вообще под 0 отступы?». Ромб ◆ вписан в клетку (ширина символа × межстрочный шаг), и с соседом по диагонали — а в треугольнике Аниматрицы биты стоят именно так, через пробел со сдвигом на полсимвола — сходится только углом: между ромбами щель. В «Биты» добавлено ◆ ромбами вплотную: полудиагонали во всю клетку, ромб вдвое больше — соседи по диагонали сходятся гранью к грани, отступов нет (под радаром — так же, вдвое больше). Соседи в одной строке при этом наезжают друг на друга; прежние ◆ остались как были.
Code 35.97 — «нет, дело не в масштабе, убери всё это новое с масштабом». ⧉ Слои масштаба (35.89, след — 35.96) сняты целиком: группы в 🧬 Слоях больше нет, отрисовка слоями и её память — тоже (ключи zcode_scalelayers_v1 / v2 в браузере просто не читаются). Прочее остаётся: 🔍 Авто-масштаб с ⌖, ⧉ ступени и «100 % =» в плеере, 1·2·4 в углу, щелчок по холсту — пауза масштаба. Прежние версии со слоями — в архиве, 35.89–35.96.
Code 35.96 — по снимку ⧉ Слоёв масштаба — «тут не надо больше 100 %, но надо кадры так, чтобы каждое наложение появлялось тогда, когда настоящий масштаб ушёл». Слои масштаба стали следом: ступени — доли «Масштаба», не больше 100 % (100, 50, 25, 12,5, 6,25, 3,1 — галками, какие оставлять); пока идёт авто-масштаб (или ⧉ ◀ ▶ в плеере), в момент, когда масштаб уходит со ступени, её кадр снимается — отдельной отрисовкой ровно на её масштабе, от вершины, если ⌖, — и остаётся слоем поверх живого кадра; вернулся масштаб на ступень — её слой убирается; прыжок через ступени (новый круг) — след стирается, так же при смене «Масштаба», направления и размера холста. Смешение и 🎨 — как были. Прежний вариант 35.89 (÷4 … ×8 от текущего, все слои живьём каждый кадр) снят. Лишняя отрисовка — одна, в момент ухода со ступени, а не на каждый кадр. Тем же заходом — «щелчок по экрану — остановка, пауза масштаба»: при включённом 🔍 Авто-масштабе щелчок по холсту ставит на паузу и пускает сам масштаб (⏸ / ⏵), плеер при этом идёт; без авто-масштаба щелчок, как прежде, — плеер.
Code 35.95 — по снимку плеера — «включение автомасштаба сюда надо». Кнопка-включатель там была, но одним значком 🔍 — не читалась: теперь подписана «🔍 Авто» (зелёная обводка — включён). Под ней новая строка — всё включение авто-масштаба в плеере: направление (↗ ↔ ↘ ⧉ ∞), ⌖ зум от вершины и 1·2·4 увеличение в углу. Это двойники тех, что в «Виде»: меняются вместе, настройки те же.
Code 35.94 — по двум снимкам: «число крутится тут — это настройка, надо отдельно показать крутящееся» (поле «Сдвиг Слоя 2») и «когда до 100 %, то надо следующий шаг по кругу — смотря как в настройке какое движение: туда-сюда, цикл» (⧉ в плеере). Поле сдвига теперь — только настройка: что вписали, то и стоит (и запоминается); нынешний сдвиг, который меняется на ходу, — рядом подписью «сейчас N». ⧉ ▶ — следующая ступень по направлению из 🔍: «↗ по кругу увеличивать», Квадра, ∞ — вверх, за 100 % снова самая мелкая; «↘ по кругу уменьшать» — вниз, за самой мелкой — 100 %; «↔ туда-сюда» — у края разворот, и дальше в обратную сторону. ◀ — шаг назад по тому же правилу.
Code 35.93 — по снимку Dual Core — «тут наложение слоёв — как задать число строк». Никак: Слой 2 только уезжал на «множитель» строк за каждый шаг плеера, и сколько строк между слоями, нигде не было видно. Теперь под множителем — поле «Сдвиг Слоя 2, строк»: вписали число — Слой 2 встаёт ровно на столько строк от Слоя 1 (от замороженной строки, если ⚓, иначе от текущей), отрицательное — в другую сторону; пока плеер идёт, поле показывает нынешний сдвиг (по кругу текста, от −n/2 до n/2).
Code 35.92 — «пусть где-нибудь в углу, если включена галка такая, показывает текущее увеличение только так: 1, 2, 4, 8» и следом «в дзен-режиме не надо». У 🔍 Авто-масштаба (справа от ⌖) — галка 1·2·4: в правом верхнем углу холста (панель справа — в левом) крупно стоит текущее увеличение — 1 у самой мелкой ступени, дальше 2, 4, 8 …, самое большое — у «Масштаба» (100 %); между ступенями — ближайшая. В дзене не показывается. Галка запоминается.
Code 35.91 — по снимку списка направлений — «так же во всех — максимальный это тот, что вручную стоит; было бы неплохо ещё прямо в плеере ползунок масштаба крутить — максимум задавать». Потолок — ручной «Масштаб» — во всех направлениях был уже с 35.90. Теперь в ▶ Плеере под строкой ⧉ — строка «100% =» с самим ползунком «Масштаб» (двойник того, что в «Виде», ходят вместе; колесо над холстом их тоже двигает) и его числом. Где он стоит — это 100 %. Сдвинули его на паузе — ⧉ остаётся на своей ступени: была 50 % — будет 50 % нового; на ходу авто-масштаб сразу берёт новые пределы.
Code 35.90 — «доходит до 64 и топчется там», потом «я ставлю ползунок на какой-то размер — это 100 %, от него надо считать; про пиксели я не знаю вообще ничего». Масштаб авто-зума и ⧉ теперь считается от ползунка «Масштаб»: где он стоит — это 100 %, ступени вниз вдвое — 50 %, 25 %, 12,5 %, 6,25 %, 3,125 % … (самая мелкая — не мельче одного пикселя). ⧉ в плеере ходит по этим ступеням, число справа — только в процентах; Квадра — по ним же рывками, ↗ ↔ ↘ — от самой мелкой до 100 %, ∞ — от 50 % до 100 %. Подпись «Масштаба» больше не бегает вместе с авто-зумом — там стоит сам ползунок; ⧉ Слои масштаба внизу тоже пишут проценты. Промежуточный вариант того же захода — потолок 4096 px — пользователь отверг («ЗАЧЕМ?»): «Масштаб» и есть потолок.
Code 35.89 — по снимку раздела 🧬 Слои — «нужно наложение масштабов как слои». В 🧬 Слоях под Dual Core — ⧉ Слои масштаба: тот же кадр рисуется сразу на нескольких масштабах — ÷4, ÷2, ×1, ×2, ×4, ×8 от текущего (ползунок «Масштаб», авто-масштаб или ⧉ в плеере; по умолчанию ÷2, ×1, ×2), все от вершины — первая строка с «1» в центре экрана, — и слои складываются: мелкий снизу, крупный сверху. Смешение: «свет» (screen) — слои светятся вместе, «XOR» (difference) — где слои совпали, гаснет, «поверх» — крупный сверху на 50 %. 🎨 — каждый слой умножается на цвет своей кнопки (голубой ÷4, зелёный ÷2, белый ×1, жёлтый ×2, красный ×4, лиловый ×8), чёрное остаётся чёрным. Внизу — масштабы слоёв числом. Вместе с авто-масштабом слои плывут все разом — ромбы разных размеров видны одновременно. Каждый слой — отдельная отрисовка кадра; сдвиг холста и авто-масштаб после кадра — как были.
Code 35.88 — «нужен ползунок, чтобы при стрелке увеличил ×2, потом ещё ×2, и числом, и назад и вперёд — кнопки как в плеере, расположить так же в плеере». В ▶ Плеере под строкой 🔍 — строка ⧉: ◀ — масштаб ÷2, ▶ — ×2 (кнопки того же вида, что шаги плеера), между ними ползунок ступеней 1, 2, 4, 8, 16, 32, 64 px, справа — число. Ступень ставится через авто-масштаб: он включается и встаёт на паузу, поэтому работает ⌖ — зум от вершины, а ползунок «Масштаб» не трогается. ⏵ — масштаб пойдёт дальше от этого кегля, не прыгая (фаза подстраивается под кегль; у ∞ круг начнётся с него). Пока авто-масштаб идёт сам, ползунок и число показывают его ступень. У ползунка нет своих ◂ ▸ — стрелки здесь ◀ ▶.
Code 35.87 — по снимку строки с двумя ползунками (1 и 189) — «че это за числа??? сделай от мини до максимума просто всегда». Ползунков «от» / «до» больше нет: авто-масштаб всегда ходит по всему диапазону ползунка «Масштаб», 1 … 100 px. ⧉ Квадра — 1, 2, 4 … 64 px и снова 1. ∞ — от текущего «Масштаба» до двух таких (от 1 px круг ∞ был бы 1 → 2 px, смотреть нечего); колесо мыши на ходу меняет, откуда он идёт. Старые «от» / «до» из памяти браузера не читаются.
Code 35.86 — по двум снимкам с ◇ сеткой — «Квадра-масштаб сделаем: у нас минимальный ромб 8, потом 16 — так же пусть и масштаб рывками увеличивается». В 🔍 Авто-масштабе направление ⧉ Квадра — рывками ×2: кегль не плывёт, а встаёт ступенями — «от», 2·«от», 4·«от» … пока не больше «до» (ступеней не меньше двух), с последней — снова «от». Ползунок скорости здесь — секунд на ступень. Ромб 8 после рывка встаёт размером прежнего 16, 16 — прежнего 32. Зум идёт от вершины (⌖), без ⌖ — в центр экрана, как у ∞; ⏸ останавливает на ступени.
Code 35.85 — по снимку строки 🔍 Авто-масштаба — «тут бы скролы, два в одну строку». Пределы «от» и «до» теперь не поля с цифрами, а два ползунка в одну строку под галкой (1–200 px), число — справа от каждого; масштаб подхватывает их на ходу. В первой строке остались 🔍, ⏸ и ⌖.
Code 35.84 — «так это не бесконечность: увеличивается до макс, потом снова в 1 — это не то», «там уже есть нарезка на ромбы разного размера», «как этот масштаб на паузу поставить — дай кнопку». Почему скачок был виден: в 35.81 круг ∞ брался по «до / от» — при «от» 1 это ×32 и больше; и даже при ×2 кадр Аниматрицы повторяет себя лишь примерно, а символы на круге вдвое мельчают. Теперь ∞ — всегда ×2 (от «от» до двух «от», «до» не участвует), и шов закрыт наплывом: во второй половине круга поверх кадра проявляется тот же вид на кегле, с которого начнётся следующий круг, к концу круга виден только он — круг замыкается кадр в кадр. Так же — у «↗ / ↘ по кругу» (наплыв на «от» / «до»); «туда-сюда» шва не имеет. С ◇ ромбической сеткой это и есть бесконечная нарезка: крупные ромбы растут, из них проступают вдвое мельче. Наплыв — два кадра на экранный кадр только во второй половине круга. ⏸ пауза масштаба — в плеере рядом с 🔍 и в «Виде» рядом с «до»: кегль стоит, плеер и Аниматрица идут дальше, ⏵ — масштаб снова пошёл; включение и выключение 🔍 паузу снимают.
Code 35.83 — по снимку окна ▶ Плеер — «сюда надо вынести кнопку и ползунок автозума». Под скоростью плеера — строка 🔍 Авто-масштаба: кнопка 🔍 (включить / выключить; пока идёт — зелёная обводка) и ползунок его скорости с подписью в секундах. Это двойники кнопки и ползунка из «Вида»: ходят вместе с ними, настройки те же. Пределы «от» / «до», направление и ⌖ остались в «Виде» — в плеер вынесено только то, что трогают на ходу.
Code 35.82 — «масштаб смотреть должен точку-центр — это 1 строка и в ней всегда 1, и зум от неё делать при любом повороте». В 🔍 Авто-масштабе галка ⌖ (справа от «до», включена): вершина текста — первый непробельный символ первой строки, та самая одна «1» — стоит в центре экрана, и масштаб идёт от неё. «При любом повороте»: пока ⌖ стоит, барабан строк при Play картину не сдвигает (первая строка держится посередине, строки не скользят), под радаром вершина — на первом, внутреннем кольце, и сдвиг берёт её угол с учётом 3D-вращения — радар крутится вокруг неё. Сдвиг считается каждый кадр по той же раскладке, что рисует текст (по центру / влево / вправо). Сняли ⌖ или выключили авто-масштаб — кадр пересчитывается ещё раз на кегле ползунка, барабан ставится туда же, где его держал ⌖, и картина не прыгает. На снимках 35.81 центр — как раз вершина: над ней по кругу видны последние строки текста (два треугольника), под ней — сам треугольник от первой строки.
Code 35.81 — по трём снимкам одного и того же треугольника на разном масштабе — «а что если увеличивать масштаб и аниматрицу», «постоянно увеличивать весь цикл». В 🔍 Авто-масштабе новое направление — ∞ бесконечно увеличивать. Прежнее «↗ по кругу» шло от «от» до «до» (8 → 40, в 5 раз) и прыжком назад — прыжок виден. Здесь за круг масштаб растёт ровно в степень двойки (×2, или ×4, ×8 — ближайшая к «до / от»), а треугольник Серпинского, как и кадры Аниматрицы, при ×2 повторяет сам себя — возврат к «от» глазу не заметен, и масштаб растёт весь цикл не останавливаясь. Увеличение идёт в центр экрана, а не в середину текста: сдвиг холста растёт вместе с кеглем, на круге падает вместе с ним, и точка под центром стоит на месте. Поэтому нужную точку — вершину или стык трёх треугольников, как на снимках, — достаточно перетащить в центр. Включение и выключение не сдвигают картину. Остальные направления не менялись.
Code 35.80 — «вместо 1 и 0 белые и чёрные квадраты… и ромбы» и «скорость масштаба увеличь». В «Виде» — Биты: цифрами / ■ квадратами / ◆ ромбами: «1» рисуется белой клеткой, «0» — чёрной (с галкой «Фигура 0 / 1» в «Цвете» — её цветами); квадрат занимает всю клетку — ширину символа × межстрочный шаг, с запасом в полпикселя, чтобы между клетками не было щелей; ромб вписан в клетку вершинами в середины её сторон. Под радаром — квадрат или ромб повёрнут вдоль кольца, как был повёрнут символ. Остальные символы остаются буквами; яркость Δ и «Скрыть статику» работают как прежде. Чёрный «0» на чёрном фоне холста не виден — для него «Фон холста» в «Цвете». Окно ▶ Ромбы-кадры при битах фигурами тоже рисует «0» чёрным и «1» белым. Авто-масштаб: ползунок стал скоростью (вправо — быстрее) и идёт по степени от 60 до 0,05 с на путь «от → до» — до 35.80 самое быстрое было 0,5 с; подпись по-прежнему в секундах. Настройки авто-масштаба записаны под новым ключом — прежние секунды иначе прочлись бы как деления скорости.
Code 35.79 — «туда-сюда менять масштаб при аниматрице и просто при статике: задаю пределы масштаба, направление — по кругу увеличивать, туда-сюда, по кругу уменьшать… и скорость». В «Виде» под «Масштабом» — 🔍 Авто-масштаб: «от» и «до» в px, направление (↗ по кругу увеличивать — дошёл до «до» и прыжком к «от»; ↔ туда-сюда — разворот на краях; ↘ по кругу уменьшать) и ползунок скорости — секунд на путь от «от» до «до». Прежнее 🫁 Дыхание (в «Движении») этого не давало: у него ни пределов, ни направления, и оно живёт только при идущем плеере. Кегль идёт по степени (px = от · (до/от)^t), а не ровным шагом: на мелком масштабе 1 px — это уже скачок в разы, на крупном — незаметно, по степени движение выглядит ровным. Кегль дробный и живёт только в отрисовке — ползунок «Масштаб» не трогается, выключили — вернулся его масштаб; включение стартует с текущего масштаба, если он внутри пределов, без скачка. На стоящем холсте у авто-масштаба свой таймер кадров; при идущем плеере рисует плеер — кадр на каждый экранный кадр, как у Дыхания. Настройки и галка переживают F5 (своя запись в памяти браузера, отдельно от снимка сессии и ★-сцен).
Code 35.78 — «Исследование», раздел 5 (проход 155 с красными линиями через 32 строки): «Ромбы-„кадры“ — как их построчно прогнать на разной скорости, надо прямо в Code». До этого ромбы сетки можно было только скачать GIF-ом (🎞 Ромбы в кино, 📦 Все ромбы цикла) — вживую их не было видно. В «Виде» под 📦 — кнопка ▶ Ромбы-кадры вживую — по рядам: окно поверх холста (тянется за шапку). «По рядам»: строка окна — ряд ромбов сетки, тот самый ряд между красными линиями (ряд e — e + 1 ромб, на сцене «1» при шаге 32 это 1, 2 … 6 — всего 21); каждый ряд листает свои ромбы слева направо по кругу, со своей скоростью. Скорости: «одна» — все ×1; «круг вместе» — ряд с меньшим числом ромбов медленнее, все ряды замыкают круг разом; «ниже медленнее» ×(e + 1) и «ниже быстрее». Сверх этого щелчок по ряду — вдвое медленнее, правый щелчок — вдвое быстрее (от ×1/16 до ×16), ⟲ — всё с начала и ×1. «Подряд» — один ромб, все ромбы кадра ряд за рядом, как GIF «ромбы кадра подряд», но вживую. Мс на кадр — ползунком (20…2000). Ромбы режутся из текста на каждом кадре окна тем же способом, что у ◇ сетки (вершина — середина первой строки, шаг сетки, «авто» — 32), поэтому при идущей Аниматрице они меняются вместе с волной; текст, холст и счёт Аниматрицы окно не трогает. Как понят «построчно на разной скорости» — ряды ромбов, каждый со своей скоростью; если имелось другое (например, сами строки текста), — переделать.
Гранидус v0.068 и Zazerkalius v0.439 — по снимкам окна «◆ Гранидус»: голубая черта слева вверху, раздел «Вид», ушедший за правый край, и полоса «⇄ строки → грани | ↗» — «и это тоже ненужная полоса». В окне Zazerkalius у Гранидуса больше нет боковых панелей: v0.067 снял только магнит, а сами панели остались, и голубая черта была левой из них. Теперь все разделы плавающие: те, что лежали в панелях (по умолчанию или в старой раскладке), встают столбиками — левой панели от левого края, правой от правого, не влезает по высоте — следующий столбик; через мгновение столбики выравниваются ещё раз по окончательной высоте. Плавающий раздел целиком в окне по ширине — за правый край не уходит, и при сужении окна тоже. Узкого режима (листа снизу, ⚙) в окне Zazerkalius нет — окно почти всегда уже 720 px; стили узкого режима отнесены только к отдельной странице (:where(html:not(.zzemb)) — сила правил та же). В Zazerkalius кнопки «⇄ строки → грани» и «↗» переехали в шапку окна «◆ Гранидус», перед ⛶; полосы под шапкой нет — место Гранидусу. Проверено в безголовом Chrome с чистой памятью: панели пусты, шесть разделов плавают в окне 700 px, ошибок нет.
Гранидус v0.067 — по снимку окна «◆ Гранидус» в Zazerkalius — «тут окна закрепляются ещё и справа, слева — два поля есть невидимых, убери их». В окне Zazerkalius (?zz) у краёв больше нет полос магнита, которые забирали отпущенный раздел в левую или правую панель: раздел остаётся плавающим там, где его отпустили, и прилипает только к соседним разделам и краям окна. Отдельная страница Гранидуса — как была.
Zazerkalius v0.438 — по снимку развёртки Зеркалидуса с Серпинским — «добавь свою развёртку: из имеющихся создаёт копию, потом при клике по треугольнику просто копирует его по всем трём граням — зеркалит; если по грани ткнуть — по этой грани зеркалит». В «✦ Развёртке» — кнопка + своя: копия выбранного варианта (обычного или своего) становится своей развёрткой — миниатюрой в пунктирной рамке после шести обычных. На ней щелчок по треугольнику кладёт его зеркала через все три ребра (туда, где пусто), щелчок у ребра — зеркало только через это ребро, правый щелчок — убирает треугольник. Зеркало через основание меняет род грани — верхняя (голубая, биты как есть) ↔ нижняя (золотая, биты инвертированы), как U0 ↔ D0 через экватор; через боковое ребро род тот же, как U0 ↔ U1. Биты строк ложатся зеркально — узор (Серпинский и любой другой) отражается. Правый щелчок по миниатюре своей — удалить её. Осей и креста центра у своей нет; развёртка сама вписывается в окно.
Zazerkalius v0.437 — «△ Сетка»: «дать выбирать цвет обводки каждой группе, и внутри неё сетку или нет, и сетку вне групп», «ставить буквы-символы на группы», «сделай сетку сразу на всё окно», «и масштаб до реального менять», «ставить светящиеся точки в узлы — с диаметром задаваемым», «рисовать чисто обводкой разного цвета». Сетка теперь на всё окно: рядов и треугольников в ряду — сколько влезает (поля «ряды / в ряду» и ручка снизу сняты — рядов больше, если окно выше); 🔍 масштаб — от настоящего размера (1:1, два ряда = кнопка 24 px) до крупного. Группа — касающиеся треугольники одного цвета; ☝ (или Alt + щелчок) выбирает её, и появляется строка «группа»: своя обводка, ▦ внутри — сетка между её треугольниками, символ посередине (буква, знак), ↺ — снять своё. Настройки лежат на самих треугольниках и едут в сцены. ▦ вне групп — бледная сетка пустых треугольников (выключить — пусто). ✦ — светящаяся точка в узел (вершину) сетки, диаметр ⌀; ╱ — линия по рёбрам сетки, щелчком и протяжкой, толщина ═; цвет у обоих — из палитры, пока инструмент горит; тот же цвет ещё раз или правый щелчок — убрать. Размеры точек и линий — в пикселях настоящего размера. Живой вид показывает только занятую часть сетки — с группами, символами, линиями и точками. «⧉ в буфер» пишет и группы со своими настройками, точки (линия:узел) и линии (узел–узел).
Zazerkalius v0.436 — «обводка и фон — в построении, а не только в результате, и там удалять линии обводки; обводка по группам — сразу все касающиеся одного цвета треугольники обводит только граничной рамкой». Фон и обводка «△ Сетки» (строка над сеткой) теперь общие для сетки построения и живого вида. В сетке закрашенные треугольники — без своих линий, обводка по режиму: ▵ каждый — все рёбра (и пунктир средней черты); ⬡ по группам — только граница каждой группы касающихся треугольников одного цвета, линией потолще; без обводки — ни одной линии. Пустые треугольники остаются бледной сеткой — видно, куда щёлкать.
Zazerkalius v0.435 — по снимку низа «△ Сетки» — «тянуть за границу вниз-вверх — ± число строк». Под последним рядом — полоса-ручка (две черты); над ней курсор ↕, и её можно тянуть: рядов становится столько, сколько целых рядов до мыши (1–12). Закраска ушедших рядов не стирается — вернёшь ряды, вернётся и она.
Zazerkalius v0.434 — «надо только реальный размер показать, также менять фон, и обводку — цвет и, возможно, отключать её», «также границы по группам цветов». Живой вид «△ Сетки» — только в настоящем размере (×2 убран). Над ним: фон и обводка — поля цвета; кнопка режима обводки по кругу: ▵ каждый треугольник → ⬡ по группам (только рёбра, за которыми другой цвет или пусто, — контур каждой группы одного цвета) → без обводки; ↺ — фон и обводку как были (по теме). Обводка рисуется поверх заливки.
Zazerkalius v0.433 — по снимку «△ Сетки» со сценой 2 — «можно сразу вживую смотреть, как будет выглядеть?». Под сеткой — живой вид: та же сетка кнопками, в настоящем размере (два ряда — 24 px, как у кнопок групп) и вдвое крупнее, на фоне панели групп. Пустые треугольники — фон, закрашенные — цветом кнопки: серый — светлая кнопка, золотой — горящая, красный — как стрелка-стоп, остальные — их цвет, приглушённый так же; внутри — бледная сетка, как в кнопках. Меняется сразу, пока красишь, и при открытии сцены.
Zazerkalius v0.432 — «сделай окно с этими треугольниками, чтобы можно было там сделать сцены: выделяю цветом какие-то, сохраняю сцену 1, потом 2…» (после разговора, что значит «))» в ряду «Звука»). Новое окно △ Сетка (кнопкой в шапке, за Развёрткой): ряды равносторонних треугольников, как в кнопках — ряд в полвысоты кнопки, два ряда — кнопка, их средняя черта пунктиром; по умолчанию 2 ряда по 25. Цвет — из восьми (серый, золотой, красный, голубой, розовый, зелёный, сиреневый, белый) и ластик ⌫; щелчок красит, тот же цвет ещё раз или правый щелчок — стирает, протяжкой — много разом. Номера треугольников (№) — по рядам с 1. «+ сцена» — сохранить новой (1, 2, …), «💾 в N» — перезаписать выбранную, щелчок по номеру — открыть, правый — удалить. «⧉ в буфер» — все сцены текстом: по цветам номера треугольников — чтобы вставить в сообщение и показать, как должно быть. Сцены хранятся с остальными настройками страницы.
Zazerkalius v0.431 — «последняя нажатая кнопка двойная — цвет забирает». Стрелка направления — это и есть последняя нажатая стрелка — снова двойная «))» (как в v0.429) и горит; во время игры она с ❙ в ◆ одного цвета и мигает. Нажатая красная (стоп во время игры) тоже становится последней нажатой: звук встаёт, направление переходит на неё — она двойная и горит, следующий ⏵ играет в её сторону.
Zazerkalius v0.430 — «начало: тишина, стрелка вправо горит одна, в середине значок плей (ноту убери); нажать плей — стрелка и плей объединятся цветом и станут !) — вертикальная палка и стрелка, типа пауза со стрелкой; нажать на них — пауза» и «при плее другая стрелка становится красной — это стоп». Ряд «Звука» теперь: стоп — горит одна стрелка направления (одинарная, двойная «))» из v0.429 снята), в ◆ — ⏵, щелчок по ◆ — играть сразу, с того же места, в сторону горящей стрелки; стрелки на стопе — шаг. Играет — в ◆ вертикальная черта ❙, ◆ и стрелка направления одного цвета и мигают вместе («!)» — пауза со стрелкой); щелчок по любой из них — пауза; другая стрелка — красная, щелчок — стоп (место то же). Пауза — ⏸, горит; стрелка — играть в её сторону, ◆ — стоп. Значок ◆ на стопе — ⏵, а не ▶: по ▶ код узнаёт кнопку-стрелку и сделал бы ◆ стрелкой.
Zazerkalius v0.429 — «стрелку, что нажата последней, дополни — будет две стрелки „))“, и обе мигают фоном», «убери пробел между левой стрелкой — вплотную её к стопу». Широкая стрелка направления (5t) теперь читается как две стрелки по 4 треугольника: вторая остриём в выемке первой, по стыку — черта цветом панели; пока звук играет, мигают обе (черта остаётся поверх мигания). Пробел между ◀ и ◆: соседняя кнопка заходит в выемку правилом «кнопка сцепки + кнопка сцепки», а между ◀ и ◆ в разметке стоит спрятанная ♫ — правило не срабатывало, ◆ стояла на глубину острия правее. Теперь «каждая следующая кнопка сцепки» — спрятанные не мешают. Заодно правило пользователя: всё по горизонтали — только из сетки треугольников (шаг t = s / 2 ≈ 6,93 px), никаких других размеров и отступов; на остальные группы — после его «да».
Zazerkalius v0.428 — «(стрелка) не мигает». Мигание делалось анимацией цвета фона, а у стрелки направления фон задан правилом «включённая — золотая» с !important — такое правило сильнее анимации, и она не была видна (у ◆ прежде так же). Теперь мигает отдельный золотой слой поверх фона (под значком и сеткой, по форме кнопки) — с фоном не спорит.
Zazerkalius v0.427 — «стрелка мигать должна фоном». Пока звук играет, фоном мигает стрелка текущего направления (◀ или ▶); ◆ не мигает — горит (играет или пауза) и показывает состояние значком.
Zazerkalius v0.426 — «(!Стоп) — стрелка 4 треугольника, ромб 2 и снова стрелка 4, итого 10». Кнопка ◆ Стоп — не ромб из двух треугольников (v0.425 так понял «!»), а из десяти, k = 3, как на рисунке «()()()»: «(» — острие-стрелка из четырёх, «!» — ромб из двух посередине, «)» — стрелка из четырёх (≈ 41,6 px). Значок в ней снова обычного размера.
Zazerkalius v0.425 — «( ( (!Стоп) ) )» (скобка — стрелка, «!» — ромб из двух треугольников, пробел отделяет кнопки), «стоп — выполняет стоп и паузу; при стопе стрелки — шаг, при паузе — плей; пауза — нажать — стоп, ничего не меняется; плей не нужен», «стоп смещается в сторону другой стрелки, а текущая нажатая стрелка расширяется», «как запустить из стопа — поставить паузу». Ряд «Звука» — ◀ ◆ ▶: кнопка ♫ убрана; ◆ — ромб из двух треугольников, показывает состояние (■ стоп, ⏸ пауза — горит, ♫ играет — мигает). ◆: играет → пауза, пауза → стоп (место то же), стоп → пауза. Стрелки: стоп — шаг в свою сторону (стоп остаётся), пауза — играть в свою сторону, играет — играть в свою сторону. Стрелка текущего направления шире (≈ 35 px вместо 21), ◆ от этого сдвигается к другой.
Zazerkalius v0.424 — «границы не делай, фоном подсветку меняй». У кнопок сцепки («Звук») больше нет ни контура, ни скосов — только заливка (через одну темнее и светлее) и сетка треугольников. Состояние — заливкой: наведение — сиреневая, включённая — золотая, пока звук играет — заливка мигает (вместо мигающей рамки).
Zazerkalius v0.423 — по рисунку «(стоп) = ()()(), 10 треугольников» — «тут правильно, а на странице». Внутри кнопок сцепки теперь видны сами треугольники, как на рисунке: тонкая сетка — средняя черта и косые под ±60° через каждую вершину на средней черте, от острия или выемки кнопки. Рисуется картинкой SVG пятым слоем фона, рамка кнопки её обрезает; ставит joinTag при каждой раскладке. И «на странице длинная какая-то СТОП»: ■ получала ширину обычной кнопки (99 px) и выходила ≈ 97 px — теперь длина задана прямо, data-k="3": ()()(), 10 треугольников, ≈ 41,6 px, как на рисунке. Сетка в стрелках строилась до того, как стрелка получала свою ширину, и выходила сжатой — исправлено. И «звук — уменьши длину, оставь там только символ, без текста»: на кнопке только ♫ / ⏸ / ⏯ (слова — в подсказке), длина data-k="2" — ≈ 34,6 px.
Zazerkalius v0.422 — «(стоп) — из скольких собран так: ()()()?» (ответ: не из целых — ≈ 3,5 треугольника по ряду; «()()()» — длина k = 3) → «2 — подгони все под целые треугольники». Кнопки сцепки теперь длиной в целое число треугольников: в глубинах острия — чётное у кнопок с концами одного рода (остриё–остриё: k треугольников по ряду, 4k − 2 всего), нечётное у кнопок «остриё–выемка», как стрелка; берётся ближайшее к прежней ширине. «Звук»: ■ — ()()(), k = 3, 10 треугольников (≈ 41,6 px), «звук» — ≈ 104 px, стрелки — по 4.
Zazerkalius v0.421 — по снимку ряда «Звука» — «без пробелов соедини, различи фоном». Кнопки сцепки встают остриём ровно в выемку (прежде оставался волосок в 2 px — он и читался пробелом), а различаются фоном: через одну светлее. Выключенная кнопка в сцепке (■, пока звук не идёт) больше не полупрозрачная — на её месте была как будто дыра; теперь бледная только надпись.
Zazerkalius v0.420 — «( — это 4 треугольника, не удлинённая, по минимальной длине». Стрелки в сцепке (◀ и ▶ «Звука») — шеврон ровно из четырёх треугольников минимальной длины: ширина — три глубины острия (≈ 20,8 px при высоте 24), а не всё место полкнопки. Остриё и выемка — прежние, соседние кнопки встают к ним вплотную.
Zazerkalius v0.419 — «)( )звук((Стоп)) — вот так буду обозначать», «((звук((Стоп)) — да». Сцепка: кнопки ряда стоят вплотную, остриё одной входит в выемку соседней (между ними волосок). Запись краёв — скобками, по знаку на край слева направо: «(» — край острием влево (у левой кнопки на нём выемка, у правой — остриё), «)» — острием вправо. Остриё 120°, глубина — как у кнопок из треугольников. Первая — строка «Звука»: ◀ звук ■ ▶ = «((())» — стрелка ◀ с выемкой, в неё входит «звук», в его выемку — ■ Стоп, остриё Стопа — в выемку ▶. Стрелки в сцепке без знака. Другие ряды — так же, одной записью у блока (data-ends).
Zazerkalius v0.418 — по снимку «◀ ⏯ дальше ■ ▶» — «устрани пробелы, соедини… стоп, сделай: добавь слева два треугольника». Горизонтальные стрелки — шеврон уже из шести треугольников: два добавлены со стороны выемки (у ▶ — слева, у ◀ — справа), стрелка длиннее (≈ 35 px вместо 21) и ближе к соседней кнопке. ▲ ▼ — по-прежнему из четырёх: шесть по высоте кнопки не влезают.
Zazerkalius v0.417 — по снимку шеврона со знаком ▶ внутри — «теперь значки им не нужны». У кнопок-стрелок (шевронов из четырёх треугольников) знак стрелки больше не виден: форма и есть стрелка. Сам символ в кнопке остался (прозрачным) — по нему кнопка узнаётся как стрелка нужной стороны.
Zazerkalius v0.416 — по снимку развёртки Зеркалидуса — «попробуем кнопки собирать из таких: вот стрелки, одна стрелка из 4 треугольников, края кнопок такие же», «скосы под 120, остриё тупое, 120», «цельные треугольники». Кнопки групп — из целых равносторонних треугольников: высота кнопки — два ряда по полвысоты, сторона ≈ 13,9 px при 24. Кнопка — полоса треугольников с остриём 120° на концах (все углы 120°), длина — сколько целых треугольников влезает в её ширину, по центру (у «одной» в 99 px — 7 треугольников по средней черте). Стрелка ◀ ▶ ▲ ▼ — шеврон ровно из четырёх треугольников, как на развёртке: остриё 120° в сторону стрелки, с другой стороны выемка, по центру своего места. Размеры считает rhombTag для каждой кнопки. Прежде (v0.401–v0.404) — острия 90° и четверти креста.
Zazerkalius v0.415 — по снимку «◯ Конус» — «за заголовком текст какой-то, подвинь его вправо». Строка 3D-вида конуса («поворот · наклон · высота») рисовалась в левом углу холста — под заголовком окна. Теперь она начинается сразу за заголовком; на странице одного конуса (без шапки окна) — у края, как было.
Zazerkalius v0.414 — по снимку «⏺» в шапке — «видео, дубль вверху — удалить». Общая кнопка записи с выбором окна (v0.268: поле строк, конус, вид, пирамида) из шапки убрана (скрыта); у конуса запись — своими кнопками, как была. Код записи остался — запись поля строк, вида и пирамиды вернётся вместе с кнопкой, если понадобится.
Zazerkalius v0.413 — по снимку страницы «◯ Конус» (?solo=cone) — «у конуса убери вверху отдельное какое-то поле». Полосы кнопок со своей чертой снизу больше нет: холст конуса — на всю страницу от самого верха, группы кнопок лежат поверх него, как в окне конуса на общей странице. Пустые места между группами мышь пропускают к конусу — крутить можно и там.
Zazerkalius v0.412 — по снимку «⇆ поле справа» — «строки — слева». Кнопка говорит о строках и о том, куда их переставит щелчок: пока строки справа — «⇆ строки слева», пока слева — «⇆ строки справа». Горит, как прежде, пока строки справа.
Zazerkalius v0.411 — по снимку «✎ Правка» — «убери». Кнопки режима правки панелей в шапке больше нет (скрыта). Сам режим в коде остался: свои названия и места кнопок, сделанные в нём раньше, держатся; вернуть кнопку — снять одно правило CSS.
Гранидус v0.066 — по снимку «⌖ Вид сверху» — «это лишняя». Кнопки больше нет: она ставила не вид сверху, а наискосок (поворот 0,6, наклон −0,42), а настоящий вид сверху — картинка «сверху» в розе видов. Из методички строка убрана.
Гранидус v0.065 — «подсветку граней — откл (вкл)». В «Картине» — кнопка ▰ Подсветка граней (по умолчанию вкл, помнится): полупрозрачная заливка граней цветом верха и низа (в раскраске «каждая своим» — цветом грани) и внутреннего основания. Выключишь — грани прозрачные, тело — одни рёбра и биты.
Гранидус v0.064 — по снимку светящейся головки ноты на нуле — «пусть на нулях не светится, а бледным будет». Головка ноты (бит, который сейчас читает нота) на 1 горит, как прежде, со свечением; на 0 — бледная (около четверти яркости), без свечения: на нуле нота молчит, и головка теперь это и показывает.
Zazerkalius v0.410 — по снимкам «✦ развёртка» и шапки с «◆ Гранидус», «◯ Конус» — «сюда». Окно развёртки теперь закреплённой кнопкой в шапке, сразу за Гранидусом (у кого Гранидуса в шапке нет — в конце); добавляется один раз, открепишь правым щелчком — само не вернётся. Кнопка «✦ развёртка» в окне Гранидуса убрана. Кнопки окон в шапке теперь достают окно и из списка окон слева (при «⇆ поле справа»), прежде свёрнутое туда окно они не показывали.
Гранидус v0.063 — по снимкам «Вида» и «Цветов» — «это в Картину всё», «туда же». В раздел 🎲 Картина переехали: 01 Биты, ⠿ Точки, □ △ ▷ Клетки, ◇ Рёбра, △ Скрытые рёбра, ползунки «Размер цифр» и «Свечение бит» и всё из «Цветов» (схема 🎨 и цвета 0 и 1). Раздела «Цвета» больше нет. В «Виде» остались стороны света, оси, «⌖ Вид сверху», виды картинками, «◭ Грань» и счёт совпадений; вращение — своим разделом (v0.060).
Гранидус v0.062 — по снимку пунктирного прямоугольника в окне — «эти поля убери». Это пустая боковая панель: она проступала пунктиром всё время перетаскивания раздела, а если мышь отпустили за рамкой (в Зазеркалиусе), Гранидус конца перетаскивания не узнавал, и поле так и висело. Теперь пустая панель появляется только когда магнит указывает на неё (светится), а перетаскивание кончается само, если кнопка мыши уже отпущена, ушли из окна или окно потеряло фокус.
Zazerkalius v0.409 — «клик вне поля окна — скролл листает окна». Колесо над окном, в котором ещё не щёлкнули, больше не масштабирует его холст, а листает стол с окнами; щёлкнул внутри окна — окно активно, колесо в нём как прежде (масштаб конуса, пирамиды, вида). Щелчок вне окон — активного нет, колесо снова листает. Окно Гранидуса — чужая страница в рамке и колесо забирает само, поэтому пока оно не активно, поверх рамки прозрачная крышка: колесо над ней листает стол, первый щелчок её снимает. На странице одного окна (?solo=cone) и в фоне Хаба — как было. Ctrl + колесо не перехватывается.
Гранидус v0.061 — по снимку режима точек (биты — квадратные клетки) — «из треугольников тоже — 2 версии, гориз и верт основания». В «Виде» рядом с «⠿ Точки» — кнопка формы клетки по кругу: □ квадрат (как было), △ треугольник с горизонтальным основанием, остриём к вершине грани, ▷ — с вертикальным основанием, остриём вдоль ряда. Треугольник вписан в прежнюю клетку, поэтому центры бит, наведение и закрепления те же; у нижних граней форма зеркальная сама (грань отсчитывается от своей вершины). Выбор формы включает и режим точек, помнится.
Гранидус v0.060 — по снимку «⟳ Вращение» со скоростью — «отдельное». Вращение и ползунок скорости вынесены из «Вида» в свой раздел ⟳ Вращение (своя вкладка, в окне Зазеркалиуса — ромб ⟳, рамка золотая, как у «Кручения» конуса). Раздел встаёт в левую панель над «Видом»; раскладка у кого сохранена — новый раздел ложится в свою панель, остальные — где были.
Zazerkalius v0.408 — «и развёртку Зеркалидуса». В окне «✦ Развёртка» — кнопки △ Зеркалидус (по умолчанию) и ◇ Октаэдр. Зеркалидус — треугольная пирамида и её зеркало, 6 граней: U0–U2 сверху, D0–D2 снизу. Свои шесть вариантов: А — веер из трёх верхних вокруг T (ровно полкруга), Б — вокруг вершины экватора, В — ромб верх + низ (линия зеркала), Г — ромб из двух верхних, Д — большой треугольник из четырёх граней и две сбоку, Е — лента из шести. Строки поля — так же гранью от вершины, низ инвертирован. Оси считаются по телу: ось — пара вершин с серединой в центре; у Зеркалидуса она одна, Верх–Низ (углы экватора все соседние), вершины без оси — серые точки. Налезаний нет ни в одном варианте (проверено).
Гранидус v0.059 — по снимку «Цвета» над «Нотами» — «верхнюю, если тянуть, — не размагничивай», и по снимку «Вида» с полосами прокрутки — «скролл». Склейка: плавающие разделы, прилипшие снизу к тому, кого тянут (верх ровно на его низу, хоть частью по ширине), и прилипшие уже к ним — цепочкой, едут вместе с ним; тянешь нижний — отрывается, как прежде. Едущие следом магнит не притягивают к самим себе. Прокрутка: сетки видов (роза, грани, ×N) ужимаются по ширине раздела — прежде столбец не бывал уже картинки, и сетка выпирала вбок; у плавающих разделов, как у панелей, полосы прокрутки нет (колесо листает).
Гранидус v0.058 — «также подсчёт всех вершин, граней — какие совпали при виде на меня», «и с осями». Под видами в «Виде» — строка для нынешнего вида, обновляется на ходу, пока тело крутится: вершины всего → различимо; рёбра всего → различимых прямых («торцом» — видны точкой); грани всего → различимо (легла одна на другую — одна; «ребром» — видны линией); оси (с внутренними диагоналями) — сколько торцом и сколько легло на ребро. Считается по линии взгляда, без перспективы, с допуском 0,012 радиуса тела. Пример: Зеркалидус сверху — вершины 5→4, рёбра 9→6, грани 6→3, ось торцом. И по снимку «Картины» — «нижний скролл»: ряд оснований ▽1 … ⬡6 с кнопками Зазеркалиуса был шире раздела и давал полосу прокрутки внизу — кнопки ряда в окне компактнее и делят ширину поровну, а горизонтальной прокрутки у разделов и панелей больше нет.
Гранидус v0.057 — по снимку Зеркалидуса, где рёбра почти легли друг на друга, — «вот такие виды, где по максимуму возможного ребро на ребро». Под видами на грань — картинки «×N»: виды, где рёбер совпадает больше всего. Считаются для нынешнего тела: кандидаты взгляда — вдоль каждой пары вершин (сливаются в точку) и вдоль пересечений плоскостей, в которых лежат пары рёбер (такая плоскость видна прямой, её рёбра ложатся на одну линию); счёт — сколько рёбер легло на уже занятую прямую плюс сколько видно торцом. Показываются лучшие (до восьми; если лучших меньше четырёх — и следующий уровень), из пары противоположных — вид сверху. Щелчок — плавно в вид, как остальные. При смене основания набор пересчитывается.
Гранидус v0.056 — по снимку правой панели со «Связями» и «Видом» и полосой прокрутки — «скролл убери; если примагничивание делает высоту больше, чем окно влезает, — не магнитить». У панелей разделов больше нет полосы прокрутки (колесо листает, если окно потом сузили). Магнит, прежде чем прилепить раздел к панели, проверяет высоту: не влезет панель вместе с ним в окно — панель не подсвечивается и раздел остаётся плавающим на холсте. Раздел, уже стоящий в этой панели (переставляют), — как прежде.
Гранидус v0.055 — «клик по полю — остановка вращения, и старт так же, но без перемещения — только если клик». Щелчок по холсту мимо битов, не сдвигая мышь (до 4 px), — вращение стоп, ещё такой же щелчок — пуск (как «⟳ Вращение» и пробел; кнопка горит вместе). Потянул — это поворот тела, вращение не переключается. Щелчок по биту — как прежде: закрепить; Shift — править бит, Alt — выбрать грань. Работает и пальцем (касание без сдвига).
Гранидус v0.054 (прежде «Октаэдр»), Zazerkalius v0.407, Хаб v0.069, Треугольник v0.037 — «названия пока оставим как-нибудь, замени на общее название, и развёртку не найду». Общее имя тел — Гранидус (грань + «-дус», «дуо» — с зеркальной половиной): окно в Зазеркалиусе «◆ Гранидус», заголовок страницы и надпись в полосе вкладок, методичка, кнопка Хаба, кнопка «◆ Гранидус» в Треугольнике. Тела в названии основания — N-гранидус: Одногранидус (ромб), Двугранидус (крест), Зеркалидус (3, знак), Четырёхгранидус (октаэдр), Пятигранидус, Шестигранидус. Файл и адрес страницы — прежние (oktaedr/Zerkalius-oktaedr.html), чтобы не ломать ссылки. Развёртку не находили — новое окно встало в самый низ стола; в окне Гранидуса кнопка ✦ развёртка: разворачивает окно (и из списка окон слева), поднимает, прокручивает к нему и мигает рамкой.
Zazerkalius v0.406 — «и в развёртке оси покажи» (вслед за «✛ Оси» Октаэдра v0.053). В окне «✦ Развёртка» — кнопка ✛ оси (по умолчанию вкл). У октаэдра две грани с общим ребром всегда складываются в ромб, а его дальние углы — противоположные вершины, концы оси. Поэтому через каждую склейку развёртки проведён штрих между ними цветом оси: Верх–Низ — светлая, E0–E2 — розовая, E1–E3 — зелёная; сами вершины на развёртке — точки цвета своей оси (одна вершина тела лежит на развёртке в нескольких местах, так видно, где концы одной оси). Только на крупной картинке.
Октаэдр v0.053 — «сделай оси видными во всех фигурах, и те, что не оси, но от вершины к вершине не по ребру, а внутри идут». Кнопка ✛ Оси в «Виде» (по умолчанию вкл, помнится). Берутся все пары вершин тела, которые не ребро. Середина в центре — ось, штрихом цветом экватора: Верх–Низ у всех тел, у чётного основания ещё и диаметры экватора (у октаэдра три оси, у шестигранной бипирамиды четыре). Остальные — внутренние диагонали, точками цветом закрепления: у пятигранной — пять диагоналей пятиугольника, у шестигранной — шесть коротких. У треугольной бипирамиды (Зеркалидус) пар «не ребро» одна — сама ось Верх–Низ. Линии рисуются поверх тела полупрозрачно: они внутри, а грани стеклянные.
Знак Zerkalius, Октаэдр v0.052 и общий _js/hub-link.js — разговор об именах тел (Пи-рамидус, Гранидус: «-дус» — «дуо», с зеркальной половиной; утверждены Двугранидус и Четырёхгранидус) и «Зеркалидус — это Три, переделай знак». Знак — не квадратная пирамида и её зеркало (октаэдр), а треугольная (Трёхгранидус): так же, как пирамида Паскаля в Зазеркалиусе — тетраэдр, каждая грань которого треугольник Паскаля. Переделаны: большой логотип oktaedr/zerkalius-logo.svg и зелёный (экватор — три вершины, передняя к нам; спереди четыре грани с битами, нижние — те же строки инвертированные; невидимо одно заднее ребро экватора; строки бит — вдоль переднего ребра), значок вкладки zerkalius-mark.svg (пояс — излом «V» к нам вместо перекладины) и крутящийся значок «в Хаб» на всех страницах (треугольная бипирамида вместо октаэдра). В Октаэдре основание по умолчанию — 3 (у кого сохранено своё — остаётся). Имена страниц и окон пока прежние — думаем.
Октаэдр v0.051 — «сделай кнопку: выделяю грань — первое нажатие на неё — вид, она ближе, второе — она дальше, за другими гранями от меня». В «Виде» — ◭ Грань. Выбрать грань: нажать кнопку и щёлкнуть грань на теле (или Alt + щелчок по грани в любой момент; берётся ближайшая к глазу под курсором) — она обведена светящейся рамкой цвета закрепления, у отвёрнутой — пунктир. Потом каждое нажатие по кругу: 1-е — взгляд вдоль её наружной нормали, прямо на неё, она ближе всех; 2-е — вдоль обратной, она дальше всех, за другими гранями. Плавно, крен снимается, вращение стоп. На кнопке — имя грани (у октаэдра по сторонам света: ЮВ▲, СЗ▼…) и что сделает следующее нажатие; правый щелчок — выбрать другую. Грань помнится по месту (slot, верх / низ) и переживает смену основания, если такая грань у нового тела есть.
Октаэдр v0.050 — «когда Ю посередине, В — верх — тоже все». У камеры появился крен — поворот картинки вокруг взгляда (после поворота и наклона); им наверх встаёт любая вершина. По бокам от «снизу» в розе видов — ↶ ↷: кувырок на 90° против и по часовой, к ровным четвертям, плавно. Роза (вид с С, Ю, …) выбирает, какая сторона к нам, кувырок — какая вершина наверху: так получаются все положения, например Ю посередине и В наверху. Вид из розы и «⌖» крен снимают. Мышь с креном ведёт себя как без него — сдвиг пересчитывается в повёрнутую картинку (Shift — только поворот вокруг оси тела). Вращение по-прежнему вокруг оси Верх–Низ: с креном она на экране наклонена. Крен запоминается вместе с поворотом и наклоном. И «три ребра к нам» (по снимку вида с ребра): под розой — восемь видов прямо на грань, сеткой 4 × 2 по сторонам света — слева верхние ▲СЗ ▲СВ / ▲ЮЗ ▲ЮВ, справа нижние ▼. Три ребра грани к нам, контур тела — шестиугольник; у октаэдра это направление грани (ЮВ и т.д.) с подъёмом atan(1/√2) ≈ 35,3° вверх или вниз.
Октаэдр v0.049 — по снимкам видов с подписями сторон света, лёгшими друг на друга («Ю» на «З», «С» на «В»), — «ещё эти ЮЗВ и ЮсВ, ну и далее ВЮС…». Виды стали розой ветров: картинки 3 × 3, как на компасе — СЗ С СВ / З сверху В / ЮЗ Ю ЮВ, и «снизу» под ней. «Ю» — зритель на юге, юг к нам. Стороны — те же, что буквы на теле (+X — В, +Z — Ю). У октаэдра вершины экватора стоят ровно на С, В, Ю, З: с них взгляд — на вершину (боковые буквы по краям, передняя и задняя — в середине друг на друге), с СВ, ЮВ, ЮЗ, СЗ — на ребро (переднее ребро на заднем, как в v0.048; прежние «спереди, сзади, слева, справа» — это ЮВ, СЗ, СВ, ЮЗ). Сверху — север наверху, восток справа, как на карте; снизу — та же карта, отражённая. Щелчок — как прежде: плавно в вид, вращение стоп.
Октаэдр v0.048 — «с зажатым Shift — кручение по горизонтали только», «у вида справа, слева, спереди и сзади — там бы поправить, чтобы рёбра друг на друга, к нам». Shift + тянуть — только поворот вокруг оси, наклон стоит (Shift + щелчок без сдвига, как и прежде, — правка бита). Заодно после вида ровно сверху или снизу (90°) тело больше не прыгает на 83° при первом движении мышью: предел наклона — не меньше нынешнего. Виды сбоку (v0.047 смотрели прямо на вершину экватора, совпадали только средние рёбра) теперь смотрят в середину ребра экватора: у октаэдра каждое переднее ребро ложится ровно на заднее. Поворот считается от основания (yaw = π / NB − π / 2), сверху и снизу — тем же поворотом, чтобы переднее ребро и там было внизу; картинки видов — так же.
Октаэдр v0.047 — «и октаэдр — все виды разложи так же» (как развёртку — малыми картинками), «и кнопки вида в октаэдр — сверху, снизу…». В группе «Вид» под «⌖ Вид сверху» — шесть картинок-кнопок: сверху, снизу, спереди, сзади, слева, справа. На каждой — тело с этой стороны: рёбра верха цветом верха, низа — цветом низа, экватор ярче; дальние — пунктиром и тусклее. Щелчок — тело плавно (≈ 0,35 с, кратчайшим поворотом) встаёт так, а вращение останавливается, чтобы вид держался. Сверху — вершина T смотрит на зрителя, снизу — B. Картинки перерисовываются при смене основания и цветов. Работает и в окне Зазеркалиуса, и на своей странице; в методичке — строка «Виды».
Zazerkalius v0.405 — «развёртку покажи малыми картинками все сразу, и при выборе одной из них — крупно, выпадающий список не нужен». В окне «✦ Развёртка» вместо списка — шесть маленьких развёрток рядом (А–Е, из тех же строк поля); щелчок по любой — она крупно на холсте, выбранная — в золотой рамке, имя варианта — в подсказке. У маленьких нет подписей, крест мельче, а биты рисуются, только пока клетка не мельче 1,2 px (иначе грани просто залиты своим цветом). Маленькие перерисовываются, только когда поменялись строки, цвета или размер.
Zazerkalius v0.404 — «треугольники кладём на горизонт: Л — вверх и У — вниз, но не Й, то есть Х в общем случае» (буквы — картинки: Л — треугольник остриём вверх, У — вниз, Й — прямоугольные треугольники v0.403, их отменили, Х — квадрат, разрезанный крестом на четыре треугольника с общей вершиной в центре). Горизонт — средняя черта кнопки, одна у всех; на ней же острия ромбов. Стрелки — четверти Х: у всех остриё в центре, на горизонте. ▲ — нижняя четверть (основание внизу, остриё вверх до горизонта), ▼ — верхняя (основание вверху, остриё вниз до горизонта), ◀ ▶ — боковые (остриё на горизонте, основание — дальний край). ▲▼ рядом складываются в ⧗, ◀▶ — в ⋈. Значок в ▲ ▼ — мельче (9 px), у основания.
Zazerkalius v0.403 — «треугольники — стоят все, но горизонт один! у всех, так теперь». Кнопки ◀ ▶ (v0.402 — треугольники на боку, остриём в середину высоты) стали прямоугольными треугольниками, стоящими основанием на той же нижней черте, что и ▲: остриё — в сторону стрелки вдоль черты, прямой угол — с другой стороны, высота — та же полоса в 24 px. ▲ ▼ — как были. Рамка: основание и катет — своя рамка кнопки, гипотенуза — диагональ фоном.
Zazerkalius v0.402 — «надо с размерами определиться: треугольник — это стрелки, 4 штуки, квадрат — это 1 размер», «размер 1, 2, 4, 8, 16 — это сколько помещается целых ромбов», размер в пикселях — как предложено: ромб 24 × 24, размеры 24 / 48 / 96 / 192 / 384. Единица кнопки групп --bu — 80 → 99 px: так прежние размеры встают на ромбы сами — полкнопки 48 (2 ромба), одна 99 (4), двойная 201 (8), четверная 405 (16), а две полкнопки по-прежнему равны одной и столбцы ровные. Ромбом (вытянутым, с равнобедренными остриями, v0.401) теперь кнопки групп всех размеров, не только «1». Кнопка, на которой одна стрелка ◀ ▶ ▲ ▼ (◄ ►), — треугольник остриём в сторону стрелки: основание — рамка кнопки, скосы — диагонали, цвет как у рамки (наведение сиреневое, включённая золотая). Стрелки у ползунков — как были. Группы стали шире примерно на четверть — перемещённые группы стоят на своих местах, но могут лечь теснее.
Zazerkalius v0.401 — «все кнопки теперь ромбами» (выбрано: все кнопки Зазеркалиуса), «равнобедр», «пока те, что 1 размера». Кнопки групп шириной в одну единицу (--bu, 80 px) — вытянутым ромбом: верх и низ ровные, на концах — равнобедренные треугольники с вершиной посередине высоты (глубина 12 px, у кнопки в 24 px — прямой угол). Чистый ромб под надпись вышел бы вдвое шире и выше — «равнобедр» понят как острия-треугольники; кнопка, у которой ширина не больше высоты, от этого и есть ромб. Нажимается только ромб. Рамка скосов — четыре диагонали фоном, её цвет как у рамки: обычная, наведение сиреневое, включённая золотая. Какие кнопки «1 размера» — решает вычисленная ширина (класс .rh1, rhombTag при каждой раскладке групп), поэтому и спрятанные до поры кнопки ромбом встают сразу. Полкнопки-значки и кнопки в 2 и больше — пока прежние.
Zazerkalius v0.400 и Октаэдр v0.046 — по снимку разделов «Связи» и «Реверс» в окне Октаэдра, прилипших к правой панели, — «такое же примагничивание надо, и похоже, меню кнопки тоже надо ромбами делать» (выбрано: магнит — группам конуса, окнам Зазеркалиуса и группам Октаэдра; ромбами — вкладки Октаэдра). Магнит. Общий приём: край ближе 10 px к краю цели встаёт на него (по горизонтали и вертикали отдельно), а цель — то, к чему прилипли, — светится бирюзой. Группы конуса прилипали и раньше (v0.366), но молча; теперь светится соседняя группа, окно конуса или поле строк, а левая панель ловит группу уже в 40 px правее своего края и светится вся. Окна Зазеркалиуса прилипают к краям других окон, стола и поля строк; место при отпускании — с учётом магнита. Поле строк, куда окно встаёт под строки, тоже светится. В Октаэдре полоса магнита панелей — не шире 22 % окна (в узком окне Зазеркалиуса 240 px с двух сторон съедали почти всю ширину), панель под курсором светится, а плавающий раздел прилипает к соседним разделам, панелям и краям окна. Ромбы. В окне Зазеркалиуса вкладки Октаэдра — ромбы зигзагом ребро к ребру, как ноты в Хабе: каждый следующий заходит на полромба и чередуется вверх-вниз на полвысоты. В ромбе — значок, имя — в подсказке; открытая вкладка золотая, наведение — сиреневое. Своя страница Октаэдра — с прежней полосой вкладок.
Zazerkalius v0.399 и Октаэдр v0.045 — по снимку окна «◆ Октаэдр» — «приведи группы кнопок и кнопки в стандарты кнопок Зазеркалиуса». В окне (Октаэдр с ?zz) кнопки теперь как в Zazerkalius: фон панели, скругление 4, системный шрифт 13 px, наведение — сиреневая рамка, включённая — золотая рамка и надпись; полоса вкладок — в тех же цветах, выбранная вкладка золотая. Разделы стали группами, как в конусе: рамка и фон своего цвета, заголовок прописными своим цветом (Картина — зелёная, Вид — голубая, Цвета — розовая, Ноты — сиреневая, Реверс — оранжевая, Связи — красная). Надпись «zerkalius · октаэдр», версия и подсказка внизу в окне не показываются: имя — в шапке окна, а текстовых подсказок на страницах не делаем. Отдельная страница Октаэдра — как была. Галки «строки → грани» и «подписи» (окно «✦ Развёртка») стали кнопками-переключателями ⇄ строки → грани и 🏷 подписи, как переключатели конуса: горит — включено.
Zazerkalius v0.398 — «разложи октаэдр на плоскость, дай черновую картинку, разные варианты центровки вершин и рёбер» (черновик — шесть развёрток картинкой) → «развёртку добавь в Зазеркалье». Новое окно ✦ Развёртка: 8 граней октаэдра на плоскости, как в окне «◆ Октаэдр» (T — верх, B — низ, E0…E3 — экватор). Строка k поля — ряд k грани от её вершины; голубые верхние грани U0–U3, золотые нижние D0–D3 — с инвертированными битами, а зеркальность выходит сама: нижняя грань ложится отражением верхней через ребро экватора. Шесть вариантов, что в центре (красный ✚): А — вершина T (веер из четырёх верхних), Б — вершина экватора, В — ребро экватора (ромб верх + низ — сама линия зеркала), Г — боковое ребро (ромб из двух верхних), Д — два больших треугольника по 4 грани (Серпинский вдвое больше), Е — лента из 8 граней зигзагом. Развёртка строится деревом склеек: каждая следующая грань — отражение соседней через общее ребро; налезаний нет ни в одном варианте (проверено в черновике). Галка «подписи» — имена граней и вершин.
Zazerkalius v0.397 — по снимку сплющенного списка «Окна» в левой панели (при «⇆ поле справа») — «вниз клади окна за экран и покажи стрелками светящимися, что там что-то есть». Кнопки окон держат свою высоту (прежде сжимались до налезания друг на друга: список был ограничен 45 % панели, а кнопки в нём могли сжиматься). Теперь список занимает всё место панели до низа, лишние кнопки уходят за нижний край. Пока ниже или выше что-то есть, у края светится бирюзовая ▼ или ▲; щелчок по ней листает, колесо — как обычно. Полосы прокрутки у списка нет — её место заняли стрелки.
Zazerkalius v0.396 и Октаэдр v0.044 — по снимку «⌖ Вид сверху» Октаэдра — «весь Октаэдр в Зазеркалье, как одно из окон, наравне с Конусом». В Зазеркалиусе новое окно ◆ Октаэдр: в нём страница Октаэдра целиком, со всеми вкладками, вращением, видом, цветами, нотами и реверсом. Грузится, когда окно впервые открыто. Строки поля ложатся гранью: строка k — ряд k от вершины (k бит; короче — добивается нулями, длиннее — лишнее не влезает; начальный столбик 1, 11, 101, … ложится ровно), рядов — сколько строк, все грани одинаковые, низ — как всегда, отражённый и инвертированный. Меняешь строки — меняется октаэдр; галка «строки → грани» это отключает. У окна своя память (Октаэдр с адресом ?zz пишет ключи с «-zz»), поэтому отдельную страницу Октаэдра оно не трогает; значка «в Хаб» внутри окна нет. ↗ в окне открывает Октаэдр отдельной вкладкой. Сделано рамкой (iframe), а не переносом кода: Октаэдр — 2 тыс. строк со своей раскладкой вкладок, и так он остаётся одним и тем же на своей странице и в окне.
Октаэдр v0.043 — «каждую грань в свой цвет — 7-я внутренняя, варианты раскраски такую надо», «и ноты», «туда внедрить звук». Новый раздел «🎵 Ноты». Кнопка «🎨 Грани» переключает раскраску по кругу: половинами (как было) → каждая грань своим цветом нот радугой (верхние по кругу, потом нижние; внутреннее основание рисуется полупрозрачным следующим цветом — у треугольной бипирамиды 3 + 3 + 1 = 7, как нот, и основание — Си) → парами (верх и его зеркало снизу одним цветом). Цвет берут и заливка, и цифры грани. Кнопки До…Си — звук: нота читает биты своей грани ряд за рядом от вершины (1 — звучит, 0 — пауза, высота по трём битам), звучит от своей ноты, и включённые вместе дают созвучие. Ноте без своей грани достаётся экватор. Звучащий бит горит на теле цветом ноты. Темп — ползунком. Описано и в методичке страницы.
Хаб v0.068 — «из хаба убери смену языков, пока оставь только рус буквы». Все подписи хаба теперь русские и больше не переключаются. Русские и в самой разметке, чтобы до запуска скрипта не мелькал английский. Сбойные полосы остались, только без смены языка.
Хаб v0.067 — «а если треугольники для левого расположить катетами вдоль вертикали левой…», по показу — «поменять местами», и дальше: «кнопки прямо вниз, большие группы разделить и запустить нажатием — отправить в бесконечность». Телефон лёжа: треугольники из ромбов лежат на боку, вершина у своего края экрана, основание к нотам (ромбы повёрнуты вместе с ними, крупнее прежних — почти во всю высоту). На телефоне меню ниже первого экрана — одним столбцом, «Черновики» разбиты по пять с просветом. Нажатая кнопка меню теперь вспыхивает и улетает вдаль, к середине экрана, сжимаясь в точку, и страница открывается, когда она долетела. С Ctrl, Shift или средней кнопкой мыши — как обычно, без полёта. Вернулись назад — кнопки на местах. Попутно: сбойные полосы смены языка резали тёмную середину ромба ноты, и он на миг серел полосами — теперь середина всегда ромб.
Хаб v0.066 — по снимку телефона лёжа — «тот треугольник — левый и правый». Лёжа у краёв теперь два таких же треугольника, как стоя: равносторонние, из ромбов ребро к ребру, прижаты к левому и правому краю. Прямоугольный треугольник из ромбов ребро к ребру не сложить: строки перекашиваются, и рисунок Серпинского ломается.
Хаб v0.065 — «треугольник должен быть выполнен из бит-ромбов, а не квадратов». Каждый бит треугольника Серпинского на телефоне теперь ромб. Стоя ромбы с углами 60° и 120° ложатся ребро к ребру: ряд наполовину заходит в предыдущий, как ноты в стрелке, и треугольник выходит равносторонним. Лёжа строки не сдвигаются (треугольники прямоугольные), поэтому ромб стоит в своей клетке и касается соседей вершинами. Единицы — крупные ромбы, нули — маленькие бледные, звучащие горят цветом своей ноты.
Хаб v0.064 — по снимку «Черновиков» у Kubits — «сюда прошлую версию Хаба, где крутящийся есть, с нотами». Последней кнопкой в «🔬 Черновиках» — «Хаб с конусом» (Zerkalius-hub-konus.html): замороженная копия хаба v0.058, последней, где конус-фон виден, а семь нот стоят в ряд. Взята из git как есть. Не правится и не версионируется — это снимок, живой хаб по-прежнему index.html.
Zazerkalius v0.395 — «теперь треугольники гипотенузой к центру, сначала покажи». Показаны два снимка фона (как было и как станет), ответ «да». Пирамиды Серпинского по бокам конуса теперь прижаты строками к внешнему краю: вертикальный катет снаружи, гипотенуза смотрит на конус.
Хаб v0.063 — «ноты обрамить каждую ромбом, чтобы в общем получилась [стрелка]» и про телефон: «все кнопки в столбик по 1 или по 2 и вниз, чтобы их не видно было, внизу стрелки двигаются вниз, мигают; на экране по центру ноты и Серпинский, когда один — по центру; телефон по горизонту — кнопки тоже внизу за экраном, два Серпинских прижаты к своим сторонам». Каждая нота теперь в ромбе. Ромбы в ряду касаются вершинами, ряд заходит в ряд на половину ромба, так что наконечник стрелки складывается из ромбов ребро к ребру, а Си — древко. Нажимается сам ромб, углы соседних не мешают. Выключенный ромб серый, включённый горит цветом своей ноты. На телефоне первый экран — треугольник Серпинского и ноты. Стоя — один треугольник по центру (строки по середине, равнобедренный), лёжа — два прямоугольных у своих краёв, гипотенузой к нотам. Звучащие биты на нём горят цветами своих нот (головки берутся из фона). Кнопки меню ниже, за краем экрана, в столбик по 1–2, а внизу первого экрана бегут вниз и мигают стрелки ⌄⌄ (нажатие — к меню). Видео хаба на телефоне теперь снимает весь первый экран: треугольник, ромбы и ноты. На компьютере хаб прежний, только ноты в ромбах.
Хаб v0.062 — по снимку «D» — «D = Ре?». Да: по-английски ноты называют буквами (C — до, D — ре, … B — си; счёт исторически шёл от ля, потому она A). Буквы путали, и по слову «да» ноты по-английски теперь пишутся слогами латиницей: Do Re Mi Fa Sol La Si.
Хаб v0.061 и Zazerkalius v0.394 — «на хаб надо видеозапись». Страницу хаба браузер снять не даёт: кнопки — не холст. Поэтому кадр рисуется заново на своём холсте, формата устройства, как у конуса: телефон — 1080×1920, компьютер — 1920×1080. В кадре стрелка нот: на тех же местах, того же цвета, так же мигают и светятся, как на экране. Под ней конус, если он виден. Звук нот идёт в файл прямо из фона, без захвата экрана и без вопросов браузера (для этого фон отдаёт свою дорожку — zzSndStream). Кнопка ⏺ — в правом верхнем углу, работает и при запертом меню; пока идёт запись, она красная и мигает. Файл Zerkalius-hub-….mp4 (или .webm, если браузер не пишет mp4). Кнопок меню в кадре нет. Попутно: в хабе не было строки meta viewport, и телефон рисовал его страницей шириной 980 px, уменьшенной целиком. Ноты выходили мелкими, а правила для узкого экрана не срабатывали. Строка добавлена. И ещё: скачивание готового файла идёт щелчком по невидимой ссылке, а его перехватывал «замок» меню (пока не горели все семь нот), так что файл не сохранялся. Теперь замок реагирует только на настоящие щелчки.
Хаб v0.060 — «1-2-3-1 — такой треугольник-стрелка». Ноты перестроены в стрелку вверх: ряды 1, 2, 3 — наконечник (До; Ре, Ми; Фа, Соль, Ля), каждая нота стоит над щелью между двумя нижними, и снизу древко — Си, под Соль. Прежний треугольник 1 + 2 + 4 (v0.059) снят.
Хаб v0.059 — по снимку треугольника бит — «расположи ноты стрелкой вверх; при смене англ/рус все должны стоять на местах; крутящийся конус пока отключи». Семь нот встали треугольником 1 + 2 + 4: До сверху, под ней Ре и Ми, внизу Фа, Соль, Ля, Си. Это то же дерево, что у длительностей в словаре: каждая нота второго ряда стоит ровно над серединой своей пары в третьем. У каждой ноты теперь постоянная ширина, поэтому смена языка (Соль ↔ G) ничего не сдвигает. Конус-фон спрятан, но работает: звук нот играет в нём же.
Хаб v0.058 — «адаптировать к телефону нажатие кнопок нот». Касание ноты срабатывает сразу: браузер больше не ждёт, не будет ли двойного касания. Нет синей вспышки, и подсветка наведения не «залипает» на пальце: она теперь только там, где есть мышь. Место под палец не меньше 44 px, долгое нажатие не вызывает меню и выделение текста, на узком экране ноты мельче, чтобы стояли в одну строку.
Zazerkalius v0.393 — «запись видео нужна в формат мобильника или компа — по определению». Раньше ролик был размером холста конуса, то есть какой угодно, как окно. Теперь кадр стандартный по устройству: телефон — вертикальный 1080×1920, компьютер — горизонтальный 1920×1080. Из холста берётся область этого формата вокруг середины, по короткой стороне холста, поэтому конус её и заполняет; чего в холсте нет — закрашено фоном страницы. Так пишут все три записи конуса: ⏺ и mp4, ↻1 оборот и 🎞 покадровая. Рамка ▣ показывает эту область и формат (🖥 или 📱). Проверено в браузере облачной сессии: как компьютер — файл 1920×1080, как телефон (Pixel 7) — 1080×1920.
Хаб v0.057 — по снимку «До Ре Ми Фа Соль Ля Си» — «также на англ». Ноты стали такой же строкой, как кнопки меню: язык меняется вместе со сбоем, по-английски — буквами C D E F G A B (так ноты называют в английском: До — C, Ре — D, … Си — B). Подсказки при наведении остались русскими.
Хаб v0.056 и Zazerkalius v0.392 — «если нажать вне кнопок — пауза, и центр перестаёт крутиться», «после паузы — с того же момента», «нужна и пауза при клике на странице, и плей, а сброс как-то иначе». Щелчок по пустому месту хаба (не по нотам и кнопкам) — пауза: звук встаёт на месте, конус перестаёт крутиться, ноты горят, но не мигают. Ещё щелчок — дальше с того же шага, с теми же нотами, конус крутится дальше. Включил ноту на паузе — она добавляется, и всё идёт дальше. Сброс — правым щелчком по пустому месту: все семь нот, звук с начала, конус с начального положения. Самый первый щелчок, как прежде, включает До и Ре.
Хаб v0.055 — «кнопки хаба не делать активными, пока все ноты не включить (в первый раз)». Меню притушено и не нажимается, пока хоть раз не загорятся все семь нот сразу. Первый щелчок по странице, как прежде, включает До и Ре. Щелчок по притушенной кнопке меню никуда не ведёт, а серые, ещё не включённые ноты вспыхивают своими цветами: подсказка без текста. Загорелись все семь — меню оживает, и браузер это запоминает (ключ zerk_hub_all7). Дальше хаб открывается сразу живым, ноты можно гасить. Отметка новая, вместо прежней «музыка хоть раз звучала», чтобы через это прошли все, в том числе те, кто уже слушал. Если фон за 3 с ни разу не ответил (звука нет), меню отпирается, чтобы не остаться запертым навсегда.
Zazerkalius v0.391 — «кнопку записи звука». В группе «Звук» появилась ⏺ в полкнопки. Она пишет в файл то, что играет «♫ звук», только звук, без видео: .webm (opus), а где браузер webm не пишет — .m4a. Звук молчал — при старте записи он включается сам. Ещё щелчок по ⏹ — стоп, и файл Zerkalius-zvuk-….webm уходит в «Загрузки». Пока идёт запись, кнопка мигает красным, время — в подсказке. Дорожка та же, что уходит в видео, поэтому в файле ровно то, что слышно, без задержки колонок.
Zazerkalius v0.390 — по снимку «Своя | 1 ■ | 0 ■ | а ■» — «объедини в размер 4». «Своя» и три выбора цвета (единицы, нули, акцент) теперь один блок ровно в две кнопки (размер 4 по шкале пользователя, прежде вместе выходило три). Выбор цвета — квадратик 22 px, цифра стоит в его углу, «Своя» занимает остальное место. Блок переносится между группами целиком, как «🎯 до строки | 10».
Хаб v0.054 и Zazerkalius v0.389 — «добавь ещё нот (До Ре Ми Фа Соль Ля Си), серыми, не включёнными, при включении они также цветные» и «разве не 7 всего нот в музыке?». Значков-нот в хабе теперь семь, по названиям нот. До — бывший ♫ (строки подряд), Ре — бывший ♪ (столбцы сверху вниз, бас). Новые: Ми — строки задом наперёд (с конца поля, справа налево), Фа — столбцы снизу вверх, Соль — диагональ ↘, Ля — диагональ ↙, Си — случайный бит. Чтобы названия что-то значили, у каждой головки своя тоника: её мелодия сдвинута так, что звучит от своей ноты. Несколько включённых звучат созвучием. Выключенная нота серая, включённая горит своим цветом радуги (До красная … Си фиолетовая), и этим же цветом подсвечен её бит на конусе и в пирамидах. Первый щелчок по странице по-прежнему включает До и Ре, остальные ждут своего щелчка. Радуга и сдвиг тоники — только в фоне хаба, в самом Zazerkalius «стр+стл» звучит и светится как раньше (бирюза и золото). Проверено в браузере облачной сессии: каждая нота включается и выключается отдельно, головки совпадают с горящими нотами.
Zazerkalius v0.388 — по снимку подсветки бита — «как будто бы сдвиг есть звука с картинкой». Подсветка звучащего бита ставилась сразу, а звук доходит до колонок позже, на задержку вывода звуковой карты. На Windows это десятки миллисекунд, в Bluetooth-наушниках 0,2–0,3 с, то есть больше шага при 6 битах в секунду. Браузер эту задержку знает (baseLatency + outputLatency), и теперь подсветка в строках и на конусе ставится с той же задержкой, вместе со звуком. Сколько вышло, страница один раз пишет в консоль. Во время записи видео задержки нет: в ролик звук пишется до колонок. Попутно найдена ошибка с v0.374: else ветки «стоп» стоял внутри комментария, поэтому ■ и выключение обеих нот в хабе звук не останавливали. Исправлено.
Хаб v0.053 — по снимку номера версии — «наверх». Номер версии снова вверху по центру. Вниз его унесли в v0.045, потому что вверху встал ♫, а с v0.051 ноты стоят под надписью Zerkalius, и верх освободился.
Хаб v0.052 — на вопрос «притушенное меню — только в первый раз?» ответ «да, если в кеше нет ничего, то так». Как только фон ответил, что звук пошёл, в памяти браузера (localStorage, ключ zerk_hub_snd) ставится отметка. С ней хаб дальше открывается сразу светлым и щелчков не перехватывает, музыка тогда — по нотам ♫ ♪. Без отметки (новый посетитель, другой браузер, очищенная память) — притушенный режим v0.051. Если память недоступна (закрытый режим), хаб ведёт себя как у нового посетителя.
Хаб v0.051 — «пусть все кнопки меню будут затемнены, пока не включится музыка, и любой щелчок по странице включает все ноты, если ни одна не включена»; «значки нот пониже и побольше». Браузер не даёт звуку начаться без щелчка, а первый щелчок в хабе обычно по кнопке, и человек сразу уходил, так музыки и не услышав. Поэтому меню теперь притушено, пока звук не пошёл. Первый щелчок где угодно, даже по кнопке меню, никуда не ведёт, а включает обе головки (♫ и ♪). Меню светлеет, когда фон ответил «звучит», или через 1,5 с, если фон молчит, иначе меню могло бы остаться запертым. Фон ещё не догрузился — хаб повторяет просьбу раз в полсекунды. Щелчок по самой ноте включает только её головку. Ноты стали 40 px и стоят под надписью Zerkalius.
Хаб v0.050 и Zazerkalius v0.387 — вопрос «можно ли включать музыку при старте у новых» и ответ на «нет» — «2 и более значков, каждый отдельно вкл/выкл». Сам звук при старте браузеры не дают, пока посетитель ничего не нажал. Вместо одного ♫ в хабе теперь два значка, по одному на головку звука фона: ♫ — строки подряд (горит бирюзой), ♪ — столбцы сверху вниз, бас (горит золотом). Каждый включает и выключает свою головку; выключены обе — звук встаёт. Фон понимает новое сообщение { zerkSndHead: "r" | "c", on } и отвечает, какие головки звучат. Прежнее { zerkSnd } тоже работает и включает обе сразу.
Хаб v0.049 — «перемести Черновики вниз, но не ниже номера версии». Панель «🔬 Черновики» теперь последняя, под «◇ Знаком и записями». Номер версии прибит к низу экрана (10 px от края), поэтому снизу у хаба оставлен запас не меньше 44 px, а не просто 6% высоты. Иначе на низком окне нижняя панель заезжала бы на номер.
Zazerkalius v0.386 — по снимку подсказки границы поля строк — «при перетаскивании влево также сначала покажи границу, куда упадёт». Причина: граница поля — невидимая полоса в 10 px, а видимая черта — у её края. Если вести мышь от черты наружу (у поля справа это влево), указатель с первого же движения уходил с полосы, движения ей больше не приходили, и протяжка не начиналась: ни черты-прицела, ни новой ширины. Внутрь всё работало, поэтому и казалось, что черта есть только в одну сторону. Теперь полоса держит мышь с момента нажатия, и черта идёт за ней в обе стороны. Ошибку воспроизвёл и проверил сам, в браузере облачной сессии: все четыре случая (поле слева или справа, тянуть влево или вправо).
Zazerkalius v0.385 — по снимку «Всё | Каждое | Встреч Стр | Встреч Бит» — «кнопки размером 1» и про кнопки, сделанные раньше «в 2 кнопки», — «да, те тоже». Шкала пользователя: размер N — это N полкнопок. Поэтому режимы кручения стали по полкнопки, подпись у каждого теперь мелко, в две строки («Встреч / Стр»). «Размер 2» из просьб v0.356–v0.364 означал одну обычную кнопку, а сделано было в две. Теперь «⏸ на проходе», «↻ по часовой», «🎨 разные» и пары «🎯 до строки | 10», «↻ | 45°» стоят ровно в одну кнопку, а длинные подписи не обрезаются, а переносятся на вторую строку мельче. Сделано в облачной сессии, в ветке claude/….
Zazerkalius v0.384 — по снимкам «Настраиваемая | 1 0 а», «▶» и «Янтарь» — «Настраиваемая — Своя, размер 3; 1 размер — это вот такие (▶), 2 — это (Янтарь)». Гамма «Настраиваемая» переименована в «Своя» и стоит в полторы кнопки, то есть размер 3 по шкале пользователя. Вместе с тремя выборами цвета 1 / 0 / а по полкнопки блок занимает ровно три обычные кнопки. Шкала размеров пользователя: 1 — полкнопки (как ▶), 2 — обычная кнопка (как «Янтарь»), 3 — полторы, 4 — две.
Хаб v0.048 — по снимку «Triangle / Зазеркалиус» — «в одну строку». Две главные кнопки хаба стоят рядом, в одну строку; на узком экране переносятся одна под другую.
Zazerkalius v0.383 и Хаб v0.047 — «а что если добавить головку, идущую по столбцам» → «да» (и в Зазеркалиусе, и в фоне хаба, скорость одна). Новый режим звука стр+стл — две головки разом, на одном счёте шагов. Строчная читает строки подряд слева направо, как «подряд», подсвечена бирюзой; «⁑ авто» относится к ней. Столбцовая идёт по столбцам: столбец сверху вниз (только строки, где он есть), потом следующий; она подсвечена золотом и звучит октавой ниже, как бас. В треугольнике Серпинского первый столбец — сплошные единицы, дальше столбцы всё реже, с дырами Серпинского, поэтому бас редеет к краю. Головки видны в строках поля (золото — отдельной подсветкой), на конусе (2D — обводка, 3D — точка) и в обеих пирамидах фона хаба. «♫» в хабе теперь включает звук фона именно в этом режиме.
Zazerkalius v0.382 — по снимку колонки замков у номеров строк — «покажи другими значками, просто полоской, все невыкрученные» и «поменяй значок над номерами — он похож на кручение». Замки колец у строк и общий замок над ними — теперь не 🔒 / 🔓, а полоска: заперто (кольцо крутится только на вид, строка не сдвигается) — сплошная серая, открыто (крутит саму строку) — пустая золотая. Щелчки прежние. Кнопка «Начальные строки» над номерами — теперь ⇤ вместо ↺: ↺ путалась с ⟲ кручения рядом.
Хаб v0.046 — по снимку «♫ Звук ■» — «оставь только символ музыки, без рамки». Кнопка звука фона теперь просто ♫ вверху по центру, без рамки и фона. Пока звук идёт, значок бирюзовый и мигает свечением. Что делает кнопка, сказано во всплывающей подсказке.
Хаб v0.045 — по снимку номера версии — «это вниз». Номер версии хаба перенесён вниз, по центру у нижнего края экрана. Вверху по центру теперь только ♫ Звук.
Хаб v0.044 — «кнопку ♫ Звук — наверх посередине и мигающей, когда звук идёт». Кнопка звука фона переехала из правого нижнего угла вверх, на середину. Пока звук идёт, её бирюзовая рамка мигает, как у кнопок авто-хода в Zazerkalius.
Zazerkalius v0.381 и Хаб v0.043 — «добавить кнопку в Хаб: Звук», «обои доработать всё как есть, но добавить по горизонту зеркального конуса две пирамиды Серпинского высотой до вершины конуса, справа и слева, чтобы соприкасались почти катетами» (выбрано: прямоугольные, катетом к конусу), «звук пустить по обеим пирамидам сразу и показать биты-головки в обоях». В живом фоне хаба по бокам зеркального конуса стоят два треугольника Серпинского из тех же строк (Паскаль mod 2). Вершина — на высоте вершины конуса, основание — на горизонте (плоскость зеркала). Вертикальный катет почти касается самого широкого места конуса, гипотенуза смотрит наружу, левый треугольник зеркальный. Единицы — цветом единиц, нули — бледно. В хабе, в правом нижнем углу, появилась кнопка ♫ Звук. Она запускает звук фона: строки звучат подряд, звучащие биты (головки) подсвечиваются бирюзой сразу в обеих пирамидах и на конусе. Ещё щелчок выключает звук; пока звучит, кнопка горит. Фону дано разрешение на звук (allow="autoplay"), иначе браузер его не пускает. На страницах самого Zazerkalius и в карточках пресетов ничего не меняется.
Zazerkalius v0.380 — по снимкам двух головок рядом (1000000001 под 11111111) — «почему так?» Причина: «⁑ авто» берёт шаблоном строку под строкой из одних 1, здесь это сама читаемая строка; единицы на 0 и 9 в строке из 10 бит — по кругу соседние. Выбрано: круг оставить и «строки, где все 1-цы, пропускать, кроме той, где длина 1». В режимах, где звучат несколько строк (разом, подряд, по 2, столбцы), строки из одних единиц длиннее одного бита теперь не звучат — их пропускают; верхняя «1» звучит как прежде. В режиме «строка» звучит та, что выбрана, — без изменений.
Zazerkalius v0.379 — «текст поправь»: сообщение при нажатии «◉ показать» теперь говорит на языке кнопки — «◉ Показать — вкл: звучащие биты (головки) подсвечены в строках и на конусе» или «◉ Показать — выкл» (прежде — «◉ Головки видны / не показываются»).
Zazerkalius v0.378 — по снимку «Звука» — «обнови подсказки» и по снимку «◉ головки» — «Показать». Подсказки «Звука» переписаны под то, что в нём сейчас. У группы перечислено, что где. У ◀ ▶ сказано, что они задают направление (горит) и шагают. У «♫ звук» — цепочка «пауза → дальше», у ■ — «стоп и в начало». У ♩ и 🔊 указаны единицы. Кнопка «◉ головки» теперь называется «◉ показать»: что именно она показывает, объясняет подсказка.
Zazerkalius v0.377 — по снимку «■» — «стоп тоже мигать при плее, цвет обводки такой же, толщина», «стоп — это в начало». Пока звук играет, кнопка ■ мигает вместе с кнопкой звука, той же золотой рамкой той же толщины. На паузе и в остановке она не мигает. Что делает ■, не менялось: останавливает звук совсем, и следующий пуск идёт с первого бита. Теперь это сказано и в подсказке («Стоп и в начало»).
Zazerkalius v0.376 — по снимку «Звука» — «кнопку показать головки на битах строк и в конусе». «◉ бит» стала «◉ головки»: звучащие биты (головки чтения, при «⁑ авто» их несколько) видны и в строках поля, как было, и на конусе. В 2D сектор бита обведён бирюзовым, в 3D на бите бирюзовая точка. По умолчанию включено; выключишь — головок не видно ни там, ни там. Остановил звук — отметки пропадают.
Zazerkalius v0.375 — «Вид — кнопка показ / скрыть (по умолчанию „показать“) дуги битов». В «Виде» появилась кнопка ◠ дуги, по умолчанию включена. Выключишь — дуги битов на конусе не рисуются: ни в 2D, ни в 3D, ни у зеркала. Остаются границы между битами, контуры колец, лучи и лазер. Выбор помнится.
Zazerkalius v0.374 — по снимку «◀ ⏯ дальше ■ ▶» — «по умолчанию выделить стрелку, и запоминать последнюю выделенную — при плее задаёт направление». У звука теперь есть направление: горит ▶ (по умолчанию) или ◀, последняя нажатая помнится. Пока звук идёт, стрелка меняет направление, и звук играет дальше в ту сторону, не останавливаясь. Когда не звучит — стрелка, как прежде, делает один шаг (звук на паузе) и заодно задаёт направление. Пуск в обратную сторону начинается с последнего шага.
Zazerkalius v0.373 — по снимку группы «Лазер» в 3D — «в 3D лазер: все кнопки пока что неактивные нужно». В 3D лазер не рисуется и не считается, поэтому все кнопки, поля и списки группы «Лазер» в 3D теперь неактивны: бледные и не нажимаются, а подсказка группы объясняет почему. Двигать группу можно. При выходе из 3D (🧊) всё возвращается как было; то, что было неактивно само по себе (например, «щели»), таким и остаётся.
Zazerkalius v0.372 — по снимку «✳ все» — «проверь — работает для зеркала?». Не работало: лучи к центру (✳ выдел. / ✳ все) рисовались только у верхнего конуса, у отражённых вниз колец (⧗ зеркало) их не было. Теперь лучи есть и у отражённых колец, на их высоте, от центров бит к оси. При «⧗ выдел.» — только у тех колец, что отражены; при «✳ выдел.» — только у колец в фокусе, и сверху, и в зеркале.
Zazerkalius v0.371 — по снимку «■ звук | ⏯ дальше» — «пауза и звук — 1 размер, и рядом 0,5 — стоп; когда не включён, стоп неактивен». Звук и пауза — теперь одна кнопка в 1 ширину: «♫ звук» (пуск) → «⏸ пауза» (пока звучит) → «⏯ дальше» (на паузе). Рядом — ■ в полкнопки: стоп совсем, следующий пуск — с начала. Пока звук не идёт и не на паузе, ■ неактивна (бледная). Блок — ◀ [звук / пауза] [■] ▶.
Zazerkalius v0.370 — по снимку группы «Гамма» — «кнопки со своими цветами; Исходная — это Настраиваемая, к ней выбор цветов 0 и 1 и ещё что там». Кнопки гамм теперь окрашены своими цветами: надпись — цветом единиц, фон — с оттенком нулей, рамка — цветом акцента; выбранная обведена своим акцентом (цвета — для нынешней темы). «Исходная» стала «Настраиваемая». Рядом с ней три выбора цвета: 1 (единицы), 0 (нули) и а (акцент: рамки, подписи, выделение). Тянешь в выборе цвета — строки, конус и окна перекрашиваются сразу. Свои цвета помнятся у каждой темы отдельно (Z.palCust); пока не заданы — цвета страницы, как было у «Исходной». Правый щелчок по «Настраиваемой» возвращает цвета страницы.
Zazerkalius v0.369 — по снимку «🎨 Контраст» — «Гамма» (было предложено «Палитра», решили оставить «Гамма»). На кнопке в шапке теперь всегда «🎨 Гамма», а не имя выбранной гаммы. Какая выбрана, видно в группе «Гамма» (горит) и во всплывающей подсказке кнопки.
Zazerkalius v0.368 — по снимку «■ звук» — «раздели на 2 по 1 размера, паузу сюда». Блок звука теперь ◀ [♫ звук] [⏸ пауза] ▶: звук и пауза — две кнопки по 1 ширине, стрелки шага — по краям в полкнопки. Пауза переехала из отдельной кнопки внутрь блока и подписана: «⏸ пауза», на паузе — «⏯ дальше». Между группами блок переносится целиком.
Zazerkalius v0.367 — по снимку «🎨 Роза» — «группа кнопок: сразу все показать в ней, а сюда кнопку вызова этой группы, если группа закрыта». Появилась группа Гамма: все семь гамм кнопками (Исходная, Янтарь, Океан, Лес, Роза, Огонь, Контраст), выбранная горит. Группа ведёт себя как остальные: переносится, сворачивается, встаёт на левую панель или поле строк. У неё в заголовке есть ✕ — закрыть совсем. «🎨 …» в шапке стала кнопкой вызова этой группы. Если группа закрыта, свёрнута или её не видно, щелчок открывает её и мигает рамкой; если окно конуса закрыто, группа встаёт на левую панель. Если открыта — щелчок закрывает. Пока группа открыта, кнопка горит. Правый щелчок — следующая гамма, как раньше.
Zazerkalius v0.366 — по снимку группы «Кольца», ушедшей под поле строк, — «группы не скрывать теперь, а примагничивать к границам, всем, по всему периметру». Вынесенная на холст группа теперь всегда целиком внутри окна конуса; прежнее «уезжает вправо под поле строк, виден один заголовок» (v0.215) снято. Пока группу тащишь, она притягивается магнитом, если подвести её край ближе 10 px к краю окна конуса, краю поля строк или краю любой другой группы. Работают все четыре стороны, вплотную или вровень, по горизонтали и вертикали отдельно.
Zazerkalius v0.365 — снова по снимку режимов кручения — «размер 1 каждая». Кнопки «Всё / Каждое / Встреч Стр / Встреч Бит» и так были по ширине в кнопку, но стояли слитной полоской, без зазоров, и выпадали из сетки остальных. Теперь это отдельные кнопки в 1 ширину, с обычным зазором и скруглением, ровно в сетку со всеми.
Zazerkalius v0.364 — по снимку списка «🎨 разные» (тембр звука) — «размер 2». Список тембров в «Звуке» теперь ровно в 2 кнопки, где бы ни стоял.
Zazerkalius v0.363 — по снимку «🧱 Бит 7» — «не снимает выделение, заморозку». Разморозка срабатывала, только если выделение лежало целиком внутри замороженного: захватил лишний бит — кнопка замораживала ещё. Теперь, если выделение задевает замороженные биты, выделенное размораживается. Без выделения горящая кнопка размораживает все, как и правый щелчок. Заморозить, как прежде: выделить незамороженные биты и нажать.
Zazerkalius v0.362 — по снимку группы «Кручение» — «подсказки обнови». Всплывающие подсказки в «Кручении» переписаны под то, что есть сейчас. У группы перечислено, что в ней, а «всё на места» указана там, где она стоит на самом деле: зелёная ⟲ над столбиком кручений у поля строк и на пульте. У «весь:» появилась своя подсказка. У ползунка скорости — единицы по режимам (Всё и Встреч Стр — °/с, Каждое и Встреч Бит — бит/с). У шагов ◀ ▶| — нынешние названия режимов вместо прежних «по биту / навстречу», у ↻ / ↺ — что идёт в эту сторону, а что в обратную. Подсказка ⟲ на пульте тоже указывает на новое место.
Zazerkalius v0.361 — по снимку «достроить: 🔺 Серп 90 · ⤒ из-под черты», горящих обе, — «„Заменить“ удали, слово „достроить“ убери, жёлтая обводка — либо-либо». Кнопки «Заменить» и подписи «достроить:» больше нет. Строки, что лежали под чертой, при достройке теперь не стираются, а сдвигаются вниз, ниже новых; стереть их — 🗑. Жёлтым горит что-то одно. «⤒ Из-под черты» горит, когда она включена и под чертой есть строки: черта вниз сперва вернёт их. Иначе горит способ достройки (🔺 Серп 90 / 30 / маска). Выбор способа выключает «из-под черты». И по снимку «↻ по часовой» — «размер 2»: эта кнопка теперь ровно в 2 кнопки.
Zazerkalius v0.360 — по снимкам «🎯 до строки | 10» и «↻ | 45°» — «ширина 2 им», «также» — и по снимку режимов кручения — «каждое 1 ширины». Пары «🎯 до строки + номер» и «↻ + шаг лазера» — каждая один блок ровно в 2 кнопки: номер строки и ↻ по полкнопки, кнопка и список занимают остальное. Между группами такая пара переносится целиком. Режимы кручения «Всё / Каждое / Встреч Стр / Встреч Бит» — каждый ровно в 1 кнопку, слитной полоской, как были.
Zazerkalius v0.359 — по снимкам «✳ все» (лучи) и «⧗ зерк.» — «у зеркала тоже надо». Зеркало вниз (октаэдр) в «Виде» теперь списком, как лучи: ⧗ нет / ⧗ выдел. / ⧗ все. «Выдел.» отражает вниз только кольца выделенных строк (нет выделения — текущей), «все» — все кольца, как было. Кнопка ⧗ над пультом по-прежнему включает и выключает зеркало, список за ней следит. Выбор помнится, ⭐ умолчание и «⟲ всё на места» его возвращают.
Zazerkalius v0.358 — по снимку «проход 0 · волна 0/63» — «перемести прямо в поле строк, где первая строка, прижми вправо, биты на передний план и удали дубль». Счёт Аниматрицы теперь один: в самом поле строк, у правого края, на уровне первой строки. Он лежит позади строк, биты рисуются поверх него, и мышь сквозь него проходит. Обе прежние копии убраны: в группе «Аниматрица» и в полосе над полем (v0.350).
Zazerkalius v0.357 — по снимку «▮ Столб | от −8» — «убери „от“, расположи 2 окна: слева 8, справа 0 — так по 2 столба можно задать». Рядом со «▮ Столб» теперь два поля по полкнопки, без подписи: левое — на сколько бит левее вершины, правое — на сколько правее. 0 значит, что с этой стороны столба нет; по умолчанию слева 8, справа 0 (как прежнее −8). Можно поставить два столба сразу: оба замораживаются при построении по правилу (заготовки, ▦ 256, достройка) и оба подсвечены в строках голубым. Прежний один сдвиг переходит сам: минус — в левое поле, плюс — в правое. Столба ровно по центру теперь нет: 0 значит «нет».
Zazerkalius v0.356 — по снимкам «⏸ на проходе» и списка «45°» — «размеры 2». Кнопка «⏸ на проходе» и список шага лазера (45° / 1/T / 1/(1+…+T)) теперь ровно в 2 кнопки, где бы ни стояли: на полосе, над холстом или на левой панели.
Zazerkalius v0.355 — по снимку окошка «↧ до 64» — «после применения показать следующую цифру». Пока окошко открыто, после ✓ или Enter в нём уже стоит следующая степень двойки в ту же сторону, куда тянули черту: вниз 64 → 128 → 256… (до предела 1024), вверх 64 → 32 → 16… Ещё один Enter шагает дальше, своё число набирается поверх выделенного.
Zazerkalius v0.354 — «прокрутка на группе кнопок — в Конусе например — так же, как на поле конуса, а не скролл панелей надо». Колесо над группой кнопок конуса (на полосе или поверх холста) теперь делает то же, что над самим холстом, — масштаб конуса вокруг курсора; стол с окнами больше не едет. Над группой, поставленной на поле строк, колесо листает строки. Как было осталось: группы на левой панели листают панель, число или список в фокусе меняют своё значение, Ctrl + колесо — масштаб страницы.
Zazerkalius v0.353 — «их (▮ стенку и 🧱 стенку) в одну группу „Заморозка“, поместить её в Аниматрицу, назвать: Столб, Бит; показать в строках подсветом; Вид — кнопка, по умолчанию вкл, — видимость замороженных». В конце «Аниматрицы» теперь блок ❄ Заморозка: ▮ Столб с полем «от −8» (прежняя ▮ стенка, v0.241; из панели достройки она ушла, но на достройку действует по-прежнему), 🧱 Бит (прежняя 🧱 стенка, v0.347) и 👁 вид. Замороженное видно в строках: столб — голубым (клетка «середина строки + сдвиг» в каждой строке), биты — кирпичным. «👁 вид» (по умолчанию вкл) включает и выключает только подсветку, заморозка действует в любом случае. В сообщениях тоже «столб» и «заморожено» вместо «стенки».
Zazerkalius v0.352 — по снимку окна «📝 Текст конуса и лог лазера», обрезанного справа, — «тут всё нераскрыто по ползункам, надо как-то, чтоб видно было». Свободное окно могло уехать за правый край экрана, и с ним пропадали кнопки 📌 ▾ ✕ и конец строк. Теперь оно всегда целиком на экране, и приколотое тоже не шире экрана. Полосы прокрутки в окне стали заметными (были тонкие и тёмные на тёмном): текст, вылет, прогноз и лог листаются вбок и вниз, и видно, что там есть ещё.
Zazerkalius v0.351 — по снимку «▶ волна» — «мигать кнопкой, например рамкой, когда вкл; также все кнопки, которые двигают что-либо авто». Пока что-то идёт само, у кнопки мигает золотая рамка. Так ведут себя ▶ волна Аниматрицы, ▶ крутить конуса (и её копия в пульте), ♫ звук (на паузе не мигает), ▶ расти и ⟳ крутить у пирамиды. Остановил — рамка обычная.
Zazerkalius v0.350 — по снимку «проход 0 · волна 0/55» — «покажи вверху поля строк справа». Счёт Аниматрицы (проход, волна, цикл) теперь виден и в полосе над полем строк, у её правого края, в рамке. Если полоса длиннее поля и прокручивается, счёт остаётся у края.
Zazerkalius v0.349 — по снимку полосы «📝 Текст конуса и лог лазера» поверх холста — «сделай как было: отдельная вкладка, но она привязана к Конусу ниже, либо отдельным окном в любое место, чтоб двигать». Окно текста снова своё, не внутри конуса: холст конуса занимает всё окно. У окна два положения. 📌 Приколото (по умолчанию): стоит вплотную под окном конуса, той же ширины, и ходит за ним, когда конус тащат, растягивают или прокручивают стол; высота меняется за нижний край. Если потянуть за заголовок, окно открепляется и едет за мышью: это свободное окно в любом месте, размер меняется за угол. 📌 снова прикалывает его под конус. ▾ или двойной щелчок по заголовку сворачивает окно до заголовка, ✕ убирает (вернуть — «📝 Текст» в шапке). Место, размер и положение помнятся (Z.ctw). Конус свёрнут или спрятан — приколотое окно тоже не видно.
Zazerkalius v0.348 — «наборы кнопок, кроме тех, что только для конуса (кручение, кольца), — если переместить целиком на поле строк, то дать туда попасть, если частью — то так же, как сейчас». Группу, отпущенную целиком над полем строк, теперь там и оставляют: она встаёт поверх поля и ездит вместе с ним, когда меняется ширина поля, панели или окна. Пока её тащат целиком над полем, поле обведено рамкой. Отпущенная частью ведёт себя как прежде: висит над холстом, прижатая к окну конуса. Назад — вытащить с поля или правый щелчок по заголовку (на полосу). «Кольца» и «Кручение» на поле не встают. Если поле спрятано, включён дзен или открыта страница одного конуса, группа стоит на полосе конуса, а место на поле помнится (Z.cgrpFld). Группа остаётся частью окна конуса: закроешь окно — пропадёт и она.
Zazerkalius v0.347 — по снимку выделенных бит — «выделенные биты кнопку Стенка помечает и морозит». В «Аниматрице» появилась кнопка 🧱 стенка. Выделяешь биты мышью в строках, жмёшь — они подсвечиваются кирпичным фоном и замораживаются: волна их не переписывает, они держат своё значение, а соседние биты считаются от них как обычно. Если выделить биты, которые уже в стенке, они снимаются; правый щелчок снимает всю стенку. На кнопке — сколько бит заморожено. Стенка хранится по строкам и отрезкам бит (Z.walls), помнится и едет в «💾 Всё». Прежняя «▮ стенка» (столбец от вершины для заготовок и достройки) осталась как была.
Zazerkalius v0.346 — три просьбы по снимкам. «0·1 — Баланс, назови»: кнопка у номеров строк теперь называется Баланс. «В три значка»: списки выравнивания «◫ по центру / ◧ влево / ◨ вправо» (поле строк, ▽ Спуск, ⊿ Сложить) заменены тремя кнопками-значками ◫ ◧ ◨. Кнопки стоят слитной полоской, горит выбранная, названия видны в подсказке. Сам список остался спрятанным: память, события и выставление из кода работают как прежде.
Zazerkalius v0.345 — по снимку «♫ звук» — «пауза и шаг вперёд-назад, стрелки справа-слева». В «Звуке» теперь блок ◀ ♫ звук ▶ и кнопка ⏸. ⏸ останавливает звук, но место и подсветка бита остаются; ⏯ продолжает с того же места. ◀ ▶ проигрывают один шаг назад или вперёд и ставят звук на паузу. Шаг считается по режиму: бит текущей строки, бит звучащих выделенных, бит в чтении подряд или по 2 (с переходом на соседнюю строку) или столбец поля. «■ звук» останавливает совсем, и следующий старт идёт с начала.
Zazerkalius v0.344 — по снимку списка «📋 заготовка…» во всю ширину — «размер 2, внутри сократи „Правило“ — слишком часто слово». В списке теперь R90, R18, R150 — XOR трёх… вместо «Правило 90…»; короче стали и длинные названия: «🔺 Паскаль mod 2» (+1 бит — в подсказке), «R60 — Паскаль ←», «R102 — Паскаль →», «Дракон (сгибы)», «Счёт 1, 10, 11…». Список встаёт в 2 кнопки; что такое R, объясняет подсказка.
Zazerkalius v0.343 — по снимку ползунков «♩» и «🔊» без чисел — «всем ползункам численное значение». У кого своего числа не было (♩ темп звука, 🔊 громкость — в процентах, ↕ и ▬ у конуса, «этаж» пирамиды), оно теперь стоит внутри ползунка, по середине дорожки, как у остальных (v0.333). Число следит и за мышью, и за значением, выставленным из кода: при загрузке, сбросе или пресете оно не отстаёт.
Zazerkalius v0.342 — «ползункам также как и кнопкам фон, рамку, размер стандарт». Ползунок в группе (значок, стрелки ◂ ▸, число внутри) теперь в рамке и на фоне, как кнопка, высотой в кнопку, при наведении рамка подсвечивается. Ползунок скорости кручения между ◀ ▶ тоже: он шириной в 2 кнопки, и весь блок ◀ ползунок ▶ занимает 3 кнопки.
Zazerkalius v0.341 — по снимку списка «Звука» — «сократи, чтобы в размер 1 уместились». Режимы звука теперь строка · разом · подряд · по 2 · столбцы (были «выделенные разом», «по очереди», «по 2 строки» — из-за них список вставал в 2 кнопки). Полные названия — во всплывающей подсказке у списка и у каждого пункта; что делают режимы, не менялось.
Zazerkalius v0.340 — по снимку «🔴 неподв. ⇄» в «Виде» — «раздели на 2 кнопки, вкл либо либо». Была одна кнопка по кругу: выкл → 🔴 неподвижные при развороте ⇄ → 🟢 при реверс-инверсии ⇄🔁 → выкл, — и чтобы попасть в нужный режим, жали по два-три раза. Теперь две кнопки рядом: 🔴 неп. ⇄ и 🟢 неп. ⇄🔁. Включишь одну — другая гаснет; щелчок по горящей — выключить; могут не гореть обе. Что показывают, не менялось — и в строках, и числами у номеров.
Zazerkalius v0.339 — по снимку «Вида» («🔴 неподв. ⇄» обрезана с обеих сторон) — «не совсем расположил» — и по снимку «проход 0 · волна 0/63» — «также размер кнопок, и поле текста выдели фоном или рамкой, выровняй по центру». Кнопки, кнопки-галки и списки, которым мало одной ширины, теперь встают в 2 кнопки (или в 4), а не обрезаются — по тому же правилу «только 1, 2, 4» (v0.335); пересчёт — когда меняется подпись, сворачивается или переставляется группа. Счёт Аниматрицы — полем высотой в кнопку, с фоном и рамкой, текст по центру, ширина — в 2 или 4 кнопки. Ширины теперь меряются разом для всех элементов (прежде — по одному, и при ▶ волне это была перекладка страницы на каждый элемент каждый кадр).
Zazerkalius v0.338 — к окошку «↧ до [N]» (v0.324): «число строк — прямо во время протяжки», «и вверх, и при применении строки надо удерживать на месте это окно, чтобы ещё раз нажать можно». Пока тянешь черту (вверх или вниз), у курсора живая метка «N стр.» — сколько строк сейчас над чертой. Окошко появляется и после протяжки вверх; там по умолчанию ближайшая степень двойки снизу (дотянул до 11 — 8), вниз — сверху (до 11 — 16). Enter или ✓ перестраивают поле, а окошко остаётся открытым на том же месте, с новым числом строк, выделенным — можно сразу набрать другое и применить ещё раз. Закрывают ✕, Esc или щелчок мимо. Каждое применение — своя точка ↩.
Zazerkalius v0.337 — по снимку «⁑ 2 бита» — «измени кнопку: пусть определяет количество бит и расстояние по строке, следующей после строки, где все 1-цы, и автоматом переключает при плее». Кнопка теперь ⁑ авто: над читаемой строкой (или она сама) ищется ближайшая строка из одних 1, и следующая за ней строка — шаблон: сколько в ней единиц, столько бит звучит разом (до 8), а где они стоят — на таком расстоянии впереди читаемого бита, по кругу строки. У треугольника Серпинского под 1111 лежит 10001 — два бита через 4; под 11111111 — 100000001 — два через 8. Считается на каждом шаге звука: читаешь дальше вниз («по очереди», «строка» со сменой текущей, Аниматрица меняет строки) — прошёл новую строку из 1, шаблон меняется сам. Что звучит сейчас, пишется на кнопке: «⁑ 2×8» — два бита через 8, «⁑ 3: 0,2,6» — если шаг неровный; звук стоит — «⁑ авто». Строки из одних 1 выше нет, и в «столбцах» — как прежде, два бита через ↔.
Zazerkalius v0.336 — по снимку свёрнутой полосы «📝 Текст конуса и лог лазера» — «прозрачный заголовок, когда свёрнуто». Скрытая (▾) полоса текста больше не тёмная плашка: без фона, рамки и тени, лежит прямо поверх холста, а холст конуса идёт до самого низа окна. Подпись и кнопки ▴ ✕ читаются по тени; двойной щелчок по подписи или ▴ — развернуть, как прежде. Развёрнутая полоса — как была.
Zazerkalius v0.335 — на «заголовок группы — не уже стандартной кнопки» — «стандарт ширины кнопки — ширины только 1, 2, 4». Всё в группах, что стояло своей шириной, теперь шириной ровно в 1, 2 или 4 кнопки (с зазорами 3 px между ними: 80, 163, 329 px) — наименьшую, в которую влезает: подпись группы (АНИМАТРИЦА — в 2), «весь:», «по биту:», полоса режимов кручения, «🎯 до строки» с полем, голые поля, счёт Аниматрицы «проход · волна · цикл». Ширина пересчитывается, когда меняется текст (счёт Аниматрицы растёт — встанет в 4, не дёргаясь на каждой цифре). Кнопки, списки и поля с подписью внутри — уже в 1 (v0.317), ползунки и блоки «◀ [ ] ▶» — в 2 (v0.320). Кнопки-значки (◀ ▶ ⏮ …) — по-прежнему в полкнопки, две — как одна.
Zazerkalius v0.334 — по снимку «АНИМАТРИЦА 🧘» — «заголовок группы — как кнопка размерами, не давать размера больше, если пустые области появляются». Подпись группы теперь размером с кнопку: высотой 24 px, не уже стандартной кнопки, сверху слева — вровень с первым рядом кнопок (прежде тянулась во всю высоту группы); у свёрнутой до заголовка группы — как была. Уголок размера (v0.315, v0.332) больше не даёт пустых мест: высота группы — всегда ровно по кнопкам, а ширина прижимается к правому краю самого длинного ряда, так что тянуть уголок — это выбирать, по сколько кнопок в ряд: от самой широкой кнопки до всех в одну строку.
Zazerkalius v0.333 — по снимку «◂──●──▸ 30°/с» у скорости кручения — «все ползунки — текст в ползунок». В v0.322 число клалось на дорожку только у ползунков, стоящих прямо в группе; у кручения метка лежит глубже — число осталось справа. Теперь по-другому: число любого ползунка страницы (скорость кручения, ⚡ волна, щель лазера, «этажей» пирамиды — у кого оно есть) переезжает внутрь обёртки самого ползунка и лежит ровно по середине дорожки, между стрелками ◂ ▸ — независимо от того, где ползунок стоит и есть ли у него значок слева. Мышь проходит сквозь число.
Zazerkalius v0.332 — по снимку группы «Вид», сжатой уголком до одной подписи (кнопки спрятались), — «кнопки, если не помещаются в группе, — не давать размера». Уголок (v0.315) больше не сжимает группу меньше, чем нужно кнопкам: ширина — не меньше самой широкой кнопки или ползунка, высота — не меньше, чем занимают все кнопки при этой ширине (уже — выше, шире — ниже). Уже сжатые группы при загрузке показываются в нужный рост; сохранённое значение при этом не трогается, а запоминается то, что видно, — когда уголок тянули и отпустили. Больше, чем нужно, — можно, как прежде.
Zazerkalius v0.331 — «в группу Аниматрица — кнопку: возврат всех битов на какие были». Кнопка ⤺ возврат (перед ⏮): поле снова такое, каким было до первой волны — проход 0, — сколько бы проходов ни прошло, одним щелчком; счёт проходов и цикла — с нуля. ⏮ возвращает только на проход назад, и его история ограничена по памяти, а исходные биты возврат держит всегда. «До волны» — это после последней правки строк не волной (руками, шаблоном, заготовкой, ↩): после такой правки волна начинает заново, и возврат ведёт уже к ней. Сам возврат — точка ↩.
Zazerkalius v0.330 — «проверь все подсказки у всех кнопок». Прочитаны все 247 подсказок страницы и сверены с тем, что кнопки делают сейчас. Исправлены устаревшие: 🗑 под чертой (обещала удаление щелчком по битам — снято в v0.325); край левой панели (двойной щелчок — ширина по умолчанию, сама она с v0.255 не расширяется); «↺ Начало» — в «Шаблонах», не в «Построении» (v0.305), и ⭐ называла её прежним именем «↺ Начальные»; список оси кольца — пункты с v0.320 «⇄ строки», «★ лучшая», «✋ вручную», «◐ 180°», подсказка ссылалась на старые названия; режимы кручения — без номера версии в тексте; ▶ крутить — направление с v0.136 задаёт кнопка ↻ / ↺, а не «минус», и про правый щелчок (всё кручение на места) не было ни слова; ⌖◁ ⌖▷ — вместо путаной смеси «(v0.139: …)» и прежнего поведения «в щель кольца 2» — как они работают сейчас: крутят строку 1, пока вырез не встанет на неподвижный лазер, открыт — закрывают; счёт Аниматрицы — что такое проход, волна и цикл; ✕ у полосы текста — «убрать полосу», окна больше нет. Остальные подсказки верны.
Zazerkalius v0.329 — по снимку «проход 0 · волна 0/47» — «проход — это же цикл? как точнее объясни и поправь, если». Нет, не одно и то же. Волна — номер строки, до которой дошла перезапись в этом проходе (из N − 1: строка 1 не переписывается, она источник). Проход — волна прошла от верха до низа один раз. Цикл — через сколько проходов картина всего поля повторилась (сравнение по отпечатку после каждого прохода); он может быть и 1 проход, и тысячи, а может не найтись долго. Путаница была в самой странице: галка «⟳ циклами» и «цикл/с» у ползунка на деле гнали и считали проходы (название пришло из Треугольника). Теперь — «⟳ проходами» и «прох/с». А найденный цикл в строке счёта пишется полнее: «цикл 12 прох. (с 3-го)» — повтор длиной 12 проходов, начался с прохода 3.
Zazerkalius v0.328 — по снимку полей «[256 стр.] [сид 1]» — «выровняй по середине». Число или строка в поле с подписью внутри (v0.327) — по середине поля, между подписями, а не прижаты к левому краю; по высоте — тоже посередине.
Zazerkalius v0.327 — по снимку «[256] стр. · сид [1]» в «Аниматрице» — «текст убрать в поля». У полей ввода в группах конуса подпись теперь внутри самого поля, мелко и приглушённо: что стояло перед полем — слева в нём (сид, от, ↔ у «⁑ 2 бита», ⌖× у лучей лазера), что после — справа (стр., ° у угла лазера); число или строка отступают под подпись. Мышь проходит сквозь подпись — щёлкаешь в поле, как прежде. Поля — шириной в кнопку, как остальное (v0.317). Стрелок-вертушек у числовых полей больше нет — они наезжали на подпись справа; колесо над полем в фокусе и клавиши ↑ ↓ меняют число, как и раньше.
Zazerkalius v0.326 — по снимку окна «📝 Текст конуса и лог лазера» — «в низ конуса на всю длину, и с возможностью скрытия». С v0.158 оно плавало поверх всей страницы; теперь пристёгнуто к низу окна конуса полосой во всю его ширину, и холст конуса кончается над ней — ничего не закрывает. Высота — тянуть заголовок полосы вверх / вниз (помнится). Скрыть — ▾ в заголовке или двойной щелчок по нему: остаётся одна тонкая полоса-заголовок, ▴ (или снова двойной щелчок) — вернуть. «📝 Текст» в шапке и ✕ — убрать полосу совсем, как прежде. Свёрнуто окно конуса или дзен — полосы нет; на странице одного конуса (?solo=cone) она так же внизу.
Zazerkalius v0.325 — по снимку строк под чертой — «наведение на бит под чертой — убери удаление по клику». С v0.244 наведение на строку за чертой красило её и все строки до черты красным, а щелчок удалял их насовсем. И подсветка, и удаление щелчком сняты: строки под чертой просто лежат, их удаляет только 🗑 в углу поля (и «Заменить» при достройке).
Zazerkalius v0.324 — по снимку черты под двумя строками — «когда вниз тянуть — пусть появляется окошко, по умолчанию до следующего 2, 4, 8, 16… ближайшего, и можно руками набрать номер строки». Протянул черту вниз и отпустил — прямо под ней окошко ↧ до [N] ✓ ✕. N — ближайшая степень двойки не меньше того, до куда дотянул: две строки, чуть потянул до третьей — 4; до девятой — 16 (до 1024 — предел достройки). Число выделено — можно сразу набрать своё. Enter или ✓ — поле достраивается до строки N тем же способом, что и протяжкой (Серп 90 / 30 / маска, сперва — строки из-под черты, если «⤒ из-под черты» включено); меньше, чем есть, — лишние уходят за черту. Esc, ✕ или щелчок мимо — остаётся как дотянул. Протяжка и окошко — каждая своя точка ↩. Вверх черту тянут как прежде, без окошка.
Zazerkalius v0.323 — «колёсико в левой панели — скролл всех окон». Своей прокрутки у левой панели нет (кроме режима значков), и колесо над ней ничего не делало. Теперь колесо над левой панелью прокручивает стол со всеми окнами, как если бы крутили над самим столом; Shift + колесо — стол вбок. Если под мышью то, что прокручивается само и ещё может, — группы кнопок на панели, список шаблонов, панель в режиме значков, — крутится оно, как прежде; поле ввода в фокусе — тоже своё. Ctrl + колесо — масштаб страницы, не трогается.
Zazerkalius v0.322 — по снимку «⚡ ◂──●──▸ 32 стр/с» в «Аниматрице» — «тут число может прям в ползунок закинуть?». Число у ползунков, где оно есть (⚡ скорость волны, скорость кручения, щель лазера), теперь лежит поверх самой дорожки, по её середине — мелко, с тенью цвета фона, чтобы читалось и на дорожке, и на бегунке; мышь проходит сквозь него, ползунок тянется как прежде. Места справа под число больше не нужно — такие ползунки тоже длиной в две кнопки, как остальные (с v0.320 были в три).
Zazerkalius v0.321 — по снимку круглого значка ⌂ в левом нижнем углу — «это наверх, перед заголовком». Значок «в Хаб» (общий модуль hub-link.js, на всех страницах — в левом нижнем углу поверх всего) на этой странице переставлен в шапку, перед «Zazerkalius»: поменьше (26 px), в ряд с кнопками шапки, холст конуса больше не перекрывает. Клавиша H ведёт в Хаб, как прежде. В дзене шапки нет — и значка тоже. Сам модуль не тронут, другие страницы — как были.
Zazerkalius v0.320 — три просьбы по снимкам. «◀ ось: вручную ▶» — «не отделяй их при перестановках, это одно; уменьши длину, и значки первыми, потом текст сокращ.»: стрелки со своей подписью или списком — один блок: ◁ ↻ бит ▷ и ◀ [ось] ▶. Блок не рвётся при переносе строк группы и перетаскивается (в другую группу, окно, шапку) целиком — за любую его кнопку; прежние перестановки этих кнопок теперь двигают весь блок. Длина блока — две кнопки: стрелки в полкнопки, посередине подпись или список шириной в кнопку. Пункты списка — значком и коротко: ⊘ без оси, ★ лучшая, ⇄ строки, ✋ вручную, ◐ 180° (полное название — в подсказке пункта). И «ползунки и значки их — в длину кнопки»: ползунок со значком теперь длиной ровно в две кнопки (с числом справа — ⚡ волна, скорость кручения, щель — в три) и стоит в ряду с кнопками по той же сетке; не влез в строку — переносится и встаёт от того же края. Значок (↕ ▬ ♩ 🔊 …) — в столбце одной ширины, дорожка забирает остальное. Правило v0.316 «ползунки подряд — каждый своей строкой» снято: теперь они встают по два в ряд, если помещаются.
Zazerkalius v0.319 — по снимку группы «Кольца» — «стрелки — между ними текст и поле». Было: «по биту: ◁ ▷» и «[ось: вручную ◀ ▶] ◀ ▶» (список к тому же обрезан стандартной шириной v0.317). Стало: ◁ по биту ▷ и ◀ [ось] ▶ — стрелки по краям, между ними подпись или список. Список оси — по своей подписи (до 170 px), не обрезан; в пункте «ось: вручную» лишние ◀ ▶ сняты — стрелки теперь вокруг списка. Кнопки и их действия не менялись.
Zazerkalius v0.318 — две просьбы подряд. «Звук: кнопку режим 2 бита — чтобы сразу с 2 битов шёл звук, и задать как-то расстояние»: в «Звуке» кнопка ⁑ 2 бита и рядом число ↔ (по умолчанию 4). Включена — в каждой звучащей строке читают две «головки»: та, что была, и вторая на ↔ бит впереди неё, по кругу строки (строка — кольцо конуса, конец переходит в начало); звучат оба бита разом, двумя голосами, громкость делится. Работает во всех режимах: строка, выделенные разом, по очереди, по 2 строки; в «столбцах» — два столбца разом (↔ столбцов между ними), строка, у которой 1 в обоих, звучит один раз. ◉ бит подсвечивает в поле обе головки. Выключена — поле ↔ тусклое, звук — как прежде. И «в Вид — кнопку: подсветить 1 бит каждой строки»: галка-кнопка ① 1-й бит — первый бит каждой строки (самый левый в поле) обведён золотом на своём кольце, видно, откуда строка начинается и куда повёрнута; в 3D — золотая черта по биту. У строк из 1–2 бит в «многоугольниках» (точка и Г) обводки нет.
Zazerkalius v0.317 — по снимку группы «Звук» на левой панели (каждая кнопка и список — своей строкой, все разной длины) — «всем кнопкам и спискам — стандарт длины кнопок, если в строку более чем 1 помещается, то туда». У кнопок, кнопок-галок и списков во всех группах конуса теперь одна ширина — 80 px (переменная --bu), кнопка-значок, где не больше двух знаков (◀ ▶| ↻ ⏮ 01), — в полширины, так что две такие занимают место одной обычной. Сколько влезает в строку группы, столько и встаёт, и столбцы получаются ровными. Кто значок, считается по подписи и пересчитывается, когда она меняется (▶ / ⏸, «◉ только значки»). Длинная подпись обрезается по краю — целиком она в подсказке у кнопки. Ползунки (строкой, v0.316), подписи вроде «весь:» и числовые поля — своей ширины, как были.
Zazerkalius v0.316 — «ползунки, если не в строке, то все друг под другом, и выровняй». Ползунки, что стоят в группе подряд (↕ высота и ▬ толщина в «Виде», ♩ темп и 🔊 громкость в «Звуке»), теперь каждый своей строкой во всю ширину группы, один под другим, а значок слева — в столбце одной ширины: дорожки начинаются ровно от одного края (прежде 🔊, шире ♩, сдвигал свой ползунок вправо). Одиночный ползунок среди кнопок — скорость кручения, щель лазера, ⚡ скорость волны — остался в ряду с ними. Только CSS, на полосе конуса и на левой панели одинаково.
Zazerkalius v0.315 — по снимку группы «Звук» — «дай возможность уголком менять вручную размер» и следом «и перетаскивание за любую пустую область». В правом нижнем углу каждой группы кнопок конуса (на полосе, поверх холста и на левой панели) — маленький уголок в две косые черты цвета группы: тянешь его — меняются ширина и высота группы, кнопки переносятся по новой ширине (ограничение 430 px у блока кнопок для такой группы снято). Размер помнится (Z.cgrpSize, едет в пресет вместе с местами групп), двойной щелчок по уголку — прежний, сам по содержимому. Свёрнутая до заголовка группа уголка не показывает и размер на это время не держит. Тащить группу теперь можно не только за подпись, а за любое место без кнопок, полей и списков — промежутки между кнопками, подписи вроде «весь:», поля вокруг; курсор там — «переместить». Двойной щелчок по пустому месту по-прежнему сворачивает группу, правый щелчок по подписи — обратно на полосу.
Zazerkalius v0.314 — по снимку пульта у холста конуса в плоском виде (🧊 3D, ⧗ зерк., ↺, ⠿, ▶ крутить, ↻) — «тут сразу покажи все кнопки, но приглушёнными, которые не активны». С v0.285 в плоском виде кнопки 3D (⟲ ▲ ⟳ − ⌂ + ▼) пропадали совсем, и пульт сжимался; теперь он всегда полный, той же формы и в той же бирюзовой рамке, что в 3D, а кнопки 3D в плоском виде тусклые и не жмутся (щелчок по ним ничего не делает и пульт не тащит). Включил 🧊 3D — те же кнопки становятся яркими, на своих местах. ↺ всё на места, ▶ крутить и ↻ работают в обоих видах, как прежде.
Zazerkalius v0.313 — по снимку полосы конуса — «группы кнопок сделай разными цветами, сделай все ползунки стандартного размера раза в 2 длиннее». Группы: у каждой свой цвет — полупрозрачный фон, рамка и подпись, как у «Кручения» с v0.153 (оно так и осталось золотым): «Вид» — голубой, «Кольца» — зелёный, «Аниматрица» — оранжевый, «Звук» — фиолетовый, «Лазер» — розово-красный. Цвет — классом у самой группы, поэтому едет с ней и на левую панель, и когда её тащат; там фон непрозрачный, как был. «Дзен» — служебная, пунктирная, без цвета. Ползунки: короткими их делала не страница, а стрелки ◂ ▸ общего модуля slider-arrows.js — обёртка брала прежнюю ширину ползунка (60…90 px), и стрелки съедали из неё свои 32 px, дорожке оставалось 30…60. Теперь у всех ползунков страницы одна длина — 140 px вместе со стрелками, дорожка около 108 px (вдвое длиннее прежней средней). Модуль не тронут — правило только на этой странице.
Zazerkalius v0.312 — по снимку левой панели со свёрнутыми группами — «поправь, когда сворачивается, чтобы кнопка обратно развернуть не заезжала вверх». Кнопка ◂ (свернуть панель в значки) стоит в правом верхнем углу панели поверх первого заголовка «💾 Страница целиком» — с v0.310, когда у заголовков появилась стрелка ▾ / ▸ справа, эта стрелка у первой группы оказалась прямо под ◂, и свёрнутую группу было не видно, как развернуть (и сам заголовок обрезался: «Страница целико»). Теперь первый заголовок кончается левее кнопки: справа у него отступ под ◂, длинная подпись переносится на вторую строку, стрелка ▸ видна рядом с кнопкой. В столбике значков заголовков нет — там ничего не менялось.
Zazerkalius v0.311 — «двойной клик по полю строк не убирает выделение — даже вне бит, должен убрать все». В v0.292 двойной щелчок по любому месту строки (и по пустому рядом с битами — строка тянется во всю ширину поля) выделял её, поэтому выделение не снималось. Теперь двойной щелчок выделяет строку только по её номеру; по битам, по пустому месту в строке и мимо строк — снимает все выделения (строки, подсветку текущей, текст, ось). Одиночный щелчок по битам выделяет строку, как и прежде.
Zazerkalius v0.310 — по снимку левой панели — «скрывай вкладки при нажатии заголовка». Щелчок по заголовку группы левой панели («💾 Страница целиком», «Шаблоны», «Построения», «△ Треугольник из строки», «✂ Нарезать треугольник», «Заготовки») сворачивает её, ещё щелчок — разворачивает; справа у заголовка ▾ / ▸. Какие группы свёрнуты, страница помнит. «◯ Группы конуса» и «Окна» (их показывает сама страница) не сворачиваются. В панели значками (◂) видно всё, как прежде.
Zazerkalius v0.309 — «поле Конус — одиночный клик без перемещения — снять выделение». Щелчок по холсту конуса без сдвига (без Ctrl и Shift) — как Esc: выделенные кольца (строки) сняты, подсветки текущего нет; и в плоском виде, и в 🧊 3D. Прежде (v0.248) такой щелчок по кольцу делал его строку текущей, а нажатие по холсту зажигало подсветку текущего (v0.107) — это снято. Остальное как было: Ctrl + щелчок по кольцу — выделить / снять кольцо, Shift + щелчок — сменить бит, тянуть — сдвиг вида (в 3D — вращение), Ctrl + тянуть кольцо — крутить его, щелчок по ячейке строки для заполнения — 0 ↔ 1, двойной щелчок — кручение / пауза.
Zazerkalius v0.308 — по снимку группы «Построения» — «отсюда удали дубли». Сняты две кнопки, которые повторяли «Заготовки» (v0.307 — рядом в левой панели): «● Зерно» (вставить «1» под текущей — ровно заготовка «● 1») и «🎲 Случ.» (случайная строка). Чтобы не потерять «той же длины», заготовка «🎲 Случ. 16» стала «🎲 Случ.»: случайная строка длиной как текущая, нет строк — 16 бит. Остальные кнопки «Построений» на странице больше нигде не повторяются.
Zazerkalius v0.307 — по снимку панели под чертой — «отсюда убери то, что не относится к построению от линии». Под чертой остались только «достроить:» (🔺 Серп 90, 30, маска, ▮ стенка) и «под чертой:» (Заменить, ⤒ из-под черты). Остальное не удалено, а переехало в левую панель, под «△ Треугольник из строки»: группа «✂ Нарезать треугольник» (✂, фигура, высота, порядок, без пустых) и группа «Заготовки» — встроенные шаблоны (● 1, 🔺 Серп. ×16, Туэ–Морс, 0…15, палиндромы, 0101…, сбой, случайная), по два в ряд, как было до v0.225. Работают как прежде.
Zazerkalius v0.306 — по снимку кнопки «✕ Удалить» — «удали её». Кнопка «✕ Удалить» (удалить текущую строку) снята из «Построений». Строки по-прежнему удаляются клавишей Del — выделенные или текущая; ↩ вернёт.
Zazerkalius v0.305 — по снимку кнопки «↺ Начало» — «также» (к Шаблону, как «🧹 Очист.» в v0.304). «↺ Начало» (столбик — снова начальные строки) переехала из «Построений» в группу «Шаблоны», после «🧹 Очист.». Работает как прежде.
Zazerkalius v0.304 — по снимку кнопки «🧹 Очист.» — «это к Шаблону». «🧹 Очист.» (очистить весь столбик) переехала из группы «Построения» в группу «Шаблоны» левой панели, после «+ новый». Работает как прежде.
Zazerkalius v0.303 — по снимку шапки окна «◯ Конус» — «сюда кнопку для открытия в …/Zerkalius-zazerkalius.html?solo=cone». В шапке окна конуса появилась ↗: открывает конус отдельно (эта же страница с ?solo=cone — одно окно конуса и поле строк, своя память) в новой вкладке. Адрес строится от нынешнего, поэтому кнопка работает и на localhost, и на сайте. В самом отдельном конусе ↗ нет.
Zazerkalius v0.302 — просьба пользователя, пересланная из другой сессии: «переименовать „💾 Всё“ и „📂 Всё“ и отделить их группу от „Шаблонов“». Кнопки называются «💾 В файл» и «📂 Из файла» (что делают — прежнее: вся страница в файл .json и обратно). Группа «💾 Сохранение» разделена на две: вверху «💾 Страница целиком» — «💾 В файл», «📂 Из файла», «⭐ Умолчание»; под ней «Шаблоны» — «💾 Сохр», «+ новый» и свои шаблоны. Подсказки и сообщения говорят новыми названиями.
Zazerkalius v0.301 — по снимку своего шаблона с 💾 ⚑ ✕ — «убери + Столбик под чертой, поставь к шаблонам + новый; выделенный шаблон — текущий, жёлтым, флажок тогда не нужен», и выбор «💾 Сохр — в текущий». Текущий шаблон горит жёлтым: с ним сравниваются строки (номера изменённых — золотом), и в него пишет «💾 Сохр». Щелчок по своему шаблону загружает его в поле и делает текущим (Shift — вставить под текущей строкой, текущим не делает). «+ новый» (рядом с шаблонами, в группе «Сохранение») — новый шаблон из всех бит, сразу текущий. «💾 Сохр»: есть текущий — перезаписывает его (правый щелчок — вернуть прежние биты, ещё раз — снова записанные), нет — сохраняет новый. Сняты: ⚑ и 💾 у каждого шаблона, «+ Столбик» под чертой.
Zazerkalius v0.300 — «строки не надо сохранять», «я о том, что шаблоны — только все строки, а не по одной». Кнопка «+ Строка» под чертой снята: свои шаблоны сохраняются только целым столбиком («💾 Сохр» в группе «Сохранение» или «+ Столбик»). 💾 у шаблона-эталона тоже всегда записывает весь столбик. Уже сохранённые шаблоны-строки не тронуты — работают как прежде, удалить — ✕.
Zazerkalius v0.299 — «да» на «правый щелчок по 💾 — вернуть прежнюю версию» (к v0.298). 💾 у шаблона-эталона теперь помнит, какими были биты шаблона до записи. Правый щелчок по 💾 возвращает прежние биты (и прежнее имя), а записанные уходят в запас; ещё правый щелчок — снова записанные. Запас один — последняя запись; он хранится вместе с шаблоном и едет в «💾 Всё».
Zazerkalius v0.298 — «у текущего шаблона — кнопку, которая изменённые биты сохранит, то есть изменит сам шаблон». У шаблона-эталона (тот, у которого горит ⚑, — с ним сравниваются строки, номера изменённых золотом) появилась 💾: записывает в сам шаблон нынешние биты — столбик получает весь столбик рабочего поля, шаблон-строка — текущую строку. После этого золотые номера гаснут: поле и шаблон снова совпадают. Имя, которое дала страница («Столбик · 27 стр.»), подстраивается под новый размер; своё имя не трогается. Прежние биты шаблона не сохраняются — об этом говорит подсказка кнопки.
Zazerkalius v0.297 — по снимку «💾 Сохр» и своего шаблона в шапке — «убери их в левую, в самый верх, сделай там группу, и туда все кнопки сохранения настроек и пресетов». В левой панели первой стоит новая группа «💾 Сохранение»: «💾 Сохр» (биты поля — своим шаблоном), «⭐ Умолчание», «💾 Всё» и «📂 Всё» (файл .json со всем), под ними — свои шаблоны во всю ширину (⚑, ✕, двойной щелчок — переименовать). Из шапки все они ушли. Работают как прежде; в панели значками — столбиком, без ⚑ и ✕.
Zazerkalius v0.296 — по снимку своего шаблона «Столбик · 27 стр.» (с ⚑ и ✕) под чертой — «это на верхнее меню, и кнопку Сохр (биты)». Свои шаблоны переехали в шапку, сразу за закреплёнными кнопками; перед ними — «💾 Сохр»: сохраняет все биты рабочего поля (весь столбик) своим шаблоном — как «+ Столбик», и новый шаблон становится эталоном ⚑. Щелчки те же: по шаблону — заменить столбик (строку — текущую строку), Shift — вставить под текущей, двойной — переименовать, ⚑ — эталон, ✕ — удалить. Под чертой остались встроенные шаблоны и «+ Строка / + Столбик».
Zazerkalius v0.295 — по снимку сообщения «Тянешь черту вниз — строки достраиваются от верхней: Серп 90…», висящего после нажатия, — «убирай уведомления, которые после нажатия, — при любом следующем клике». Любой щелчок где угодно на странице сперва гасит висящее уведомление (и подсказку); если сам этот щелчок что-то сообщает — его сообщение встаёт следом. Без щелчков уведомление гаснет само, как раньше.
Zazerkalius v0.294 — по снимку всплывшей у мыши подсказки шаблона — «все подсказки показывай в области уведомлений». Подсказки браузера больше не всплывают у мыши: наводишь на кнопку, галку, поле или номер строки — через четверть секунды её текст появляется внизу, там же, где уведомления, и держится, пока мышь над элементом. Ушла мышь — подсказка гаснет; нажал — её сменяет сообщение самой кнопки. Работает для всех подсказок страницы, в том числе у кнопок, которые появляются позже (шаблоны, закреплённые, копии). Сами тексты подсказок не менялись.
Zazerkalius v0.293 — по снимку уведомления внизу экрана, лёгшего на 🗑, — «убери влево значок и уведомление на всякий убери за значки, если накладываются». 🗑 переехал в ЛЕВЫЙ нижний угол видимой части поля строк (выше полосы прокрутки). И он теперь поверх уведомлений: кнопка лежит прямо на странице (position:fixed, выше уведомления), а не внутри поля — изнутри поля её над уведомлением не поднять. Место считается по полю на экране при каждой отрисовке и смене размеров; в дзене и фоне 🗑 нет.
Zazerkalius v0.292 — «2 щелчка по строке — выделение, а по битам одинарный, как сейчас» (уточнение к v0.291). Двойной щелчок по строке рабочего поля — по номеру, по битам или по пустому месту в строке — выделяет эту строку; одиночный щелчок по битам выделяет, как и прежде. Снимает все выделения теперь только двойной щелчок мимо строк — по пустому месту поля или по строкам под чертой. Заголовки полей, ручки осей и строка для заполнения двойной щелчок не трогает.
Zazerkalius v0.291 — «двойной клик по полю строк — должен убирать все выделения». Двойной щелчок в любом месте поля строк снимает всё сразу: выделенные строки, подсветку текущей строки (как Esc), выделенный текст и выделение оси. Раньше (v0.266) он только убирал слово, которое сам выделял на битах. Исключения: двойной щелчок по черте по-прежнему возвращает все строки, а в панели под чертой (кнопки, поля, шаблоны — там свой двойной щелчок, переименование) поле его не перехватывает.
Zazerkalius v0.290 — по снимку поля (🗑 в конце панели под чертой, ниже — строки) — «вот тут в нижний угол всегда». 🗑 вынесен из панели под чертой и стоит поверх поля строк, в правом нижнем углу его видимой части — левее и выше полос прокрутки. Строки прокручиваются, а 🗑 остаётся в углу; при коротком поле — тоже в углу, а не сразу под строками. Место пересчитывается при каждой отрисовке и при смене размеров поля. Когда под чертой пусто, 🗑 бледная и не нажимается, как прежде.
Zazerkalius v0.289 — «значок удалить побольше и прижми вниз вправо» (про 🗑 под чертой). 🗑 крупнее (18 px) и стоит последним в панели под чертой — в правом нижнем углу, после шаблонов. Что делает — как прежде: стирает все строки под чертой, горит, только когда там что-то есть.
Zazerkalius v0.288 — «убери выделение, когда нет внизу ничего» и «да» на разделение кнопок под чертой на группы. «Заменить» и «⤒ из-под черты» касаются только строк, что уже лежат под чертой: когда там пусто, обе ничего не делают, и теперь их подсветка не горит (как и 🗑, погашенная с v0.245). Выбор при этом сохраняется — как только под чертой появятся строки, подсветка вернётся; щелчок по кнопке при пустоте так и говорит. Группы: у трёх кнопок «Заменить · ⤒ из-под черты · 🗑» своя подпись «под чертой:», как у «достроить:» и «нарезать:», и перед каждой подписью, кроме первой, — отступ.
Zazerkalius v0.287 — по снимку кнопки «🗑 под чертой» — «текст — удалить». На кнопке остался один значок 🗑; что она делает — во всплывающей подсказке, как и было.
Zazerkalius v0.286 — по снимку кнопок под чертой, где «Заменить» и «⤒ из-под черты» горят вместе, — «они вместе не могут быть включены, нелогично». Так и есть: при «из-под черты» тянешь черту вниз — сперва возвращаются строки, что под ней, и к достройке под чертой пусто, заменять нечего; а по умолчанию были включены обе. Теперь одна или другая: включил «Заменить» — «из-под черты» гаснет, и наоборот. Сохранённое не переписывается: при включённом «из-под черты» «Заменить» просто показана выключенной — так она и работала.
Zazerkalius v0.285 — по снимку пульта в плоском виде (🧊 3D / ⧗ зерк., под ними пустота, ↺, ⠿, ▶ крутить / ↻) — «ужми пульт в плоском виде». Кнопки 3D в плоском виде были невидимы, но держали место (visibility:hidden) — два пустых ряда. Теперь они убраны совсем: пульт — ряд «↺ … ⠿» и ряд «▶ крутить / ↻», над ним «🧊 3D / ⧗ зерк.». В 3D — как был.
Zazerkalius v0.284 — «и обычную запись mp4 тоже сделай покадровой — такую возможность». Обычная ⏺ / mp4 пишет то, что делаешь руками, — это реальное время, её оставили. Рядом новая 🎞 — покадровая запись КРУЧЕНИЯ: шаг кручения вынесен из кадра анимации в autoStep(dt) (режимы, лазер, краска, ✺, остановки на проходе — всё то же), и 🎞 зовёт его ровно на 1/fps секунды на кадр, рисует и отдаёт кадр кодировщику (общий с ↻1: WebCodecs H.264 + mp4-muxer). В ролике время ровное, как бы ни тормозил браузер: на экране конус тогда идёт медленнее, в файле — ровно. В файл идут кадры, только пока крутится: ▶ стоп или кручение встало само — запись ждёт, ▶ — дальше в тот же файл. Ручки крутить можно. На кнопке — длина ролика. 30/60 к/с — правым щелчком (общий с ↻1). Без звука.
Zazerkalius v0.283 — «запись конуса для обоев можно как-то независимо сделать, чтоб не тормозил, даже если в браузере тормозит». ↻1 (один оборот для Lively) писал экран в реальном времени (MediaRecorder): кадр считался дольше 1/30 с — в ролике рывок. Теперь ↻1 пишет покадрово: для кадра k фаза кручения ровно s0 + P·k/N, кадр рисуется и уходит в кодировщик H.264 самого браузера (WebCodecs) с меткой времени k/fps; mp4 собирает библиотека mp4-muxer 5.2.2 (jsdelivr, грузится при первой записи). Сколько бы ни считался кадр — в ролике всё ровно, медленный компьютер просто дольше пишет; на кнопке — проценты, в подсказке — сколько осталось. N кадров — ровно один период, ролик замыкается без скачка. 60 кадров/с, правый щелчок по ↻1 — 30/60. Размер — холст конуса (▣ показывает кадр), стороны округляются до чётных. Без звука. Вкладку можно свернуть — не встанет. Нет WebCodecs, интернета или кодировщик не берёт размер — прежняя запись в реальном времени. ⏺ и mp4 (обычная запись) — как были.
Zazerkalius v0.282 — «галки тоже сделай переименовываемыми». В ✎ Правке щелчок по галке (по флажку или её подписи) не переключает её, а открывает тот же редактор: своё название, «◉ значок» (👁 выдел. → 👁), «↺ как было»; «вся панель» теперь берёт и галки. Помнится по флажку (Z.btnLab, ключ — его имя); подпись рисуется после флажка поверх исходного текста. Копии галок на холсте и в «Дзене» — со своим названием. Списки и ползунки по-прежнему только переставляются.
Zazerkalius v0.281 — четыре просьбы подряд. (1) По снимку «Кручения»: «дай возможность включать режим редактирования панелей — там переставлять кнопки и давать им названия или оставлять только значки». В шапке — ✎ Правка (выход — ещё раз или Esc). В режиме кнопки панелей не жмутся: щелчок открывает редактор — своё название, «◉ значок» (только значок), «↺ как было», и то же для всей панели. Текст кнопки код меняет по-прежнему (▶ крутить → ⏸ стоп) — подпись рисуется поверх, значок берётся живой; своё название без значка получает значок кнопки впереди. Хранится Z.btnLab, пишется только по действию. (2) «Сделай, чтобы кнопки можно было перемещать по любым группам-панелям»: перетаскивание (было — только между группами конуса, v0.258) теперь идёт в любую панель — группы конуса и левой панели, полосы кнопок всех окон, шапку; место — Z.btnMove. Попутно: перенос в конец своей же группы раньше забывался после перезагрузки — теперь помнится (сравнение с исходным соседом справа). (3) «В режиме настройки нужна группа Дзен — туда кнопки копируются, а не перемещаются»: группа Дзен у конуса — видна в Правке и в дзене; брошенная в неё кнопка — копия, жмёт оригинал и горит, как он; внутри копии переставляются, вытащил наружу или правый щелчок в Правке — убрана (Z.zenBtns). (4) «Нужна кнопка запрета выделения колец в конусе — она где-то есть?» — не было; теперь галка 🚫 выбор рядом с «👁 выдел.»: щелчок по кольцу не делает его текущим, Ctrl + щелчок не выделяет, наведение не обводит; сдвиг вида, Shift + щелчок (бит) и Ctrl + тянуть — как были.
Zazerkalius v0.280 — «проверь перетягивание границы — как будто всё осталось, что-то тормоза». Замер на 66 строках (6000 элементов на странице): нажал и повёл — 59 мс, отпустил — 240 мс. Две причины. (1) Курсор ↔ на время протяжки ставился правилом body.wdrag *, а cursor и user-select наследуются: смена класса у body перестилизовала ВСЕ элементы — по 55–70 мс и на нажатии, и на отпускании. Теперь курсор даёт прозрачная накладка поверх страницы (#wShield), у body.wdrag своих свойств нет. (2) Подгонка шага строк (rowsFit) считала ширину поля частью ключа и после каждой протяжки заново раскладывала поле 4–5 раз (0,13 с), хотя строки не переносятся и их высота от ширины не зависит. Ширину из ключа убрали. Стало: начало — 5 мс, отпускание — ~90 мс (это уже сама перекладка поля под новую ширину). То же касается границы панели (#paneEdge).
Zazerkalius v0.279 — по снимкам списка «Всё / Каждое / Встреч Стр / Встреч Бит» и пульта 3D: «это вынеси в кнопки, кнопку Крутить копируй в квадрат этот кнопок … вместе с направлением». Режим кручения в «Кручении» — четыре кнопки слитной полоской, выбранная горит золотом (список остался скрытым: на его значении держатся 🎯, пресеты и «💾 Всё»). В пульте на холсте конуса — нижняя строка: ▶ крутить (⏸ стоп, правый щелчок — всё кручение на места) и ↻ / ↺ направление; жмут те же кнопки «Кручения» и горят вместе с ними. Строка видна и в плоском виде, где от пульта остаётся только зелёная ↺.
Zazerkalius v0.278 — по снимку строки под полем «66 стр. · 2211 бит · текущая 32 … · H 0.99 · ⇄ 56%»: «эту надпись убери здесь и помести её в подсказку для номеров». Под последней строкой сведений больше нет — место не занимают. Наведёшь на номер строки — во всплывающей подсказке сначала своё (строка N, изменена ли), а вторым абзацем те же сведения поля целиком: число строк и бит, текущая, за границей, метрики H и ⇄. Берутся свежими на каждое наведение.
Zazerkalius v0.277 — по снимку столбика номеров с замками и счётчиками (н·м, 0·1): «выделять тут только за номера — всю строку». Протяжка с номера через несколько строк выделяет их целиком, подряд (с Ctrl — к прежним), как протяжка по битам (v0.254); щелчок по номеру — как был (Ctrl — добавить, Shift — диапазон). Счётчики рядом с номером строку больше не выбирают — щелчок по ним ничего не делает, курсор над ними обычный; замок и ↻ — как были. Ширину поля номера больше не тянут (v0.274) — жест освободился.
Zazerkalius v0.276 — по снимку списка «1 поле … 4 поля»: «здесь + создать (поле), и показывать только, если создано 1, 2, 3 поля». В списке теперь только поля, что есть (1 … сколько сейчас), и «+ создать поле», пока их меньше 4. Создать — ещё одно поле, и оно сразу рабочее; если в этом месте лежали строки поля, скрытого раньше выбором меньшего числа, — оно возвращается с ними (строки не стираются, как и прежде), об этом говорит сообщение. Выбор меньшего числа — как был: лишние поля прячутся, не стираясь; удалить поле — ✕ в его заголовке.
Zazerkalius v0.275 — «граница всё равно — не всегда цепляется». Поверх неё ничего не лежало (проверено по всей высоте в обоих положениях поля), но хват был 6 px и невидим: чуть промахнулся внутрь поля — начинался сдвиг поля (v0.264), наружу — стол. Теперь хват 10 px, у края поля — тонкая линия, куда целиться; строки отступают от хвата на его ширину (при поле справа — слева), полоса кнопок над полем — поверх хвата, чтобы её крайние кнопки («по центру») не перекрывались.
Zazerkalius v0.274 — «перетаскивание за номера убери — там сейчас есть граница». Ширину поля строк с v0.218 тянули и за столбик номеров (граница-разделитель тогда была снята), с v0.224 — ещё и за невидимую полосу у края поля. Теперь — только за границу поля; номера снова только выбирают строку (курсор — рука, столбик при наведении больше не подсвечивается). Сброс ширины по умолчанию (двойной щелчок) переехал с номера на саму границу.
Zazerkalius v0.273 — по снимку пульта 3D: «по ширине этого квадрата их расположи сверху». «🧊 3D» и «⧗ зеркало» над пультом (v0.270) торчали влево шире него; теперь стоят ровно по его ширине, пополам (по 48 px), шрифт мельче, «зеркало» — «⧗ зерк.» (полное имя — в подсказке).
Zazerkalius v0.272 — «скролл и граница — друг на друге, посмотри где». Нашлись два места. (1) При «⇆ поле справа» полоса прокрутки стола, перенесённая в v0.270 к его левому краю, легла на хват ширины левой панели (он заходит в стол на 3 px) и закрывала его — теперь полоса правее хвата. (2) При поле слева хват ширины поля (6 px у правого края поля) лежал прямо на полосе прокрутки поля строк — тянули одно, попадали в другое; теперь поле строк отступает от края на ширину хвата, полоса прокрутки — левее него, рядом.
Zazerkalius v0.271 — «тормоза от этой границы остались — там что-то глючит, граница отдельно от курсора тянется иногда». Две причины. (1) Залипание: протяжку ширины за номер строк слушало только само поле; нажал на номер, повёл вниз (не вбок — это ещё не протяжка ширины) и отпустил вне поля — «отпущено» до поля не доходило, слушатели оставались, и следующее движение мыши над полем тянуло границу уже без нажатой кнопки. Теперь «отпущено» ловится на всём окне (и потеря фокуса окна тоже), а движение без нажатой кнопки сразу заканчивает протяжку — так у ширины поля, у ширины левой панели и у черты строк. (2) Тормоза: в v0.269 поле перекладывалось вживую, пока кадр не окажется дольше 0,1 с, — на среднем поле это рывки по 50–100 мс. Теперь при протяжке ширины поля и левой панели поле не перекладывается совсем: за мышью идёт тонкая черта ровно там, где встанет граница, ширина — один раз, когда отпустили.
Zazerkalius v0.270 — три просьбы. (1) «Можно ли конвертировать в обои то, что сделано в полях, в движении?» → из трёх предложенных «сначала запись ровно одного оборота, потом остальные два» (режим обоев для поля строк и пакет для Lively — впереди). ↻1 в полосе записи конуса: запись сама ведёт кручение от места, где конус стоит, до того же места и останавливается — по часам, а не по кадрам, последний кадр за миг до начала, поэтому ролик в Lively крутится по кругу без скачка. Цикл: «всё целиком» и «навстречу по строкам» — 360°, «по биту» — НОК длин строк в битах (если он огромный или оборот дольше 30 мин — сказать и не писать). Скорость и направление — с «▶ крутить»; лазер на время записи выключается (он меняет рисунок, цикл бы не замкнулся); файл mp4, где браузер умеет. (2) По снимку полосы прокрутки вплотную к номерам строк — «этот скролл перемести влево конуса»: при «⇆ поле справа» это прокрутка стола с окнами (она у его правого края — у поля). Теперь своя тонкая полоса у левого края стола, родная спрятана; колесо, перетаскивание бегунка и щелчок по полосе работают. Не rtl: окна на столе стоят от левого края, при rtl вылезшие вправо стали бы недостижимы. То же — у левой панели, когда она прокручивается. (3) По снимку пульта 3D с кнопкой «🧊 3D» над ним — «сюда выбор 3D поставь примерно так» и «⧗ зеркало — туда же»: над пультом у холста конуса — «🧊 3D» и «⧗ зеркало», те же галки, что в «Виде» (включённая — золотая), видны и в плоском виде.
Zazerkalius v0.269 — по снимку поля, сжатого до номеров: «зависание при перетаскивании за границу — курсор уже отпустил, а она сама двигается и всё тормозит». Это была граница ширины поля (тянут за номера или за край поля), а не черта строк. Замер на 180 строках: каждый шаг ширины — 1–2 с: вся раскладка и отрисовка поля (цифры переносятся по-новому), подгонка шага строк (0,2 с — ширина входит в её ключ), кнопки над столбиками; кадры шли медленнее мыши, и граница догоняла её уже после отпускания. Теперь ширина ставится не чаще кадра (последнее место мыши), подгонка шага и кнопки — один раз, когда отпустили; а если кадр всё равно дольше 0,1 с — поле больше не перекладывается, граница идёт за мышью тонкой чертой, и ширина встаёт, когда отпустили. Отпустили кнопку, а браузер не прислал «отпущено» — это видно по следующему движению, и протяжка заканчивается (так же и у черты строк).
Zazerkalius v0.268 — «а если одну кнопку на всё — и потом выбор окна кликом: либо строки, либо конус, и потом 3D». ⏺ ушла из полосы поля строк в шапку (перед 📝 Текст) и стала общей: нажал — окна под мышью обводятся золотым, щелчок по окну — пишется оно, Esc или щелчок мимо — отмена; пока выбираешь, щелчок по окну ничего в нём не делает (конус не крутится, строки не выделяются). На выбор: поле строк, ◯ конус (и в 3D — тот же холст), 🧊 вид, ▲ пирамида. Холсты пишутся напрямую (captureStream) — без вопроса браузера и без кнопок поверх холста; поле строк — как в v0.267, вкладкой с обрезкой по полю. Файл — Zerkalius-stroki / konus / vid / piramida-дата.mp4; звук «♫ Звук», ⏸ пауза, красная рамка у записываемого окна — общие. ⏺ и mp4 на холсте конуса остались как были (с ▣ кадром и в дзене).
Zazerkalius v0.267 — «как записывать видео в области строк?» → «1» (из двух предложенных: запись вкладки с обрезкой или перерисовка строк на свой холст). Поле строк — не холст, у него нет captureStream, поэтому ⏺ конуса его не пишет. Новая ⏺ в полосе поля строк (рядом с 📂 💾): браузер пишет саму вкладку (getDisplayMedia с preferCurrentTab — спрашивает «Поделиться этой вкладкой?»), а кадр обрезается по полю строк (CropTarget / cropTo, Chrome и Edge). Выбран этот путь, потому что в файл идёт ровно то, что на экране — подсветка, звучащий бит, черта, прокрутка, выделение, — и ничего не надо перерисовывать. Цена — вопрос браузера при каждом старте. Звук — дорожка «♫ Звук», как у конуса; формат — mp4, если браузер умеет, иначе webm. Пока идёт запись — поле обведено красным пунктиром снаружи (в файл не идёт), ⏸ — пауза (рамка жёлтая), «Остановить показ» в браузере — тоже стоп и сохранить. Выбрали не эту вкладку — запись не начинается. Что поверх поля (всплывающие сообщения) — в кадр попадает. Заодно подсказка у бит — «щелчок по биту — выделить» (v0.266).
Zazerkalius v0.266 — «выделение сделай по 1 клику, но только по битам, вне бит — перетаскивание поля». Одиночный щелчок по самому биту (цифре) снова выделяет строку: ещё раз по ней же — снять, Ctrl — добавить / убрать, Shift — диапазон от прежней. Двойной щелчок строку больше не выбирает (он бы тут же снял выделение первого щелчка). Мимо бит щелчок ничего не выбирает, а протяжка двигает поле (v0.264). Протяжка по цифрам — как была: в одной строке выделяет символы (тогда строка не выбирается), через несколько строк — строки подряд; щелчок в конце такой протяжки выделение не сбивает. Править строку на месте — F2 / Enter.
Zazerkalius v0.265 — «зависание у границы перетаскивания строк поля». Замер на 400 строках: каждый шаг черты (строка за черту или из-под неё) шёл 1,1–1,25 с. Причины: (1) подгонка шага строк считала каждое новое число строк новым размером поля и заново раскладывала поле 4–5 раз (0,6 с); (2) расстановка ↺ 🔒 ⟲ над столбиками и сам замер размеров поля — ещё по полной раскладке. Теперь, пока черту тянут, шаг строк прежний и кнопки над столбиками не двигаются — и то и другое делается один раз, когда черту отпустили; вне протяжки подгонка тоже не раскладывает поле, если строк стало больше, а шаг и так самый тесный (0,7). Итог на тех же 400 строках: шаг черты — около 0,4 с (было 1,1–1,25). Остаток — одна раскладка всего поля; быстрее — только если рисовать одни видимые строки.
Zazerkalius v0.264 — «сделай перемещение вне клика бит в поле строк, а не выделение, оно — только на битах» и «но подсветка всей строки». Протяжка по полю строк мимо самих бит (цифр) — по пустому месту слева и справа от треугольника, под строками — теперь двигает поле, как рукой (прокрутка вбок и вверх-вниз), и выделения символов не начинает; курсор там — ладонь. Протяжка по цифрам — как в v0.254: в одной строке — символы, через несколько строк — строки целиком. Подсветка всей строки при наведении и выделении — как была. Номера, замки, черта, кнопки под чертой, строка для заполнения — как были; сдвинул поле — щелчок не срабатывает (строку под чертой случайно не сотрёт).
Zazerkalius v0.263 — «а теперь, когда скролл двинул нижний, выделение само пришло в 17 строку». Полоса прокрутки — часть поля строк, и нажатие на неё (как и на пустое место поля, строки под чертой, кнопки под чертой) снова зажигало подсветку текущей строки. Теперь её зажигает только нажатие на номер строки (и стрелки ↑ ↓ с клавиатуры, как было); замок и ↻ — нет (v0.261).
Zazerkalius v0.262 — «после перезагрузки — выделенная строка почему-то, хотя я снял выделение». Снятая подсветка текущей строки (двойной щелчок по выделенной, Esc) жила только до перезагрузки: страница её не помнила и при старте снова зажигала текущую. Теперь помнит (Z.noCur): сняла — после перезагрузки так и снято; выбрал строку — после перезагрузки она выбрана. Проверено перезагрузкой.
Zazerkalius v0.261 — баг: «нажимаю на 6 замок, а выделяется строка 21». Замок сам строку не выбирал, но любое нажатие в поле строк снова зажигало подсветку текущей строки (снятую раньше), а текущей была 21-я — остальные гасли, и казалось, что замок выделил её. Теперь нажатие на замок 🔒 / 🔓 и на ↻ подсветку текущей не трогает. Проверено: 25 строк, текущая 21, подсветка снята — щелчок по замку 6: кольцо 6 заперто, подсветка так и снята, ничего не выделено.
Zazerkalius v0.260 — «Звук: кнопки, ползунки — стрелки всем ползункам всегда, и покажи, какой бит сейчас играется в строках (кнопку, по умолчанию вкл)». (1) Подключён общий модуль сайта _js/slider-arrows.js: у каждого ползунка страницы — ◂ ▸ (щелчок — шаг, держишь — повтор), и у тех, что появятся позже. (2) В группе «Звук» — ◉ бит (по умолчанию вкл): пока звучит, в строках поля подсвечен бирюзовым бит, на котором сейчас каждая звучащая строка (строка — её бит, выделенные разом — у каждой свой, по очереди / по 2 — у звучащей строки, столбцы — у строк с 1 в этом столбце). Подсветка — Highlight API, строки не перерисовываются; звук остановлен — подсветка снята.
Zazerkalius v0.259 — по снимку столбика замков (у строк 75 и 80 — в золотой рамке): «непонятно, какие там варианты, зачем выделяется рамкой?» — рамка значила «свой замок кольца, общий его не слушает» → «не должно быть разницы, по какому — общий сразу все открывает и снимает, стирая различие». Теперь общий замок над столбиком запирает или отпирает все кольца разом, а свои замки колец стираются; рамки больше нет. Щелчок по замку строки по-прежнему запирает / отпирает одно это кольцо — до следующего щелчка по общему.
Zazerkalius v0.258 — по снимку «⧗ зеркало»: «не переносится на холст — надо у всех вкладок, чтобы могли, и между вкладками». (1) Галки (метки с флажком) не тянулись на холст с первого раза: у метки браузер решает, тащить ли, раньше, чем доходит нажатие, а разрешение ставилось в миг нажатия (со второго раза выходило). Теперь оно ставится уже при наведении мыши — проверено настоящей мышью, что причина в этом. (2) Между группами: кнопку или галку любой группы конуса (и на полосе, и на левой панели) можно перетащить в другую группу — переезжает она сама, не копия, перед той кнопкой, над которой отпустил (над правой половиной — после неё); группа под ней подсвечена. Место помнится (Z.cgrpMove — раскладка, в ⭐ умолчание не идёт); вернуть — перетащить обратно в свою группу, запомненное тогда забывается. Кнопки не из групп конуса (левая панель, под чертой) так не переезжают — только на холст, как прежде.
Zazerkalius v0.257 — «Звук — добавь, чтобы несколько строк выделенных — как-то разными звуками на строку, и режим чтения строк, и по 2 строки, и разные варианты с музыкой; если её вкл — то также на видео». В группе «Звук»: режимы — строка (как было), выделенные разом (все выделенные строки, до 8, звучат одновременно, каждая своим голосом и в своём такте; нет выделения — текущая), по очереди (чтение: строки одна за другой, как текст — выделенные, нет выделения — всё поле; какая звучит — сообщением), по 2 строки (пары строк разом, потом следующая пара), столбцы (как было). Новый выбор тембра: «🎨 разные» — у каждой строки свой (треугольник, квадрат, пила, синус, дальше — октавой выше и ниже), или один на всех — треугольник, синус, квадрат, пила, 🔔 колокол (синус с негармоническим обертоном и долгим затуханием). Видео: дорожка «♫ Звук» теперь идёт в запись ⏺ / mp4 всегда (когда не пишется звук ПК) — включил музыку посреди записи, она тоже в файле; молчит — в файле тишина.
Zazerkalius v0.256 — «видео — когда запись, на паузу можно?» → «да; и ещё в режиме дзен показывать все кнопки и группы вкладок, которые отмечу (надо у них кнопку сделать), а кнопки записи видео — всегда; и кнопку рядом с видео — ставит расположение, как будет на видео». (1) Кнопки записи — одной полосой в левом нижнем углу холста: ⏺ (webm), mp4, ⏸, ▣ (прежде mp4 стояла в ряду справа от холста и отнимала у него место). (2) ⏸ пауза — видна, пока идёт запись: запись встаёт, конус можно крутить и настраивать — в файл не идёт; ▶ — дальше в тот же файл; рамка кадра на паузе жёлтая, время в подсказке ⏹ — без пауз, длительность webm — тоже. (3) ▣ кадр — конус в середину кадра (как при старте записи) и рамка кадра на холсте, пока не нажмёшь ещё раз; рамка следит за размером холста (и в дзене). (4) Дзен: кнопки записи теперь видны (прежде прятались); у каждой группы конуса в заголовке — 🧘: отмеченные группы видны и в дзене, поверх конуса, где стоят (с левой панели — на время дзена у верхнего края, после — обратно на панель). Кнопки, перенесённые на холст (v0.203 / v0.249), в дзене видны и так.
Zazerkalius v0.255 — по снимку группы «Звук» на левой панели: «когда группы в левом меню — заголовки вверх, и проверь, чтобы все легли; ширину самого поля не менять, левого». На левой панели у группы заголовок теперь сверху, кнопки под ним во всю ширину панели (ползунки чуть короче, списки не шире панели). Панель сама больше не расширяется (в v0.252 она раздвигалась под две группы) — остаётся 250, как была; тянуть её край рукой по-прежнему можно, двойной щелчок по краю — снова 250. Проверено: все шесть групп на панели — ни одна кнопка не вылезает за край; не влезли по высоте — список групп прокручивается сам.
Zazerkalius v0.254 — «выделение в поле строк — по двойному щелчку или протяжкой» → «протяжкой по битам» и «вместо одного щелчка выделения — двойной нужен». По битам строк: одиночный щелчок больше ничего не выбирает и подсветку не трогает; двойной щелчок — выделить строку (по уже выделенной — снять, с Ctrl — добавить / убрать); протяжка по битам через несколько строк — выделить их подряд (с Ctrl — к прежним), остальные строки гаснут, как при выделении по номерам. Протяжка внутри одной строки по-прежнему выделяет символы (Del, Ctrl+C). Править строку на месте, что раньше было на двойном щелчке, — теперь F2 или Enter (текущая строка; не срабатывает, когда фокус в поле ввода или на кнопке). Номера строк — как были: щелчок выделяет, Ctrl / Shift — добавить / диапазон, двойной — ширина поля по умолчанию.
Zazerkalius v0.253 — «когда под линией у строк есть биты — надо кнопку, чтобы их включать, когда вниз тянуть; она по умолчанию». Под чертой — ⤒ из-под черты (по умолчанию вкл): тянешь черту вниз — сперва возвращаются строки, что лежат под чертой, по порядку, и только когда они кончились — достраиваются новые (Серп 90 / 30 / маска, от последней вернувшейся). Выкл — как в v0.225: черта вниз сразу достраивает новые от нижней строки над чертой, а что было под чертой — удаляется или сдвигается вниз по «Заменить». Проверено: над чертой 1…1111, под ней 00000 и 000000, черта на 7 — вкл: вернулись обе, седьмая достроена от них; выкл: 10001, 110011, 1010101, под чертой пусто.
Zazerkalius v0.252 — «а сами панели вкладок — переносить на левую панель, чтоб там по 2–3 в ряду вставали» (уточнено: группы конуса). Группу конуса (Вид, Кольца, Кручение, Аниматрица, Звук, Лазер) тянут за заголовок: пока тащат, она висит над всей страницей; отпустил над левой панелью — встаёт внизу панели, в разделе «◯ Группы конуса», в ряд с другими, перед той, над которой отпустил; иначе — висит поверх холста, как прежде. В панели группы узкие (кнопки переносятся), а панель сама расширяется под две в ряд (одна — под одну); край панели тянется мышью (тогда ширина твоя), двойной щелчок по краю — снова сама. Назад: вытащить за заголовок на холст или правый щелчок по заголовку — на полосу конуса. Панель пуста — ширина прежняя, 250. Порядок групп — Z.cgrpDock, ширина — Z.paneW; это раскладка, в ⭐ умолчание и в пресет конуса она не идёт. Свёрнутая до значков панель группы прячет.
Zazerkalius v0.251 — «биты в видах сверху, сбоку в 3D — сделай кнопку вкл / выкл, по умолчанию выкл». Цифры бит в 3D (v0.243) теперь по галке 01 рядом с «⧗ зеркало»; по умолчанию она снята — ровно сбоку и сверху конус рисуется без цифр, как до v0.243. Галка запоминается и едет в ⭐ умолчание конуса вместе с прочими настройками 3D.
Zazerkalius v0.250 — «что с кнопкой видео? mp4 пишет?» (нет: ⏺ конуса писал только .webm) → «добавь кнопку туда рядом с имеющейся». Рядом с ⏺ — mp4: та же запись холста конуса, но в файл .mp4 (H.264, со звуком — AAC), его без перекодировки открывают телефон, Телеграм, YouTube, любой плеер. Всё остальное общее с ⏺ (одна функция на обе кнопки, подсказка второй сессии): рамка кадра, конус в середину кадра, звук ПК правым щелчком (по любой из двух), дорожка «♫ Звук» копией. Длительность в заголовок у mp4 не дописывается — она там и так есть. Идёт запись любой из двух — щелчок по любой её останавливает. Браузер без mp4 — сообщение, запись не начинается.
Zazerkalius v0.249 — по снимку «одинак.» и «3D»: «любые кнопки сделай переносимыми на поле, а не только те, что сейчас». На холст конуса (v0.203) тянулись только кнопки с именем (id). Теперь тянутся ещё: галки — метки с флажком («🧊 3D», «одинак.», «свет»…): копия щёлкает флажок и горит, пока он стоит; и кнопки без имени, но с меткой data-… в окне с именем — шаблоны под чертой, ⟲ ▲ ⌂ − + у 3D, виды «сверху / спереди…», ①②③: такая запоминается селектором ({ sel } в Z.coneBtns). Кнопки, что действуют на нажатие (⟲ ▲ у 3D — держишь, повторяется), получают с копии и нажатие; взяли его — щелчок второй раз не передаётся. Не тянутся только кнопки заголовков окон (?, ⛶, ⧉, –) — у них нет ни имени, ни метки.
Zazerkalius v0.248 — «в конусах курсором двигать круги — только через Ctrl», «в поле конуса». На холсте плоского конуса кольцо крутится (а с ним и строка в поле), только если тянуть его с Ctrl. Без Ctrl тянешь по кольцу — сдвигается весь вид, как мимо колец; щелчок — выбрать строку. Ctrl + щелчок без движения — выделить / снять кольцо, как в v0.231; Shift + щелчок — сменить бит, как было. Кольцо строки 1 при луч-часах (с вырезом) — тоже только с Ctrl. Причина: кольца сдвигались от случайного движения мыши, когда хотелось подвинуть вид или просто выбрать строку. В 3D всё по-прежнему: тянешь — поворот, с Ctrl — сдвиг.
Zazerkalius v0.247 — по снимку заголовка «поле 1 · 250 стр.»: «надо кнопку удалить поле». В заголовке каждого поля (они видны, когда полей больше одного) — ✕: поле уходит со всеми строками и строками за чертой, поля правее сдвигаются на его место, ↩ вернёт. Последнее поле не удаляется. Раньше удалить поле можно было только через Del по выделенной оси в наложении.
Zazerkalius v0.246 — «почему всё тормозит?». Замер на 160 строках + 100 под чертой: перерисовка поля строк шла 0,7 с, общая перерисовка — 1,8 с, а поле перерисовывается почти на любое действие (и на каждом кадре Аниматрицы). Причины и что сделано: (1) подгонка шага строк под высоту поля каждый раз сбрасывала шаг и заново раскладывала всё поле 4–5 раз (по 0,1 с) — теперь, если строк, шрифта и размеров поля столько же и всё помещается (или ужато до предела), шаг прежний и раскладка одна; класс ужатости не сбрасывается при перерисовке; (2) ширина сведений и кнопок под чертой и сдвиг ↺ 🔒 ⟲ над столбиками писались заново, даже когда не менялись, — каждая запись давала ещё одну раскладку поля; теперь пишется только новое значение, а сдвиг считается от нынешнего без сброса в 0; (3) шрифт и кегль (--ff, --fs) ставились на всю страницу на каждой перерисовке — пересчёт стилей 12 тыс. элементов; теперь только при смене; (4) подсветка столбика номеров при наведении была на CSS :has(:hover) — пересчитывала стили всего поля на каждое движение мыши по строкам; теперь — класс, который ставится только при входе и выходе. Итог на том же замере: перерисовка поля ~0,2 с, общая — ~0,3 с. Остаётся: смена текущей строки при всех 21 открытых окнах — ~0,8 с (каждое окно считает свою картину по строке 260 бит); поле строк без «виртуальной» прокрутки дешевле 0,2 с на 260 строках не станет.
Zazerkalius v0.245 — «и кнопку — стереть всё под линией». Под чертой, рядом с «Заменить», — 🗑 под чертой: все строки за чертой стираются насовсем, во всех полях; ↩ вернёт. Когда под чертой пусто, кнопка неактивна. Одну строку и всё над ней до черты по-прежнему стирает щелчок по её битам (v0.244).
Zazerkalius v0.244 — по снимку строк за чертой: «чтобы можно было кликнуть на нижние биты и удалить всё сразу до линии». Щелчок по строке за чертой (по битам, не по номеру) — она и все строки между ней и чертой удаляются насовсем, во всех полях; строки ниже неё поднимаются к черте. Пока ведёшь мышью, то, что уйдёт, подсвечено красным. ↩ вернёт. Щелчок по самой нижней — под чертой пусто. Замок строк это не держит — как и перенос черты: строки над чертой не меняются.
Zazerkalius v0.243 — «3D-режим: пусть при виде сбоку и сверху, когда ровно, показывает биты». В 3D конуса при наклоне ровно 0° (сбоку) или 90° (сверху) на каждом бите пишется его цифра, 0 или 1. Сбоку подписана только ближняя половина кольца (дальняя за ней), и кольца складываются в треугольник строк, как в поле; сверху зеркало под основанием не подписывается — оно лежит ровно под верхним. Размер цифры — по ширине и толщине бита на экране: у краёв сбоку, где биты сжаты, и при тонких кольцах мелкие цифры не пишутся. Под любым другим наклоном — как было.
Zazerkalius v0.242 — «черту тяну вниз — прыгает всё вверх, если ниже экрана». Причина: при каждом шаге черты поле строк перерисовывалось и прокручивалось обратно к текущей строке (обычно 1-й), поэтому дотянуть черту за нижний край было нельзя. Теперь, пока черту тащат (и при итоговой перерисовке после отпускания), к текущей строке поле не прокручивается; у края поля или окна прокрутка идёт сама, пока курсор там, даже если мышь стоит, — строки достраиваются дальше вниз.
Zazerkalius v0.241 — по статье «When Information Hits a Wall: Barriers in Cellular Automata» (dev.to) — «да» на стенку в правилах. Под чертой — ▮ стенка и поле «столбец от вершины» (0 — по центру, минус — влево, плюс — вправо; по умолчанию −8). Нажата — одна клетка поля заморожена: не обновляется и держит своё начальное значение, сигнал на ней отражается или гаснет. Действует на достройку под чертой (Серп 90 / 30), заготовки Аниматрицы и карту ▦ 256 (там и картинки правил — со стенкой). Стенка на затравке «1» — вечный источник единиц. Проверено: правило 90, стенка на −4 — первые 4 строки как обычно, с 5-й левая ветка гаснет о стенку, левее неё пусто, справа узор отражается; стенка 0 на «1» — центр всегда 1; без стенки строки совпадают с обычными один в один.
Zazerkalius v0.240 — «3» (третья идея Cellcosmos — звук из бит): группа конуса Звук. ♫ — пуск / стоп. Режим «строка» — текущая строка тактом слева направо: 1 — нота, 0 — пауза, высота — число из трёх бит с этого места (0…7) как ступень лада, поэтому одинаковые рисунки звучат одинаково. «Столбцы» — шаг — столбец поля: звучат строки с 1 в нём (не больше 8 разом, первые сверху), высота — по номеру строки, сверху выше, через три октавы по кругу. Лад (пентатоника, минор, мажор, хроматика), темп 1…30 шагов в секунду, громкость — помнятся. Строки меняются на ходу (волна, правка) — звучит уже новое. Звук идёт в запись ⏺ конуса напрямую, без захвата экрана; со «звуком ПК» — из захвата (он и так слышит всё, иначе звучало бы дважды). Осталось: какой бит сейчас звучит, на поле и конусе не подсвечивается.
Zazerkalius v0.239 — по странице Cellcosmos (лаборатория элементарных автоматов) — «делай 1 и 2»: (1) ▦ 256 рядом со списком заготовок Аниматрицы — карта всех 256 правил сеткой 16×16, миниатюры по 32 строки из нынешнего сида, номер в углу; наведение — правило и его средние энтропия, зеркальность и доля единиц; щелчок — правило строками в поле, как заготовка (↩ вернёт); карта остаётся открытой, выбранное обведено золотым — можно перебирать подряд; закрыть — ▦, Esc или щелчок мимо. (2) Метрики строки: в сведениях поля у текущей строки — H (энтропия по тройкам соседних бит, 0 — один рисунок повторяется, 1 — шум) и ⇄ (зеркальность: доля бит, совпавших с отражением с другого конца; 100% — палиндром, 0% — антипалиндром). Зеркальность выбрана вместо общей «симметрии» Cellcosmos нарочно: у Зеркалиуса главное — ⇄ и инверсия, и 0% здесь не «нет симметрии», а другая, зеркально-инверсная. Счёт — в ядре (zzRowEntropy, zzRowMirror, zzRowsStats). Осталось: третий пункт оттуда — звук из бит (строка как такт) — не делался.
Zazerkalius v0.238 — по снимку групп «Аниматрица», «Лазер», «Кручение» — «все кнопки разъехались — компактными, и размер стандартизируй». Группа конуса — подпись слева (хват во всю высоту, как было) и блок кнопок рядом, который переносится компактно; сетка «два ряда ровными столбцами» (v0.183) растягивала кнопки до ширины самого широкого в столбце — её больше нет. У всех кнопок, галок, списков и полей одна высота (24 px), кегль 12 и отступы; ползунки — 84 px, списки — не шире 130 px. Проверено: во всех пяти группах высота элементов одна — 24 px; свёрнутая группа — одна подпись.
Zazerkalius v0.237 — ответы на незакрытое и по снимку сведений поля — «эту надпись вниз, под последнюю строку». (1) Сведения поля («12 стр. · 102 бит · текущая…») — строкой под последней строкой, над чертой, слева. (2) «Черту выше строки 1 не надо; пусть при построении учитывает: если стоит Серпинский — строит не с 1, а с 11»: 🔺 Серп 90 достраивает по треугольнику — строки растут на 1 бит или над чертой одна строка — Паскаль (1 → 11 → 101…), растут на 2 — правило 90. (3) Нарезка — «нужны ▼, и вообще все вариации настроек — по размерам, по порядку»: фигуры ▲, ▼ (как есть), ▼ перевёрнутые, ▲▼, ◇ ромбы (▲ и ▼ под ним), ⧗ часы (▼ над ▲); порядок — по рядам, вдоль левой, вдоль правой, каждый в обе стороны (кнопки-переключатели: щелчок дальше, правый назад), высота — числом. (4) Сброс ширины поля — «по номерам»: двойной щелчок по номеру строки. Проверено: Серп 90 от «1» — 1, 11, 101, 1111, 10001, от 1, 111 — 11011; 64 строки Серпинского, h = 16: ▲ 10, ▼ 6, ▲▼ 16, ◇ 6, ⧗ 3; все 6 порядков; сведения — под строкой 4, над чертой; двойной щелчок по номеру — ширина по умолчанию.
Zazerkalius v0.236 — «надо рамкой показать размер видео при записи конуса и расположить изначально его посередине»: пока идёт запись ⏺ (и пока мышь над ⏺ — чтобы видеть кадр заранее) холст конуса обведён красным пунктиром, вверху — размер кадра в пикселях (размер холста: окно × масштаб экрана). Рамка — отдельный слой поверх холста, в файл не попадает. Со стартом записи сдвиг конуса сбрасывается — он встаёт в середину кадра; масштаб остаётся, какой был.
Zazerkalius v0.235 — «подключать надо настройку — звук с компа» (к записи ⏺ конуса): правый щелчок по ⏺ — звук ПК вкл/выкл (помнится, на кнопке значок ♪). Со звуком при старте браузер спрашивает, что захватить: системный звук Windows отдаёт только с «Весь экран» и галкой «Поделиться системным звуком», вкладка — со «звуком вкладки». Из захвата в файл идёт только звук, картинка — по-прежнему холст конуса; webm со звуком (opus). Звук не выбран или окно закрыли — запись не начинается, а не пишется молча без звука. Захват закрыли кнопкой браузера посреди записи — запись останавливается и сохраняется. Так же звук ПК берёт Lively (lively/_js/zvuk.js).
Треугольник v0.036 и Code 35.77 — «в треугольник и ещё где, посмотри, где webm-запись, — тоже добавь»: у обеих своя запись ⏺ (копия прежнего общего кода) — пишет mp4, а где браузер не умеет, webm; webm теперь сохраняется с длительностью тем же доводчиком recorder.js (длина меряется до сборки файла — длинная запись собирается не мгновенно). В Треугольнике ещё «🗻 видео цикла» — всегда webm — тоже с длительностью. Остальные страницы с ⏺ (Кубиты, Genezis, GPU, Grid, Октаэдр, Lively) пишут через сам recorder.js — им правка пришла вместе с ним.
Zazerkalius v0.235 и общий _js/recorder.js — по снимку плейлиста PotPlayer — «нет эскизов в плейлисте»: у роликов Zerkalius-konus-….webm длина 0. MediaRecorder пишет webm потоком и длительности в заголовок не кладёт — в начале записи она ещё неизвестна; без неё плеер не строит эскиз и плохо мотает. В recorder.js — доводчик: после остановки в блок Info заголовка дописывается элемент Duration, остальной файл байт в байт тот же (сегмент «неизвестного размера», адресов внутри нет — сдвиг хвоста ничего не ломает); не разобрал заголовок — файл уходит как был. Работает для записей ⏺ на всех страницах с модулем (когда браузер пишет webm, а не mp4) и для восстановленных — там длина по времени последнего куска. Кнопка ⏺ конуса в Zazerkalius пишет своим кодом — она зовёт тот же доводчик; модуль подключён к странице с data-bez-knopki: без плавающей ⏺ и клавиши R, только функции. Осталось: таблицы перемотки (Cues) в файле по-прежнему нет — мотает плеер перебором; уже записанные ролики лечатся ffmpeg -i старый.webm -c copy новый.webm.
Zazerkalius v0.234 — по снимку столбика из треугольников по 16 строк — «объединить с тем html, где нарезка треугольника на мелкие и строится анимация: взять их и расположить друг под другом в Зазеркалиусе». Под чертой — нарезать: ✂ ▲ [16] · по рядам → · без пустых. Как в Треугольнике: треугольник строк режется без остатка на полосы высотой h, в полосе n — n + 1 треугольников ▲; их строки встают друг под другом (↩ вернёт). Строки могут расти на 1 бит (Паскаль) или на 2 (правила 90, 30… — заготовки Аниматрицы); порядок — по рядам, вдоль левой стороны или вдоль правой (одна кнопка, щелчок меняет); «без пустых» — без ▲ из одних нулей. Проверено: 64 строки Серпинского, h = 16 — 10 ▲, непустых 9 (3²), каждый — верхний треугольник; правило 90 (+2) — то же; ↩ вернул 64 строки.
Zazerkalius v0.233 — по снимку выбранной строки 10 — «номера тоже затемнять при выделении». Номер, замок и кручение невыделенных строк затемняются вместе с их битами (brightness 0.5). Проверено: выбрана строка 3 — её номер яркий, у остальных затемнены.
Zazerkalius v0.232 — по снимку поля строк, упёршегося в самую узкую ширину, — «после максимального уменьшения поле должно уезжать вправо и оставлять только немного — размер кнопок». Самое узкое поле теперь — колонка номеров с кнопками ↺ 🔒 ⟲ над ней (около 100 px), а не 220 px: тянешь дальше — остальное уходит за край. Проверено: поле 97 px, кнопки и номера видны, остальное за краем.
Zazerkalius v0.231 — «выделение нескольких — через Ctrl, а не Shift». В конусе, как и в поле строк: Ctrl + щелчок по кольцу — выделить / снять (можно набирать несколько), Shift + щелчок по сектору — сменить бит (в v0.173 было наоборот). Подсказка над битом — по-новому. Проверено: Ctrl — выделены кольца 4 и 5; Shift по кольцу 6 — 110011 → 010011.
Zazerkalius v0.230 — по снимку растянутых во всю ширину шаблонов под чертой — «тут жесть какая-то! без фона надо, и это не поле, а кнопки под чертой, не растягивать». Под чертой — компактные кнопки своей ширины, без фона, в ряд с переносом: достройка, «+ Строка», «+ Столбик», встроенные и свои шаблоны; ширина полосы — по видимому полю, она прижата к левому краю и не уезжает вбок с широкими строками. Проверено: кнопки 27…88 px, полоса 439 px в поле 451 px, два ряда.
Zazerkalius v0.229 — по снимку кнопки «🗑 удалить» под чертой — «эту также: надпись только «Заменить» — вкл / выкл». Кнопка под чертой — «Заменить» с одной надписью: включена (горит, по умолчанию) — строки, что были под чертой, заменяются новыми при достройке; выключена — сдвигаются вниз и остаются под чертой, ниже новых. Проверено: вкл → выкл → вкл.
Zazerkalius v0.228 — по снимку списка «щели / Без щелей» — «это одна кнопка, как и все». Пропуск солнца — теперь одна кнопка-переключатель: щелчок — «щели» ↔ «Без щелей»; «Без щелей» горит; без солнца кнопка неактивна. Проверено: Без щелей → щели → Без щелей.
Zazerkalius v0.227 — по снимку «всё пропало» (биты уехали вправо за край, строки под чертой сдвинулись). Ошибка v0.225: ячейка, куда под чертой ставится полоса достройки и шаблоны, занимала первую колонку сетки строк — колонка номеров растягивалась на ширину этой полосы. Теперь ячейка идёт во всю ширину поля и на ширину колонок не влияет. Проверено: колонка номеров 88 px, биты сразу за ней, строки под чертой на своих местах, полоса — во всю ширину.
Zazerkalius v0.226 — по снимку шапки страницы конуса «◯ Конус v0.225» — «тут название — после Zazerkalius, а не вместо». На странице одного окна (?solo=cone) в шапке — «Zazerkalius ◯ Конус», во вкладке — «Zazerkalius ◯ Конус — v0.226».
Zazerkalius v0.225 — «под линией расположи кнопки Серп 90, 30, маска (умолч. 01 и поле для неё); когда тянуть за линию вниз — строки достраиваются от верхней», «если под полосой есть другие — их удалить» → «кнопку: удалить или сдвинуть вниз», «туда же свои сохранённые пресеты» и по снимку шаблона «Столбик · 87 стр.» — «перемести». Под чертой поля (под строкой для заполнения) — полоса достроить: 🔺 Серп 90 · 30 · маска [01] · 🗑 удалить / ⤓ сдвинуть, под ней — свои шаблоны (+ Строка, + Столбик и список; из левой панели они ушли). Тянешь черту вниз — каждая новая строка достраивается от строки над ней: Серп 90 — правило 90, 30 — правило 30 (строка на 2 бита длиннее, как заготовки Аниматрицы), маска — маска подряд на бит длиннее; сколько строк — столько, сколько их помещается от черты до курсора. Строки, что были под чертой: удаляются или остаются под ней, ниже новых. Замок строк ⛔ достраивать не даёт — черта тогда, как прежде, возвращает строки из-под себя. ↩ отменяет. Черту выше строки 1 не поднимаю: без единой строки над чертой рушатся окна и конус. Проверено: от «1» Серп 90 — 1, 101, 10001, 1010101, 100000001; маска 01 — 1, 01, 010, 0101; «сдвинуть» — новая 11001 (правило 30), 11011 и 1000001 остались под чертой; «удалить» — новая 1111101, под чертой пусто; с замком — черта вернула строку.
Zazerkalius v0.224 — три правки поля строк. (1) По снимку строки для заполнения «45 + ✕» — «вынеси влево управляющие крестик и иконку, не перекрывай номер» (выбрано: под номером, мелко): + и ✕ теперь мелко под номером, в колонке номеров; строка для заполнения чуть выше остальных. (2) «За саму границу тоже надо перетаскивать»: у края поля со стороны стола — невидимая полоса-хват 6 px (подсвечивается при наведении), тянет ширину поля так же, как номера. (3) По снимку столбика номеров — «убери линии и лишний отступ от битов»: черт между колонками номеров, замков и кручений нет, биты — в 2 px от них (было 8). Проверено: строка для заполнения — «17», под ней + ✕, + добавил строку; граница — 451 → 421 px.
Zazerkalius v0.223 — по снимку выбранной строки 110011 на лиловой подложке — «фон при выделении не добавлять, а гасить невыделенное; не делать фон совсем чёрным — чтобы можно было затемнять». Фон поля строк светлее (между цветом панели и линий), у выбранной строки (и выделенных) подложки больше нет — остальные строки затемнены целиком, фон вместе с битами (brightness 0.5; прежде биты были прозрачнее). Проверено: поле ≈ #1b2130, выбранная строка 6 — без подложки, остальные — затемнены.
Zazerkalius v0.222 — «сделай кнопку — чистые кольца, без границ». В «Виде» — галка ◯ чистые: у колец нет контура (голубой внутри, оранжевый снаружи), нет прорезей между битами (у колец, краски, строки для заполнения), нет зазора между кольцами — кольца сомкнуты; текущее кольцо — без обводки (видно по яркости, остальные гаснут). Проверено в дзене на 16 строках Паскаля: одни биты, сплошными кольцами.
Zazerkalius v0.221 — «выделение строки — это когда все остальные тушатся светом». Теперь гасит остальные не только выделение (Shift, Ctrl, номер), но и просто выбранная строка: выбрал — остальные строки в поле на 45% и кольца на конусе под вуалью; щелчок по ней ещё раз (v0.220) или Esc — всё яркое. После загрузки текущая строка — выбранная. Проверено: при загрузке строка 2 — 1, остальные 0,45; щелчок по строке 3 — она 1, остальные 0,45; ещё щелчок — все 1.
Zazerkalius v0.220 — по снимку выделенной строки 110011 — «клик по выделенной строке — снять выделение». Щелчок по текущей (или единственной выделенной) строке — по битам или по номеру — теперь как Esc: выделение снято, текущей строки нет (и на конусе); ещё щелчок — снова выбрана. Щелчок по другой строке, Ctrl и Shift — как прежде. Проверено: строка 4 — выбрана → снята → выбрана; номер 6 — выделен → снят; щелчок по строке 2 — выбрана она.
Zazerkalius v0.219 — по снимку поля строк без разделителя — «потерялась граница» → «сделай фоном другим — без линии» и «хват только у номеров, не дальше». У поля строк теперь свой фон — чуть светлее стола (к цвету панели), без черты; внутри поля «фон» — он же, так что подложки бит, столбик номеров и подсветки строк сходятся с ним сами (в тёмной и светлой теме). Ширину поля тянут только за сами номера строк: замок, кручение и остальное в той колонке — как прежде, курсор ↔ и подсветка — только у номеров. Проверено: за замок — 451 → 451, за номер — 451 → 411; поле, номера и подложки бит одного цвета, стол темнее.
Zazerkalius v0.218 — по снимку подсказки разделителя «Потяни — шире или уже…» — «границу для перетаскивания убери, функцию будет выполнять столбик номеров, подсвечивать немного при наведении». Разделителя (полоски 6 px между полем строк и столом) больше нет. Ширину поля строк меняет столбик номеров: тянешь его по горизонтали (дальше 6 px и больше вбок, чем вверх-вниз) — поле шире или уже; короткий щелчок по номеру, замку, кручению — как был. Наведён — весь столбик чуть светлее, курсор ↔. Проверено: протащил номер на 60 px — поле 451 → 504 px (упор по ширине окна), щелчка по номеру после этого не было; простой щелчок по номеру выделил строку.
Zazerkalius v0.217 — по снимку блока «Шрифт» в левой панели — «перемести над строки; вместо ползунка две стрелки и число между; не удлинять — окно шрифтов ещё короче» и по снимку полосы над строками в две строки — «здесь не делай 2 строки — одна, остальное уезжает вправо за край». Шрифт переехал в полосу над строками, сразу за ↺ 🔒 ⟲: список шрифтов узкий (74 px), размер — ◀ число ▶ (11…40) вместо ползунка; в левой панели блока «Шрифт» больше нет. Полоса над строками — всегда одна строка: что не влезло, уходит вправо за край (без полосы прокрутки). Проверено: полоса 37 px в высоту, ◀ ▶ — 18 → 19 → 18, кнопки ↺ 🔒 ⟲ по-прежнему над своими колонками.
Zazerkalius v0.216 — по снимку солнца с краской в чёрных прорезях — «щелей не должно быть, назови «Без щелей»». Пропуск солнца «0 — проход, 1 — стена» теперь зовётся «Без щелей», и прорезей в нём нет нигде: ни у колец строк, ни у закрашенных светом ячеек (краска идёт сплошной дугой), ни у строки для заполнения. Пустые кольца до 256 в этом режиме не рисуются и не считаются — свет всё равно ловит строка для заполнения, а с ними строки сжимались в точку. Проверено в дзене на 8 строках: кольца и краска сплошные, строки во весь холст.
Zazerkalius v0.215 — по снимку свёрнутой группы «Лазер» у края окна конуса — «пусть вкладки уезжают за поле строк, но не заголовком». Вынесенную группу теперь можно задвинуть вправо за край окна конуса (под поле строк): край держит только её заголовок — он всегда виден, за него вытаскивают обратно (правый щелчок — на полосу). Влево заголовок уходил бы первым — там по-прежнему упор в край. Окно конуса обрезает задвинутую группу без горизонтальной полосы прокрутки. Проверено: «Лазер», утащенный на 3000 px вправо, встал заголовком у края (998 при крае окна 1002), полосы прокрутки нет.
Zazerkalius v0.214 — по снимку группы «Кручение» — «всё на места — эту кнопку перемести также над столбиком кручений». Кнопка «⟲ всё на места» переехала из группы «Кручение» в полосу ввода и стоит узкой зелёной «⟲» ровно над столбиком кручений строк (как ↺ над номерами и общий замок над замками); делает то же, что прежде. Проверено: середины совпали с колонками (265/265, 292/292, 321/321), ⟲ сбросил кручение.
Zazerkalius v0.213 — «выделять кольцо или строку — синхронно, и остальные при этом гаснут немного». Выделение и так общее у колец и строк (Shift + щелчок по кольцу, Ctrl + щелчок или щелчок по номеру строки); теперь, пока оно есть, невыделенные гаснут: на конусе — под полупрозрачной вуалью цвета холста, в поле строк — биты невыделенных строк на 45%. Сняли выделение — всё снова яркое. Одна лишь текущая строка (без выделения) ничего не гасит. Проверено: выделена строка 4 — остальные 0,45, она 1; снято — всё 1.
Zazerkalius v0.212 — по снимку галки «запрет сдвига строк» — «это не дубль замка?» (да, та же Z.coneLock, что общий замок) → «да, но общий замок всегда над столбиком должен стоять», и «а над номерами — сброс строк, кнопку на начальные». Галки в «Кольцах» не видно (осталась скрытой — на ней держится общий замок). В полосе ввода — две узкие кнопки: ↺ (то же, что «↺ Начало» в «Построении») — ровно над колонкой номеров, общий замок — ровно над столбиком замков; место пересчитывается при перерисовке строк, когда поле шире/уже и когда догрузился шрифт. Проверено: середины кнопок совпали с серединами колонок (265/265, 292/292), ↺ вернул столбик 1, 11, 101…
Zazerkalius v0.211 — по снимку свёрнутой группы «Кручение» — «поправь хват по всей длине и высоте заголовка». Заголовок группы (за него группу тянут, по нему двойным щелчком сворачивают) теперь во всю высоту группы и до её рамки слева, а у свёрнутой группы хват — вся группа. Проверено: «Кручение» 619×61 — хват 57×59; свёрнутая 74×61 — хват 72×59 (по пикселю — рамка).
Zazerkalius v0.210 — по снимку кнопки «🔒 кольца» в группе «Кольца» — «эту кнопку удали, замки есть у каждой строки». Кнопки замка выделенных колец больше нет: свой замок — у каждой строки в столбике замков (правый щелчок по замку кольца в списке колец снимает его, как прежде).
Zazerkalius v0.209 — по снимку «i3 стр. · 934 бит · текущая 8…» (начало сведений ушло под колонку номеров и замков) — «подвинь надпись». Сведения поля больше не заходят под левую колонку: ширина надписи считается от правого края колонки номеров (и заново, когда поле становится шире или уже), не влезла — многоточие в конце, целиком — в подсказке.
Zazerkalius v0.208 — по снимку «☀ солнце · 1 — вырез» — «в этом режиме у битов не должно быть щелей; щель тут — 0, вся его длина, а 1 — это стена», «сделай неактивными те кнопки, которые не влияют» и по снимку горящих вместе «⌖ луч-часы» и «☀ солнце» — «это либо-либо, и выделение так же». Второй пропуск солнца теперь «0 — проход, 1 — стена»: щелей между битами нет, «0» пропускает свет во всю ширину своей ячейки, «1» — стена, строка для заполнения — сплошная; на рисунке у колец нет прорезей между битами. Окно «360° / число единиц» (v0.206) убрано. При ☀ неактивны лазерные кнопки (довод строки 1, ⏸ на проходе, 🔮, 🎯 с номером, число лазеров и «от …°», ⌖→ след., 📌 лазер, ↻ с шагом), при «0 — проход» ещё «щель» и «пустые до 256»; копии на холсте гаснут вместе с ними; список пропуска неактивен без солнца. Лазер и солнце — либо-либо: при солнце луч-часы не горят, щелчок по ним возвращает лазер. Попутно: касание границы ячейки больше не красит соседнюю. Проверено на 1, 10, 101, 1001, 10001, 110011: после «10» свет 180–360°, после «101» — 180–240°, дальше сквозь нули до строки для заполнения (ячейки 4 и 5).
Zazerkalius v0.207 — к сворачиванию группы двойным щелчком (v0.204) — «высота остаётся как была — нужно». Свёрнутая группа теперь сужается до заголовка, а высоту держит прежнюю (запоминается в Z.cgrpMin в пикселях), заголовок — посередине: соседние группы и полоса не прыгают. Проверено: «Аниматрица» 758×94 → 99×94 → снова 758×94.
Zazerkalius v0.206 — «первая строка — один бит, круг — это солнце, оно всегда светит; дальше если 11, то там две щели, размер щелей — ширина луча; из 11 всегда два луча», «ещё настройку, где 1 — не часть круга как бит, а вырез, из которого идёт луч его ширины» (выбрано: ширина выреза — 360° / число единиц строки) и «между битами тут щелей нет, работает без щелей». В «Лазере» — ☀ солнце и список пропуска. Строка 1 — солнце в центре: светит всегда и во все стороны, выреза-затвора нет. Свет идёт наружу кольцо за кольцом освещёнными секторами: щели — кольцо пропускает свет только в щелях между битами (ширина — ползунок «щель»), у «11» — два луча; 1 — вырез — щелей нет, каждая «1» — окно шириной 360° / число единиц строки по центру своей ячейки, «0» — стена, строка для заполнения — сплошная стена. Ячейка под освещённым сектором красится (при каждом новом освещении — единица в счёт), её видно на конусе и в «✎ в поле 2». Кольца от солнца не встают, лучи не гаснут; ✺ и ☀ — что-то одно; 🔮 и 🎯 для солнца не нужны. Проверено на 1, 11, 101, 1111, 10001, 110011: «щели» — два луча на 0° и 180°; «1 — вырез» — после «101» свет 0–150° и 210–360° («0» в середине ловит), после «10001» — 0–126° и 234–360°, дальше весь дошедший свет ловит строка для заполнения.
Zazerkalius v0.205 — по снимку сведений поля («43 стр. · 934 бит · текущая…» поверх строк 1–2) — «пусть надпись скрывается за битами». Сведения теперь лежат под полем строк (своя изоляция у #field, сведения — z-index −1), а у самих бит — подложка цвета поля в том же состоянии строки (наведена, текущая, выделена, поле в наложении): сведения видны только в пустоте и прячутся за битами, подсветка строк не изменилась. Попутно исправлена ошибка v0.202: в поле «от …°» комментарий попал в середину строки и глотал её хвост — угол первого лазера из поля не менялся; теперь меняется.
Zazerkalius v0.204 — по снимку группы «Аниматрица» — «двойной клик по группе сворачивает её до заголовка». Двойной щелчок по заголовку группы или её пустому месту (не по кнопке, полю, списку) — группа сворачивается до заголовка (с «▸»), ещё раз — разворачивается; запоминается (Z.cgrpMin). Возврат вынесенной группы на полосу, что был на двойном щелчке по заголовку (v0.177), — теперь правый щелчок по заголовку. Проверено: «Аниматрица» 772×94 → 99×21 → снова 772×94; двойной щелчок по её кнопке группу не сворачивает.
Zazerkalius v0.203 — «сделай как в Zerkalius-layers.html, чтобы кнопки можно было на холст в любое место». Как «кнопки на поле цепочек» в Layers (v1.594): любую кнопку с именем тянешь мышью на холст конуса — там, куда бросил, встаёт её копия с той же подписью, оригинал остаётся на месте; та же кнопка уже на холсте — не удваивается, а переезжает. Копия жмёт оригинал (и в вынесенном окне) и горит, как он; подпись меняется вместе с ним (▶ крутить → ⏸ стоп). Копию тянешь по холсту — переезжает; вытащил за холст, правый щелчок или Delete — убрана. Места — Z.coneBtns, в долях ширины и высоты холста: растянул окно — кнопки остаются на своих местах холста. Это раскладка — в ⭐ умолчание не входит; фон хаба и показ пресета кнопок не рисуют. Проверено: «⌖→ след.» брошена на холст (30% ширины, 40% высоты), щелчок по копии переключает оригинал, копия горит вместе с ним, правый щелчок — убрана.
Zazerkalius v0.202 — «почему лазер крутится? надо кнопку фикс лазера и стрелку крутить на заданное частей круга, по умолчанию 45», «и ещё на число самой длинной, когда все, а все — это 1+2+3+…+T» и «убери то, что по умолчанию лазер, когда уходит, — до 8 лазеров, потом следующие; это надо вкл/выкл». Лазер крутился потому, что был частью картинки конуса: в «Всё» и от ⟲ ⟳ поворачивается весь конус (Z.coneSpin), и лазер с ним. Теперь 📌 лазер (по умолчанию включено): лазер стоит на экране, конус едет под ним; в «Всё» попадания между кадрами считаются мелкими шагами, как при кручении колец. ↻ — повернуть лазер (и все лучи ✺) на шаг по часовой, правый щелчок — против; шаг в списке рядом: 45° (по умолчанию), 1/T круга (T — бит в самой длинной строке) или 1/(1+2+…+T) круга — для ✺, где лучи и так стоят через 1/T. Угол первого лазера теперь хранится с долями градуса. ⌖→ след. — переход к следующему лазеру после вылета (как было с v0.191), по умолчанию выключен: луч вышел за край — пауза. Проверено: ↻ 0° → 45°, шаг 1/(1+…+160) — +0,028°; при повороте конуса на 90° закреплённый лазер в системе конуса на −90° от прежнего.
Zazerkalius v0.201 — «сделай, чтобы в лазере лучей было сколько бит в строках — до 256, по кругу из центра; когда лазер вылетает, его больше нет в круге, и так гонять до последнего» (выбрано: все сразу, кольца общие). В «Лазере» кнопка ✺ все лучи: лучей столько, сколько бит в самой длинной строке конуса (не больше 256), шаг — 360° / число, первый — на угле «от …°». Светят все сразу, каждый считается как прежний лазер: вырез строки 1, щели, стены, краска, лог (в записи — номер луча ✺N), вылет из строк, ✎ в поле 2. Кольца общие: встаёт кольцо, из которого вышел любой луч; луч, ушедший за край, гаснет насовсем и отпускает кольца. Если все живые лучи упёрлись в стоящие кольца (затор), кольца отпускаются и полбита не встают. Погасли все — пауза. Шаг всех лучей дорогой (~1,4 мс на 160 лучей), поэтому кадр считает лучи не дольше ~12 мс, и кольца доворачиваются только до просчитанного места: крутится плавно, щели не проскакивают, но с сотней лучей — медленнее ползунка, по мере вылета — быстрее. Проверено прогоном: 160 строк (1, 11, 111, дальше нули), «Встреч Бит» — первый луч погас на 44-м бите поворота, лучи гаснут по одному, затора не было, кадр ~17 мс.
Zazerkalius v0.200 — «туда ещё заготовки-пресеты, по умолчанию 256 строк: все серпинские правила и какие-нибудь последовательности». В группе «Аниматрица» — список «📋 заготовка…», число строк (по умолчанию 256) и сид. Выбор заменяет поле строк целиком (↩ вернёт), счёт волны — заново. Серпинский: Паскаль mod 2 (+1 бит за строку) и элементарные правила 90, 18, 26, 82, 146, 154, 210, 218 — перебором всех 256 правил из одной «1» проверено, что именно они дают ровно треугольник правила 90; из одной точки они совпадают, различаются с сида, где единицы стоят рядом (11, 1101…). Строка правила — световой конус, на 2 бита длиннее предыдущей. Родственные: 22, 126, 150, 60, 102, 182, 195, 30, 110. Последовательности (строка i — первые i + 1 членов): Туэ — Морс, слово Фибоначчи, Рудин — Шапиро, складывание бумаги, удвоение периода, Баум — Свит, Колакоски, простые, квадраты, двоичный счёт, случайные. Конус теперь рисует до 256 колец (CONE_MAX было 160).
Zazerkalius v0.199 — «по циклу аниматрицы»: галка ⟳ циклами в группе «Аниматрица» — ▶ волна идёт целыми циклами, за шаг плеера весь проход волны от верха до низа, как «Плеер — целыми циклами» в Треугольнике. Конус и поле показывают только картины на границе циклов; начат посреди прохода — сперва доходит до его конца. Скорость тогда — циклов в секунду (0,5…5000).
Zazerkalius v0.198 — «аниматрицу надо ещё сюда» и «скорость — больше возможностей». В окне «◯ Конус» новая группа «Аниматрица»: волна из Треугольника идёт сверху вниз, строка r+1 переписывается операцией (XOR, XNOR, NAND, NOR, AND, OR) с уже переписанной строкой r; дошла до низа — проход. Строки здесь разной длины, и складывать их решили ПО УГЛУ на конусе (выбор пользователя из трёх: по углу, как в поле, слева по номеру): бит j нижнего кольца берёт бит верхнего, лежащий на луче через середину бита j, с учётом поворота колец. Кнопки: ▶ волна, ▷| шаг (одна строка), ⏭ весь проход, ⏮ к началу прохода или на проход назад; счёт проходов и длина цикла, когда картина повторилась (по отпечатку всех строк). Скорость волны — 0,5…5000 строк в секунду по логарифму. Строки правили не волной — счёт заново; ↩ вернёт. Ползунок скорости кручения — тоже по логарифму: 1…3600°/с (было 5…120 ровным шагом), рядом число: °/с или бит/с в режимах «по биту».
Zazerkalius v0.197 — по снимку 3D-конуса сбоку: «тут можно регулировать высоту 3D битов?» Нельзя было: ↕ разносит только кольца, а толщина дуги бита считалась сама (0,6 шага радиуса, не толще 26 px). Рядом с ↕ — ползунок ▬, множитель толщины ×0,2…×4 (сбоку это и есть высота бит), двойной щелчок — ×1. Помнится в Z.cone3Bw, входит в ⭐ своё умолчание и в пресеты.
Zazerkalius v0.196, скрипт пресетов v0.002 — по снимку конуса с окном «Текст конуса и лог лазера» — «как вообще сохранять так, чтобы потом по ссылке открывали прямо там» и «да» на то, чтобы открывалась вся страница, а не только конус. Ссылка Zerkalius-zazerkalius.html?preset=<имя> (без solo=cone) теперь открывает весь Zazerkalius в состоянии пресета: окна на своих местах, конус, лазер, все поля строк. Память браузера при этом не читается и не пишется: гость крутит и гоняет лазер, а его собственные строки и раскладка остаются нетронутыми, и по ссылке пресет всегда открывается тем же. «↺ Начальные» и «⟲ всё на места» возвращают к пресету. «📂 Всё», открытое прямо на пресете, ложится в свою память и уводит на адрес без ?preset. Чтобы окна приехали, dobavit.py больше не выкидывает раскладку (кроме копии умолчания); режим «только конус» выкидывает её сам при загрузке. Старый пресет «Октаэдр · 70 строк» без раскладки открывается с окнами по умолчанию. Порядок: «💾 Всё» → python presety/dobavit.py файл.json имя "Название" → коммит и пуш → ссылка.
Zazerkalius v0.195 — «сразу надо в строки писать биты, заполнив сначала нулями строки соответствующей длины» (выбрано: в поле 2; «1» — туда, куда упал луч). В «Лазере» кнопка ✎ в поле 2: включена — во втором поле строк (если рабочее — второе, то в третьем) столько же строк из нулей той же длины, что строки конуса, плюс строка для заполнения; ячейка, в которую упал луч (стена в строке, поимка строкой для заполнения), становится «1» — от всех лазеров вместе, как краска на конусе. Конус и рабочее поле не меняются. Если полей меньше — показывает второе. Прежнее содержимое того поля при включении откладывается в запас, правый щелчок по ✎ возвращает его. Проверено: 1, 11, 101, 1111, 10001, «Встреч Стр», 12 шагов — поле 2: 0, 01, 110, 0110, 01010, 000010 — ровно ячейки краски; правым щелчком поле 2 вернулось байт в байт.
Zazerkalius v0.194 — «где задать количество и начальный угол?» (выбрано: просто угол от верха). В «Лазере» рядом с 🎯 — два поля: ⌖× — сколько лазеров (1…72, по умолчанию 8; шаг — 360° / число) и от …° — угол первого лазера, градусы по часовой от верха (по умолчанию 0). В статистике вылетов у каждого лазера — его настоящий угол. Проверено: 1, 11, 111, «Встреч Стр», 3 лазера от 30° — лазеры на 30°, 150°, 270°.
Zazerkalius v0.193 — снимок «всё съело»: «🚪 Вылет из строк» пуст, прогноз показывает «1 из 1» от прежнего набора, строка прогноза наехала на лог. Три причины: (1) вылеты жили вместе с краской и стирались любым сбросом — ⟲, ✕ у строки для заполнения, правым щелчком по ▶, сменой режима или строк; (2) прогноз не знал, что строки сменились; (3) блоки окна «Текст» сжимались до нуля, когда места мало. Теперь: вылеты каждого лазера по окончании переезжают в постоянную статистику (Z.coneExLog, последние 64 лазера) с номером прогона (от сброса до сброса), режимом и числом строк; стирает её только новая ✕ в самом блоке. Прогноз, сделанный для других строк или режима, не показывается. Блоки лазера не сжимаются, а прокручиваются вместе; лазеру — две трети окна, логу — не меньше трёх строк. Проверено: два лазера → сброс → ещё прогон → смена режима → смена строк — все записи на месте (прогоны 1, 1, 2), окно высотой 300 px — все блоки видны.
Zazerkalius v0.192 — по снимку «окно поправь» (в «🚪 Вылет из строк» был виден только ⌖2, первый лазер уезжал вверх) и «покажи номер, статистику: на каком угле начальное положение, из какой вылетел и т. д.». Теперь у каждого лазера заголовок — номер, угол лазера, с какой фазы начал, режим, сколько строк прошёл — и таблица: строка, биты от щели, щель вылета (ячейки слева|справа; у строки 1 — вырез), поворот кольца по часовой от начала, через сколько от включения лазера. Нынешний лазер — сверху, блок выше (до 55% окна). ⧉ копирует всё это таблицей через табуляцию — в Excel ложится по столбцам. Проверено на 1, 11, 111, «Встреч Стр», без «▦ до 256»: лазер 1 — строки вылетают на 179°, 179°, 239° (щели вырез, 1|2, 1|2), за край — на 269°; лазер 2 стартует с 269°, лазер 3 — с 494°, лазер 4 — с 719°.
Zazerkalius v0.191 — «после вылета — как начать ещё на том же рисунке бит» и «просто когда лазер вылетает, сделай 45°: следующий лазер становится активен, и т. д.». Лазеров восемь, через 45° по часовой, первый — вверх. Луч ушёл за край — при ▶ и при шагах ◀ ▶ включается следующий лазер, а кольца, которые встали, отпускаются там, где стоят: их фаза становится сдвигом (Z.voidHits.off), и дальше они крутятся с того же рисунка, ничего не прыгает. После восьмого — пауза. Прежние лазеры видны бледным пунктиром. «🚪 Вылет из строк» теперь по лазерам: ⌖1 · 0°, ⌖2 · 45°…; ⧉ копирует всех, лазеры — через пустую строку. 🎯, отпуская стоящие кольца, тоже больше не сдвигает их. Сброс лазеров — вместе с остановленными кольцами (⟲ всё на места, ✕ у строки для заполнения, правый щелчок по ▶, смена режима). Проверено: треугольник Паскаля, 10 строк, «Встреч Стр», шагами ▶ — лазер 1 даёт на 10-й строке 1110000001, лазер 2 — 1000000111, лазер 3 — 0000011110, лазер 4 — 0001111000.
Zazerkalius v0.190 — снимок и «что не так?»: режим «Всё», три строки, лог «1 закрыт». Во «Всё» конус крутится целиком, и вырез строки 1 относительно неподвижного лазера не сдвигается — луч не выйдет никогда, а 🎯 только отвечала «выбери другой режим». Теперь 🎯 во «Всё» сама переключает на «Встреч Стр» и крутит до нужной строки (говорит об этом). Проверено: 1, 11, 111 во «Всё», 🎯 до строки 3 — «Встреч Стр», 239°, строка 111, луч пойман строкой для заполнения.
Zazerkalius v0.189 — «и ничего не крутит» (снимок: Встреч Бит, одна строка, вырез строки 1 закрыт, 🎯 и ▶ стоят). Причина: остановленные лучом кольца (Z.voidHits.fz) хранят фазу в единицах своего режима — во «Встреч Стр» в градусах, в Каждое / Встреч Бит в битах. Кольца, вставшие во «Встреч Стр» на 179°, после переключения на «Встреч Бит» читались как 179 бит: вырез строки 1 застывал закрытым, а кольцо стояло — крутить было нечего. Повторено у себя ровно так. Теперь: смена режима отпускает остановленные кольца (краска и лог остаются); 🎯, не дойдя до строки из-за стоящих колец, отпускает их и пробует снова с того же места (и говорит, сколько отпустил); ▶, когда все кольца строк стоят, не запускается впустую, а говорит, как их отпустить.
Zazerkalius v0.188 — «а как сделать, чтобы луч дошёл до 10 строки» → «да» на кнопку 🎯 до строки N (в «Лазере», номер — в поле рядом). Крутит выбранным режимом и тем же мелким шагом, что ◀ ▶, до мига, когда луч проходит строку N (выходит из её кольца через щель), и встаёт там. По пути всё как при ▶: пройденные кольца встают, стены красятся, лог пишется, «🚪 Вылет из строк» заполняется. Строка уже пройдена — говорит об этом; за круг не дойти — возвращает всё как было. Во «Всё» не крутит. Проверено на треугольнике Паскаля, 12 строк, с нуля: «Встреч Стр» — строка 10 через 323° (строка от щели 1110000001, дальше луч упирается в строку 11), затем до 12-й — ещё 6°; «Каждое» — 10-я через 0,99 бита. Попутно: подпись ?v= у двух скриптов страницы застряла на 0152 (с v0.152 её не поднимали) — теперь 0188; без неё браузер мог отдавать старый zz-ui.js из кэша.
Zazerkalius v0.187 — «мы же можем заранее просчитать, что получится на 10 строке?» → «да». В «Лазере» кнопка 🔮 просчитать: прогон луча от нынешнего положения до конца — мгновенно, без анимации, тем же шагом, что ◀ ▶, и тем же счётом (остановка колец, вылет из строк, строка для заполнения). Конец — луч ушёл за край или прошёл целый круг. Прогон идёт на копии: фаза, краска, лог и остановленные кольца после него те же, что были. Итог — в «📝 Текст», блок 🔮 Прогноз: у каждой строки угол (во «Встреч Стр») или биты (в Каждое / Встреч Бит) до вылета и строка от щели вылета; внизу — через сколько луч уйдёт за край и что поймает строка для заполнения; ⧉ — строки столбиком. Во «Всё» не считает: кольца там друг относительно друга не двигаются. Проверено на треугольнике Паскаля, 12 строк, с нуля: «Встреч Стр» — строка 10 вылетает на 323° строкой 1110000001 (модель давала 323), строка k — на 360·(k−1)/k; Каждое — все строки на 1 бите, 10-я — 1110000001; Встреч Бит — 10-я 1000000111; счёт — десятки миллисекунд.
Zazerkalius v0.186 — по логу лазера (332 записи: внутренние кольца стоят коридором, меняется только нижняя строка) — «напиши биты на момент вылета из строки каждой» (выбрано: вся строка от щели). Под логом — 🚪 Вылет из строк: для каждой строки в тот миг, когда луч впервые из неё вылетел, — сама строка, прочитанная от щели вылета (с ячейки сразу за щелью, по часовой); строка 1 — от точки под лучом. Одна запись на строку, первая; стирается вместе с краской (✕ у строки для заполнения, «⟲ всё на места», правый щелчок по ▶, смена строк). ⧉ — копия столбиком, строка на строку: Ctrl+V в поле строк вставит его. Проверено на 1, 11, 101, 1111, 10001, 110011, 1010101 во «Встреч Бит»: записались все 7 — 1, 11, 110, 1111, 11000, 100111, 1101010 (каждая — поворот своей строки).
ОСТАЛОСЬ ПО ИССЛЕДОВАНИЮ
Почему нули не меняют период и при каких сидах они вымирают — закрыто (исследование v0.018: столбцы независимы, метка
верхней клетки заливает столбец, дальше чистый XOR). Осталось: точная формула разгона — у Серпинского P/2 + 1, без обрезки
P/2, у правила 150 5/8 P — это время, за которое метка доползает до низа столбца. Сделано: картинки на сайте (папка
issledovanie\, страница «Исследование», кнопка в хабе), сетка «авто» и ось симметрии — в Code 35.56.
Хаб v0.017 — «какие-то тормоза при наведении на кнопку». У каждой кнопки хаба было своё размытие фона
(backdrop-filter) поверх живых обоев, которые меняются каждый кадр, и браузер размывал этот фон
заново постоянно. У кнопок лаборатории размытие ещё и сидело внутри размытой панели. Наведение добавляло
увеличение и переход «всего подряд» (transition: all) на четверть секунды, включая широкое
свечение, то есть самую дорогую перерисовку. Размытие у кнопок снято, фон под ними чуть плотнее. Плавно
меняются только цвет, фон, рамка и сдвиг, свечение включается сразу. Заодно убран мёртвый
pulse-glow: его и так перекрывал перелив цветов с v0.009. У панелей размытие осталось, оно
одно и не вложенное.
Хаб v0.018 — «лаборатория — оставь надпись “Черновики”, сделай как в обоях сбойные полосы у кнопок».
Панель подписана просто «🔬 Черновики». Кнопки получили сбои, как в обоях Lively: там полосы экрана без
музыки «изредка сами» срываются вбок на три кадра. Здесь раз в 0,12 с с шансом 8% выбирается случайная
кнопка (кроме той, что под мышью), и три кадра подряд у неё срываются в сторону две горизонтальные полосы:
копия надписи на фоне кнопки, обрезанная по высоте (clip-path) и сдвинутая на 3–12 px.
В среднем это сбой раз в полторы секунды где-нибудь на экране. Полосы — псевдоэлементы, они живут только
на время сбоя и потому ничего не стоят в остальное время. Если в системе включено «меньше движения», сбоев нет.
Хаб v0.019 · обои v0.006 — «всё равно что-то тупит, скорость реакции на наведение». Настоящая причина не
в кнопках. Обои лежат на том же сайте, что и хаб, и потому работают в одном с ним потоке браузера. Рисуя
60 кадров в секунду на весь экран, они съедали почти весь кадр, и события мыши хаба ждали своей очереди.
Поэтому фоном хаба (внутри iframe) обои теперь рисуют не чаще 30 кадров в секунду. Открытые
сами по себе, они рисуют на каждом кадре, как раньше. У панелей хаба снято размытие обоев под ними: оно тоже
пересчитывалось на каждом кадре. Фон панелей плотнее (0.55 → 0.72). Наведение на кнопку стало мгновенным,
без перехода в 0,15 с, который на глаз читался как вялая реакция.
Хаб v0.020 — «сбои не по одной кнопке, а построчно». Теперь как в обоях: полоса идёт через весь экран на своей высоте и срывает вбок кусок каждой кнопки, которую пересекает, все на один и тот же сдвиг. На каждом из трёх кадров сбоя три новые полосы высотой 3–14 px со своими сдвигами 6–20 px. У одной кнопки за кадр не больше двух полос: столько у неё псевдоэлементов. «И чаще»: шанс начать сбой каждые 0,12 с поднят с 8% до 30%, то есть в среднем сбой раз в 0,4 с вместо полутора секунд.
Хаб v0.021 — «названия на английском и на русском поочерёдно, в каждой кнопке своя фаза; меняются». У каждой
кнопки два имени (data-en, data-ru): Code / Код, Genezis / Генезис, GPU Core + Synth /
Ядро GPU + синт, Grid Module / Модуль сетки, WebGL Engine / Движок WebGL, Kubits / Кубиты, Fold Layers / Слои
сгиба, ASCII Art / ASCII-арт, Octahedron / Октаэдр, Zazerkalius / Зазеркалиус, Lively Wallpaper / Обои Lively,
Logbook / Борт-журнал, Wallpaper / Обои. Каждое держится 5 с, фаза у кнопки своя, случайная, так что меняются
они вразнобой, а не хором. Сбойные полосы режут то имя, что сейчас на кнопке.
Хаб v0.022 — «нет, лучше построчно менять, одновременно со сбоями». Своя фаза у каждой кнопки (v0.021) снята. Теперь раз в 2–3 с выбирается случайная строка кнопок (флагман, два ряда Черновиков, ряд Знака) и получает сбой: полосы идут только в её высоте, а на втором кадре сбоя все её кнопки разом меняют язык, прямо сквозь полосы. Строки ищутся по верхнему краю кнопок заново на каждый сбой, так что раскладка может меняться с окном. Обычные случайные сбои по всему экрану остались (в среднем раз в 0,4 с), язык они не трогают. При «меньше движения» в системе нет ни сбоев, ни смены языка, и названия остаются английскими.
Хаб v0.023 — «названия групп кнопок также»: «🔬 Drafts / Черновики» и «◇ Sign & Records / Знак и записи» стали такими же строками. Они получают свой сбой и меняют язык сквозь него. Заодно при открытии все названия ставятся на английский. В разметке часть кнопок подписана по-русски, и раньше строка переключалась вперемешку. Теперь строка всегда целиком на одном языке.
Хаб v0.024 — в разметке все подписи английские. Раньше часть кнопок была подписана по-русски, и до запуска скрипта на долю секунды мелькала смесь языков.
Хаб v0.025 · обои v0.007 — «при старте должны быть оба языка». Строки кнопок сверху вниз получают язык
поочерёдно (en, ru, en…), начало выбирается случайно. Так с первого кадра видны оба языка, но каждая строка
по-прежнему целиком на одном. Надпись обоев тоже стала такой «строкой»: Zerkalius ⇄ Зеркалиус. Она стоит в этом
чередовании выше всех кнопок и дальше участвует в общей очереди смены языка. Хаб меняет её через
zerkSetTitle в обоях (сайт один, так что окно обоев доступно хабу). Обои сами пускают по надписи
сбойные полосы. Чтобы это было возможно, надпись в обоях собирается отдельно от остальной раскладки
(buildTitle): полная перестройка сбрасывала бы дождь. У main.js и
nastroyka.js появилась подпись ?v=007, иначе браузер отдавал бы старые скрипты из кэша.
Пока обои не загрузились, хаб ждёт: надпись ставится по событию загрузки, а для надёжности ещё и через 1,5 с.
Хаб v0.026 · обои v0.008 — «надпись обоев не переключается». Хаб звал функцию обоев напрямую, а с диска
(file://) браузер считает хаб и обои разными сайтами и такой вызов запрещает. Ошибку глотал
try, поэтому ничего не происходило и ничего не было видно. Теперь хаб шлёт надпись сообщением
(postMessage): сообщения ходят и с диска, и на сайте. Обои, загрузившись целиком, сами шлют
хабу «готово» (zerkReady), и тогда хаб ставит стартовую надпись. «Готово» уходит именно после
полной загрузки: до неё nastroyka.js ещё не выставил свою надпись и перебил бы присланную.
Вторая причина: надпись была одной «строкой» из семи-восьми, и её очередь приходила раз в ~20 с. Теперь
на неё приходится четверть смен, то есть примерно раз в 10 с.
Октаэдр v0.019 — «в нём самом нет обратно в хаб». Подключён общий значок ⌂ (_js/hub-link.js)
в левом нижнем углу, как на остальных страницах. Но клавиша H здесь давно открывает методичку, а модуль тоже
вешает на H переход в хаб. Нажатие сделало бы оба дела сразу, а модуль, сидящий на document,
срабатывал бы первым. Поэтому у модуля появилась оговорка window.zerkHubNoKey: страница ставит
её перед подключением, и тогда в хаб ведёт только значок, а H остаётся методичке. На телефоне внизу лежит
лист панели, и значок переезжает наверх, рядом с ⚙. В Дзене он, как и ⏺, не прячется, а приглушается,
чтобы выйти можно было и оттуда. В методичке появилась строка про ⌂.
Октаэдр v0.020 — «нужна возможность свои биты вписывать». Рядом с 🎲 появилась кнопка ✎ Свои биты, она раскрывает поле. Поле свёрнуто по умолчанию, потому что панель и так длинная. Из поля берутся только 0 и 1, а пробелы и переносы стоят для глаза. Биты ложатся по порядку чтения: грань за гранью, в грани ряд за рядом от вершины, в ряду слева направо. Короткая строка идёт по кругу, поэтому даже «1011» даёт узор на всё тело. Лишнее не влезает, и под полем видно, сколько вписано и сколько мест. ⇩ Текущие выписывает картину с граней в поле, ряд на строку и грани через пустую строку. Отсюда и правило «считаются только 0 и 1»: такой текст, поправленный руками, ложится обратно ровно на свои места. ◇ Грани одинаково заставляет каждую грань начинать строку с начала. Вписанное сохраняется в памяти браузера, а при смене плотности ложится заново на новое число мест. Случайная картина пересобиралась бы, а свои биты вписывали руками, и терять их обидно. 🎲 снимает свои биты и возвращает случайные. Ctrl+Enter в поле вписывает, Esc выходит из поля, чтобы снова заработали клавиши прибора.
Октаэдр v0.021 — «возможность кидать текстовый файл прямо в поле». Файл принимает не только поле, а вся
страница. Без перехвата браузер, получив файл мимо поля, открыл бы его вместо страницы, и прибор закрылся бы
вместе с картиной. Пока файл несут над окном, поле само раскрывается и подсвечивается. Текст файла заменяет
поле целиком и сразу ложится на грани, а под полем пишется имя файла. Подсветку гасит таймер, а не
dragleave: тот сыплется на каждой границе элементов, Chrome часто не говорит, куда ушёл курсор,
и поле мигало бы. Огромный файл в поле не кладётся целиком, потому что поле с мегабайтами текста тормозит
на каждой букве: от него остаются одни 0 и 1, не больше 200 000. Столько же теперь помнит и память браузера,
раньше помнилось 20 000. Файлы больше 20 МБ не берутся. Обычный текст, перетащенный мышью, поле принимает
как всегда: перехват срабатывает только на файлы.
Октаэдр v0.022 — «можно ли плотность до 256?». До 256 в лоб нельзя. На грани было бы 32 896 бит, примерно 130 000 цифр за кадр, каждая со своим свечением, и страница встала бы. Шаг между битами вышел бы в 1–2 пикселя, а размер цифры от плотности не зависит, так что они слились бы в пятно. Для такой плотности нужен режим точек: грань рисуется картинкой, где бит — одна клеточка. Пользователь выбрал проще — поднять предел: плотность теперь до 64 рядов (2080 бит на грань). Прореживание нитей поднято с 12 до 32: при 64 рядах пар больше восьми тысяч.
ОСТАЛОСЬ
Режим точек для плотности выше ~40 рядов и до 256: грань — картинка «бит = клеточка», натянутая на треугольник, с попаданием клика в клеточку. Отложено, выбран простой подъём предела до 64.
Октаэдр v0.023 — три просьбы подряд. «Шрифт какой минимальный можно? Сделай минимум»: ползунок
«Размер цифр» теперь от 2, а не от 7. Отрисовка молча пропускала всё мельче 5,5 px, теперь порог 1,5 px:
мельче холст цифру не проявляет вовсе. На 2–4 px это уже не цифра, а светящаяся точка, и на большой плотности
узор так читается лучше, чем каша из наползающих цифр. Выходит почти тот самый «режим точек», только даром.
«Свечение по умолчанию отключи»: умолчание 7 → 0. У тех, кто уже открывал страницу, в памяти браузера
лежала семёрка, и смена умолчания их не задела бы. Поэтому значение, сохранённое без новой метки
glowV, один раз не берётся. Дальше ползунок запоминается как обычно. «Делай для теста 256»:
плотность до 256 рядов, в методичке помечено «для пробы». Одно дешёвое ускорение под это: браузер разбирал
строку шрифта на каждую цифру, потому что размер у каждой свой. Теперь размер округлён до 0,5 px, и шрифт
ставится только при смене. На 256 рядах цифр за кадр больше ста тысяч, и это был главный тормоз.
Октаэдр v0.024 — «ползунок до 32, а после — только по стрелке до 256; нажать и удерживать — быстрое увеличение». На всей длине 4…256 грубой протяжкой было бы не попасть в обычные 10–20 рядов, ради которых ползунок и есть. Поэтому он теперь 4…32, а выше идёт только стрелка ►. Пока плотность выше 32, бегунок стоит у правого края: браузер сам обрезает значение по пределу. Надпись рядом показывает настоящее число. Стрелка плотности считает от самой плотности, а не от положения бегунка, иначе выше 32 она бы застряла. Удержание любой стрелки теперь разгоняется: первые полсекунды повтора по одному шагу, дальше по 2, по 4 и по 8. По одному от 32 до 256 пришлось бы ехать секунд пятнадцать.
Октаэдр v0.025 — «при вводе сразу бы вписывать, кнопку убрать». Кнопки «✎ Вписать» и Ctrl+Enter больше нет. Поле кладёт биты на грани на каждый ввод: набранная цифра сразу видна на теле. Пустое поле картину не трогает. Когда всё стирают, чтобы набрать заново, картина иначе прыгала бы на полпути в случайную и обратно. «⇩ Текущие» и «◇ Одинаково» встали в одну строку.
Октаэдр v0.026 — «всё меню распредели на группы кнопок, как в Layers и у остальных, чтобы можно передвигать» и «задать цвета для 0 и 1 отдельно». Панель разбита на пять разделов: 🎲 Картина, 👁 Вид, 🎨 Цвета, ⇄ Реверс и 🔗 Связи. «Такт цикла», который стоял после нитей, переехал к реверсу, где ему место. Механика взята из Zerkalius Code, а не из Layers: у Layers целая система доков с окном панелей, а в Code её компактный вариант на тех же правилах. У раздела есть шапка «✥ имя ✕». Если тащить за неё, над панелью раздел встаёт между другими там, где курсор. У правого края он ложится во вторую панель, которая пуста по умолчанию и во время перетаскивания проступает пунктиром. Мимо панелей раздел висит на холсте плавающим окном. ✕ прячет раздел. Полоса вкладок сверху по центру показывает и прячет разделы, ↺ в её конце возвращает раскладку по умолчанию, 📖 открывает методичку. Надпись «zerkalius» из-за полосы опущена с 18 до 46 px. Раскладка и спрятанные разделы помнятся в браузере отдельными записями, поэтому их можно сбросить, не трогая настроек прибора. На телефоне разделы всегда собраны в лист снизу, а таскать их нельзя: правой панели там нет, и возить окна пальцем по холсту незачем. Раскладка при этом не трогается, и на широком экране всё встаёт как было. Дзен прячет и полосу, и правую панель, и плавающие окна. Цвета 0 и 1: кнопка «01 Цвета 0 и 1» и два квадратика выбора цвета. Включена — биты красятся значением: все нули одним цветом, все единицы другим, на обеих половинах тела. Выключена — как было: верх голубой, низ жёлтый. Выбор цвета сам включает раскраску: раз цвет трогают, значит хотят его видеть. Память краснеет от этих же цветов.
Октаэдр v0.027 — «🎨 оставить как было, а при изменении цветов — это схема „Свои цвета“». Отдельной кнопки «01 Цвета 0 и 1» больше нет. Схем стало три, и кнопка 🎨 (клавиша T) ходит по кругу: палитра приложения → зелень → свои цвета → палитра приложения. На кнопке, как и раньше, написано, куда переключит следующий щелчок. Выбор цвета в квадратике 0 или 1 сразу включает «Свои цвета». Рамки и фон в этой схеме остаются от той палитры, из которой в неё пришли.
Октаэдр v0.028 — «перемести в полосу меню зеркалиус-октаэдр». Надпись больше не висит над телом, она стоит первой ячейкой полосы вкладок: «zerkalius · октаэдр», тем же тонким разреженным шрифтом, только мельче. Место над телом освободилось, и полоса больше не толкает надпись вниз. На телефоне полоса опущена ниже ⚙ и ⌂, чтобы не лечь на них.
Октаэдр v0.029 — «граням добавить север, восток, юг — на углах буквы». У четырёх углов экватора, в его плоскости и чуть снаружи тела, стоят буквы С В Ю З. Раскладка как на карте, если смотреть сверху: +X восток, +Z юг, −X запад, −Z север. Буквы крутятся вместе с телом, и по ним видно, какой стороной оно сейчас повёрнуто. Яркость зависит от глубины: ближний угол горит во всю силу, дальний на треть, между ними плавно, без скачка на повороте. Рисуются последними, поверх рёбер и цифр, иначе те их перечёркивали бы. Кнопка «🧭 Стороны света» в разделе 👁 Вид и клавиша C, включено по умолчанию, помнится в браузере.
Октаэдр v0.030 — «правая панель тоже должна магнитить панели; по умолчанию распредели и в правую».
Раньше раздел попадал в панель, только если курсор был над её коробкой. Пустая правая панель была полоской
высотой 120 px, и попасть в неё было почти нельзя. Теперь у каждого края экрана своя полоса магнита шириной
240 px. Курсор в ней, на любой высоте, — и раздел прилипает к панели этого края. Плавающим окном он становится
только посередине экрана. Пустая панель во время перетаскивания проступает пунктиром на всю высоту, видно,
куда прилипнет. Раскладка по умолчанию стала двухпанельной: слева Картина, Вид и Цвета, справа Реверс и Связи
(у раздела есть атрибут data-dock). Запись раскладки в браузере сменила имя (v1 → v2): иначе
старая, где всё слева, перекрыла бы новое умолчание. ↺ раскладывает так же, как при открытии: на телефоне
всё в лист, на широком экране по панелям.
Октаэдр v0.031 — четыре просьбы подряд. «Режим точек до 256, отдельный режим»: кнопка «⠿ Точки»
(клавиша P). Бит рисуется не цифрой, а клеткой, и вся грань — одной картинкой, натянутой на треугольник одним
drawImage. Восемь картинок за кадр вместо ста с лишним тысяч цифр. Натянуть можно потому, что
точка грани P = V0 + a·(V1−V0) + s·(V2−V1) аффинна по (a, s), где a — доля от вершины, s — доля вдоль ряда.
Треугольник картинки «x ≤ y» ложится на грань одним преобразованием холста. Центры клеток совпадают с
bitPoint, так что нити и закрепления попадают туда же, где стояли бы цифры. Картинка
пересобирается только когда устарела: счётчик dotVer растёт на новой картине, шаге, «забыть»,
правке бита и закреплениях, а в подпись входят ещё и цвета. При вращении не пересобирается ничего. У клетки нет
знака 0 или 1, различает только яркость: 1 горит цветом, 0 тёмный. В схеме «Свои цвета» берутся цвета 0 и 1.
Пока клетка крупная, у неё зазор, и видно, что это точки; на 256 рядах клетки идут сплошь. Клик, Shift+клик и
наведение в этом режиме переводят точку экрана обратно в (a, s) ближайшей грани (pickAt).
«Автоматом заблокировать свечение при плотности больше 32»: выше 32 рядов тень не рисуется, ползунок
и его стрелки заблокированы, в подписи стоит «выкл.». Значение не теряется: вернёшься к 32 и ниже, и свечение
снова такое, как было. «И Верх, Низ»: у вершин пирамид подписи «Верх» и «Низ», словами, потому что
буква «В» уже занята востоком. Прячутся той же кнопкой 🧭. «Кнопку скрытия рёбер»: «◇ Рёбра» (клавиша E)
прячет все рёбра разом, экватор тоже, и остаются одни биты. Буквы и так прячет «🧭 Стороны света».
Октаэдр v0.032 — ползунок «Скорость вращения» стоит сразу под кнопкой «⟳ Вращение», а не в конце раздела: кнопка и её скорость теперь рядом.
Октаэдр v0.033 — «Дзен отдельной кнопкой в верхней полоске меню, слева от названия». «☯ Дзен» переехал из раздела 👁 Вид в полосу меню и стоит в ней первым, перед «zerkalius · октаэдр». В Дзене полоса прячется вместе со всем остальным, а выход прежний: Z, Escape или щелчок колесом.
Октаэдр v0.034 — «а что если такую же, но 3 грани основания?». Октаэдр — это две четырёхгранные пирамиды под общим квадратом; число граней основания стало настройкой: в «🎲 Картине» кнопки △ 3, ◇ 4, ⬠ 5, ⬡ 6. При 3 выходит треугольная бипирамида — шесть граней, три сверху и три снизу, общий треугольник — зеркало. Углы основания стоят по кругу радиуса 1, первый на +X, так что при 4 тело прежнее точка в точку. Всё, что было «на четыре», стало «на NB»: грани и их пары, рёбра, картины бит по слотам, шаги реверса и память, нити, счёт мест для своих бит. Смена основания собирает новую картину (слотов стало другое число) и снимает закрепления — они адресованы граням прежнего тела. Буквы С В Ю З теперь стоят по компасу, а не на углах основания: у 3, 5 и 6 граней углы на стороны света не попадают. Название в полосе меню меняется по телу («zerkalius · треугольная бипирамида»), выбор помнится после F5.
Октаэдр v0.035 — «тут возможность Серпинского». В «🎲 Картине» под «Новой картиной» — кнопка «△ Серпинский»: на каждой грани треугольник Паскаля по чётности, бит ряда r на месте k — C(r, k) mod 2, то есть 1, когда у k и r−k нет общих двоичных единиц (Лукас). Это тот же треугольник, что «Правило 90» из одной точки в Code; снизу он, как всегда, отражённый и инвертированный. Режим держится, как свои биты: при смене плотности треугольник строится заново на новое число рядов (чище всего на 16, 32, 64 — степенях двойки). Снимается «🎲 Новой картиной» или вписанными своими битами, помнится после F5. Узор сверен расчётом.
Октаэдр v0.036 — «Аниматрицу туда также». В «⇄ Реверсе» две новые операции шага: «▼↙ Аниматрица» и «▼↘» (клавиши 4 и 5). Правило то же, что в Code: проход от вершины вниз, ряд r+1 переписан по уже переписанному ряду r. На гранях бит только 0 или 1, поэтому 1 — символ, 0 — пусто, и правило Code становится XOR — ровно то, чем Аниматрица оказывается после разгона (исследование, раздел 9½). У бита на грани два соседа сверху; «столбец» волны — один из них: ↙ берёт правого, и волна бежит вдоль левой стороны, ↘ — левого, вдоль правой. Шаг — целый проход по всем граням, назад — обратный проход снизу вверх, точная отмена; «▶ Цикл» гонит подряд, память и «устояло» считаются как у реверса. Когда картина возвращается к исходной, в строке шага встаёт «цикл за N». Сверено в node: 13 рядов — цикл 16, 16 — 16, 32 — 32 (степень двойки не меньше числа рядов, в обе стороны), шаг назад отменяет шаг вперёд; Серпинский за проход съезжает на ряд вдоль стороны, C(r, k) → C(r+1, k+1).
Октаэдр v0.037 — «это прямо под верхней полосой меню писать» (скриншот строки «шаг 129 · устояло 60% · цикл за 32», где «32» перенеслось на новую строку). Строка шага ушла из раздела «⇄ Реверс» под полосу меню: по центру, в одну строку, на полупрозрачной подложке, мышь сквозь неё проходит. Полоса на узком экране переносится и меняет высоту, поэтому место под ней меряет скрипт (нижний край полосы + 4 px) и следит за ней. В Дзене строка прячется вместе с полосой.
Октаэдр v0.038 — «также надо 2 и 1 грань». Кнопки основания теперь ▽ 1, ◊ 2, △ 3, ◇ 4, ⬠ 5, ⬡ 6. При 1 и 2 тела уже нет: основание — отрезок из двух точек (±X), и выходит плоский ромб — верхний треугольник и его зеркало вниз, в плоскости Z = 0. У плоской грани центр лежит в её же плоскости, и прежнее правило «нормаль смотрит туда же, куда центр» стороны не определяет — сторону задали явно: слот 0 смотрит на +Z, слот 1 на −Z. 2 грани — двугранник: у ромба лицевая и оборотная сторона, на каждой своя картина, видна та, что к глазу. 1 грань — одна картина, видная с обеих сторон (с оборота — зеркально), как на стекле: для неё видимость берётся по модулю. У отрезка экваторное ребро одно, а не два. Сверено в node: нормали, число граней и рёбер для 1, 2, 3, 4; при 4 тело прежнее.
Хаб v0.028 — «не меняет язык заголовков, на этом компе, на другом норм, странная штука». Виновата не
страница, а машина: это Windows Server, где визуальные эффекты выключены по умолчанию, и браузер отвечает
prefers-reduced-motion: reduce (проверено в консоли; регистр Windows на этот вопрос отвечает
невнятно, и доверять надо браузеру). Весь блок сбоев начинался выходом по этому условию, а вместе с полосами
уходили смена языка по строкам и надпись обоев — подписи так и стояли английскими, как записаны в разметке
(v0.024). Уважать «меньше движения» правильно, но гасить это должно движение, а не содержание: теперь условие
не выходит из блока, а поднимает признак CALM. В тихом режиме случайных сбоев нет и полосы при
смене языка не рисуются — язык встаёт сразу, — а перебор строк и очередь надписи обоев идут как прежде, раз
в ~2,5 с.
Октаэдр v0.039 — «поправь 2 — это перпендикулярное двух треугольников». В v0.038 две грани дали двугранник:
один плоский ромб, у которого лицевая и оборотная стороны несут разные картины. Имелось в виду другое — два ромба
ПЕРПЕНДИКУЛЯРНО друг другу, крест: первый в плоскости Z = 0, второй в X = 0, общая у них только ось. Поэтому у
основания теперь четыре точки (0°, 90°, 180°, 270°), а грань стоит не на стороне квадрата, а на диаметре: слот s
берёт EQ[s] и EQ[s+2]. Экватор — те же два диаметра, по одному на ромб, а не обход
квадрата по сторонам. Сторону плоскости по-прежнему задаём явно (центр плоской грани лежит в её же плоскости, и
«наружу» по нему не определить): слот 0 смотрит на +Z, слот 1 на +X. Видны оба ромба с обеих сторон, как одиночный:
толщины у листа нет, и прятать изнанку не от чего. Кнопка основания стала «✛ 2», подпись тела — «крест из двух
ромбов».
Октаэдр v0.040 — «пересечения там — пунктирным ребром». Два ромба креста пересекаются по оси, но настоящего ребра там нет, и в общий список рёбер ось не положить: видимость ребра считается по грани, где лежат ОБА его конца, а вершина и её зеркало в одной грани не встречаются — ось ушла бы в пунктир скрытого контура и появлялась бы только с включёнными скрытыми рёбрами. Поэтому линия рисуется отдельно, поверх рёбер, и тоже штриховой: по чертёжному правилу штрих и значит «здесь одно уходит за другое». Заодно снимается неточность художника: грани сортируются по глубине целиком, поэтому у самой оси один ромб ложится поверх другого полностью, и без этой линии место пересечения не читалось.
Октаэдр v0.041 — «это как бы скрытое ребро» (со снимком галки «△ Скрытые рёбра»). В v0.040 ось пересечения рисовалась сама по себе и всегда, ярче дальнего контура. Но она и есть скрытое ребро — линия, по которой одно уходит за другое, — поэтому переехала в тот же проход, что и весь дальний контур: та же штриховка, та же приглушённость, та же галка. Причина, по которой ось не лежит в общем списке рёбер, прежняя: видимость ребра считается по грани, где лежат ОБА конца, а вершина и её зеркало в одной грани не встречаются.
Исследование v0.019 — из трёх вопросов списка «осталось» закрылись два, и не проверкой, а доказательством
(раздел 9¾). Почему период не меняется от нулей. Метка столбца — символ его верхней непустой клетки — вечна:
строку 0 волна не переписывает, а над пустой клеткой ничего не меняется. Выше верхней чужой клетки чужому символу
взяться неоткуда: накопитель там бывает только пробелом или меткой, значит и пишет только их. А над чужой клеткой
правило — чистый XOR, то есть умножение на 1/(1+z) над GF(2), и в нём каждая строка когда-нибудь непуста:
будь строка r пуста на всех проходах, пустовала бы и строка r−h при h — половине
её периода, и так вниз до строки 0, а она непуста всегда. Значит чужая клетка рано или поздно накрывается меткой
(«два разных → верхний»), чистая часть столбца растёт строго, и дальше период обязан быть P. Нелинейность волны живёт
только в разгоне. Отсюда же третий вопрос: нули вымирают тогда и только тогда, когда в сиде нет нуля, — живут они
ровно в столбцах с меткой «0». Разгон без обрезки выведен точно: верхняя чужая клетка столбца на отклонении
d гибнет на проходе min{k ≥ 1 : k & (d−1) = 0} (теорема Куммера), максимум даёт
d = P/2 — совпало для всех 676 столбцов на прогонах в 50, 64, 100 и 128 строк. Расчёт заодно повторил все
прежние числа исследования и показал главное: начало цикла — это в точности тот проход, на котором гибнет последняя
чужая метка. Осталась только точная формула разгона у Серпинского с обрезкой (P/2 + 1) и у правила 150 (5/8 P), но
известно, где искать: последними держатся не самые глубокие клетки, а те, что на отклонении P/4 и P/8 от центра.
Заодно выправлен номер версии в первой строке файла — он отставал на две (v0.016 при v0.018 в заголовке).
ПОЧЕМУ ТЕКСТ ПОМОЩИ ЖИВЁТ В САМОЙ СТРАНИЦЕ
Как методичка в Октаэдре: отдельный файл с описанием отстаёт от кода с первой же правки. Инструкция
лежит в <template id="helpText"> рядом с разметкой панелей, и при правке кнопки её
описание оказывается прямо перед глазами.
ПОЧЕМУ ПОСЛЕ СЦЕНЫ, А НЕ В САМОЙ СЦЕНЕ
Стартовая сцена «Код Матрицы» при выборе из списка включает неон и гасит радар, и так должно оставаться. Поэтому стартовый вид накладывается поверх сцены отдельным шагом и только при открытии. Если в памяти браузера лежит свой текст, загрузится он, но вид будет тот же.
Кнопка ⟲½ Полуоборот в рамке Круга, отдельной строкой.
Откуда взялась: «◄/► Круг Инв» переворачивает бит, переходящий через шов строки. Значит за
len нажатий каждый бит пересекает шов ровно один раз — возвращается на своё место, но
перевёрнутым. То есть len тактов «Круга Инв» = инверсия строки без всякого поворота, а ещё
len тактов возвращают её домой. Полный период — 2·len, ровно поэтому
computeShiftTotalTurns удваивает итог у Inv-режимов. Кнопка делает этот прыжок одним
действием и за O(len).
ПОЧЕМУ НЕ ЦИКЛ ИЗ len ВЫЗОВОВ
Во-первых, это квадрат по длине строки. Во-вторых, и это важнее, у ◄/►Круг есть надстройки, которые ищут ПОЛОЖЕНИЕ («⇔ Крайние 1», «🔗 Не рвать 1-группы»), а ⊙-выравнивания вообще двигают только картинку и самих бит не трогают. Такой цикл они бы перехватили. Полуоборот положения не ищет — и потому от выравнивания и от этих галок не зависит вовсе.
У строк РАЗНОЙ длины общего полуоборота нет: у каждой свой. Счётчик «Вар: N/M» двигается на наибольшую длину, а сообщение честно перечисляет длины. При одинаковых длинах всё точно.
Заодно: версия в файле разъехалась — <title> показывал v1.513, а
шапка и подписи скриптов 1511. Свёл всё к 1513.
Кнопка 🪞 Карта осей под «🎭 Маской». Ищет не заданный образец, а САМУ симметрию: все центры отражения в каждой строке за один линейный проход.
ТРИ РЕШЕНИЯ ВНУТРИ
Антипалиндромы считаются тем же Манакером. Подмена t[i] = s[i] XOR (i&1):
у чётной оси сумма номеров пары нечётна, значит ровно один из двух бит перевёрнут, и «биты
РАЗНЫЕ в s» превращается в «биты ОДИНАКОВЫЕ в t». Второй алгоритм не нужен.
Порог 6 бит (AXIS_MAP_MIN_LEN): осью длины 1 является каждый бит, а длины
2 — каждая пара «01»/«10». Без порога карта закрасила бы всё.
Точки рвут ось. Строка режется на куски из чистых «0»/«1»: сравнение «точка равна точке» породило бы симметрию на пустом месте.
Черта сделана box-shadow, а не border: рамка у inline-элемента
добавила бы высоту и увела строки по вертикали, а тень места не занимает.
Кнопка 🪞 Оси сквозной ⟶. Собирает цепочку в одну ленту и оставляет только те оси, что пересекли границу строк — внутристрочные уже показывает построчная карта, и дублировать её значило бы утопить редкие сквозные оси в сотне обычных. Черта толще, подсказка говорит охват.
ЛЕНТА БЕРЁТСЯ ИЗ КАРТЫ ЯЧЕЕК, А НЕ ИЗ СКЛЕЙКИ
bgConcatCellMap() отдаёт «место в ленте → {строка, бит}», собранное тем же
обходом, что и сама склейка. Строить ленту отдельно через concatRowsDownTo() нельзя:
они уже расходятся — склейка выбрасывает точки через stripDots, а карта ячеек их
оставляет. Поэтому лента собирается ИЗ САМОЙ КАРТЫ: сколько ячеек, столько бит.
Обход — обычная сквозная ⟶ сверху вниз по всей цепочке, а не текущий режим фон-поиска: тот меняется по ходу работы, и кнопка означала бы каждый раз разное. Остальные одиннадцать обходов (влево, змейки, Инв, Рев+Инв) подключаются одной строкой.
Охват оси считается за одно вычитание: заранее строится префикс «сколько раз сменилась строка к этому месту». Иначе длинная ось стоила бы прохода по себе, и всё снова стало бы квадратом — тем самым, от чего уходили Манакером.
Кнопка «⇄🔎 Реверс» показывала только неподвижные биты — те, что стоят на палиндромных местах и разворота не заметят. Вторая половина строки никак не помечалась, и картинка отвечала лишь на половину вопроса.
Теперь кнопка делит строку надвое: неподвижные горят своим цветом, меняющиеся гаснут в фон. На виду остаётся скелет симметрии строки.
ПОЧЕМУ ВТОРАЯ ПОЛОВИНА ГАСНЕТ, А НЕ КРАСИТСЯ
Пользователь сказал «изменяющиеся чёрным». На тёмном полотне «чёрным» и значит «в фон»: дай мы им ещё один цвет, на экране стало бы вдвое пестрее, а разделить надо всего надвое. Тот же приём, что в памяти октаэдра, и там он себя оправдал.
Признак считается тем же сравнением, что и первая половина, только с обратным знаком, и по тому же набору строк: две половины обязаны делить строку ровно надвое, без щелей и нахлёста. Пустые места и точки прореживания не в счёт — у них нет значения, которое могло бы измениться.
Это первая половина пункта 1 из списка ниже. Вторая — память по циклу (сколько шагов подряд бит держится) — ещё не сделана: в Layers для неё нужен свой ход, потому что «реверс» здесь не одна кнопка, а семейство зеркал и Кругов.
Общий модуль стрелок оборачивал каждый ползунок в строку «◂ трек ▸» и отдавал обёртке ширину ползунка — у вертикального это 16 px, трек сжимался в точку. Обёртку вертикального развернули в столбик, значок «↕» убрали (двойной клик «подогнать под экран» переехал на число), трек — во всю высоту рамки. Модуль не трогали: он общий для всех машин.
Пара к «⇄🔎 Неподвижным» на одной строке: переворачивает ровно ту половину, которую подсветка гасит.
ПОЧЕМУ РЕЗУЛЬТАТ РАВЕН РАЗВОРОТУ
Меняющиеся биты ходят парами: №k и зеркальный к нему различаются, значит перевернуть оба — то же, что поменять местами. Неподвижные при развороте и так стоят на месте. Это не ошибка, а само определение «меняющихся». Разница с «⇄ Реверсом» — биты остаются на своих позициях, и позиционные пометки (инверсии, вставки) живут дальше.
Серпинский: новый бит №j = бит №j−1 XOR бит №j над ним, за краями нули — из строки длины T выходит T+1. На треугольнике Паскаля это его следующая строка, но правило общее и работает от любой. Номера: строка читается как двоичное число, под ней встаёт на единицу больше (BigInt — строки длиннее 53 бит). Обе вставляют со сдвигом нижних строк и переносят выделение на новую — жать можно подряд.
Меню 2 получило постоянный размер (24 px, кнопка 28 px, значки 15 px) вместо привязки к кеглю. Стоит по середине нулевой строки, по полстроки выходит в −1 и 1; сверху под его половину резервируется место, иначе оно упиралось в меню 1 и съезжало на биты. Черта горизонта под меню вырезается clip-path — слоями не получилось, меню и черта живут в разных контекстах. Ось идёт до низа последней строки ПОД цифрами бит (поднят слоем сам span с битами, а не коробка — у коробки z-index перебит подложкой поля) и стоит по центру цифры без межсимвольного интервала.
СТОРОЖ НУЛЕВОЙ СТРОКИ (v1.529)
На скриншоте первая строка Серпинского стояла в нулевой. Нулевая обязана быть пустой, но проверялась только при загрузке. Теперь проверка на входе каждой отрисовки: нашлись биты — над ними вставляется пустая нулевая. Откуда биты туда попали — НЕ установлено, это лечение последствия; причину стоит поймать, если повторится.
Кнопка «🔥 Память по циклу»: бит разгорается, пока держит значение — ступени 1, 2–3, 4–7, 8+ шагов; сменился — гаснет до обычного.
ПОЧЕМУ ОБЩИЙ ПРОХОД, А НЕ У КАЖДОЙ КНОПКИ
«Реверс» в Layers — семейство: зеркала, Круг, Круг Инв, полуоборот, разворот, правка руками. Вешать счёт на каждую значило бы завести пять копий одного и того же. Поэтому шаг определён через результат, а не через кнопку: шаг — это любое изменение строки. Проход на входе render() сравнивает строку с её прошлым видом; перерисовка без изменений (наведение, прокрутка) шагом не считается. Сменилась длина — позиции больше не совпадают, счёт строки заново.
▶ Авто в режимах шага, XOR выдел, Интерливинг и сквозных теперь замечает, что вернулся в уже бывшее состояние, останавливается и отчитывается парой: μ — длина входа, λ — длина петли. Петля в один шаг — неподвижная точка.
СОСТОЯНИЕ — НЕ ТОЛЬКО СТРОКИ; ДВА ЯРУСА
Шаг зависит ещё от указателей пары, направления, хвостового буфера, флагов «использована» и кухни Гориз.XOR — всё это в ключе. Счётчики (номер шага, находки) не в ключе: они растут всегда и цикл не дали бы найти. Лишнее поле грозит только пропуском цикла, недостающее — ложной тревогой, поэтому поля взяты с запасом.
Первые 20 000 состояний идут в таблицу отпечатков (64 бита) — первое повторение даёт μ и λ точно и в самый ранний момент. Дальше таблица не растёт, и работает Брент: одна запомненная «черепаха», переставляемая на степенях двойки. λ он даёт точно, μ — только границей сверху (для точного нужен повторный прогон с начала, а шаги с побочными эффектами переигрывать нельзя).
Круг и Спираль не тронуты: там период известен заранее (НОК длин, у Инв вдвое), прогон и так останавливается на полном цикле.
Строка r встаёт на место 2h−1−r, где h — строка горизонта. Горизонт не поднят — отражается выделенный блок. Отражаются только пары, у которых есть обе строки; нулевая строка остаётся на месте (иначе сторож нулевой вставил бы новую и всё сдвинул). Построчные пометки едут со своими строками, паттерны не трогаются.
ПОЧЕМУ НЕ КОМПОЗИЦИЯ ПОВОРОТОВ
«Повернуть на 90°, развернуть, повернуть обратно» теряет форму на строках разной длины: поворот кладёт их на общую сетку и досыпает нули. Прямая перестановка строк точна. Разворот, инверсия и вертикальное зеркало — три коммутирующие инволюции, вместе группа из восьми элементов (Z₂³): зазеркалье стало двумерным.
Ядро. Лента (выделенные строки или все, сквозная →) прореживается с шагом k = 2…8 по уровням kᵉ; каждое прореживание сводится к представителю своей четвёрки V₄ и считается. Отчёт — лесенка «сколько разных видов всего» на каждом уровне; перестала расти — ядро замкнулось.
ЧТО ЭТО ДОКАЗЫВАЕТ И ЧЕГО НЕТ
Теорема Кобэма–Эйленберга: ядро конечно ⟺ последовательность k-автоматная. На конечной ленте подпоследовательности сравниваются окном в 16 бит, уровней мало — «замкнулось» на сотне бит это повод присмотреться, а не теорема. Поэтому в отчёте вся лесенка чисел, а не одно слово.
Склейка по V₄ считает ОРБИТЫ, а не элементы — число выходит не больше настоящего, но признак «конечно / растёт» от неё не меняется.
Оси сквозной. Рядом с кнопкой — выбор обхода: → , ←, змейка ←, змейка →. Инв- и Рев+Инв-вариантов в списке нет намеренно: инверсия и разворот всей ленты осей не меняют, карта вышла бы та же. Порог ленты свой — max(6, ⌈2·log₂N⌉): в случайной ленте из N бит самый длинный палиндром растёт как 2·log₂N, и с прежним порогом 6 длинная лента тонула в случайных осях.
Для выделенной строки и выбранной операции (Круг, Круг Инв, разворот, инв-разворот, «x ⊕ сосед», Правило 90) решает, какие строки её длины вернутся к себе ровно через t шагов. Шаг — аффинный F(x) = A·x ⊕ b, t шагов — Fᵗ, и вопрос сводится к уравнению (Aᵗ ⊕ E)·x = bₜ: Гаусс вместо перебора 2ⁿ. Ранг даёт ответ сразу: решений нет или ровно 2^(n−r). «⤓ Вписать» кладёт в строку ближайшее решение — свободные переменные взяты из её же бит.
ПОЧЕМУ В СПИСКЕ НЕТ AND
x·y не выражается XOR-ами — AND нелинеен, и алгебра на нём ломается. Там перебор остаётся честным способом; ровно там живёт непредсказуемость. Длина ограничена 512 битами: у плотных операций умножение матриц — n³/32, и на большом t их до шестидесяти.
Выросло из разговора про «суперархиватор»: нельзя ли любую строку свести правилом к одному биту, а потом из короткого зерна «выстрелить» обратно в любые данные. Кнопка рядом с «🔺+1» строит под строкой треугольник: под каждой парой соседей их XOR, n бит → n−1 → … → 1, — и показывает его в «🧾 Черновике шага», а левый край (первый бит каждого этажа) — отдельно, в «Итоге».
ПОЧЕМУ ЭТО НЕ АРХИВАТОР, А ДЕТЕКТОР ПОРЯДКА
Каждый этаж теряет бит (0110 и 1001 дают под собой одно и то же), поэтому
по низу строку не восстановить. Хранит её левый край — ровно n бит, как и сама строка: спуск не
сжимает, а перекладывает. Это биномиальное преобразование над GF(2), и оно само себе обратное —
спуск от края даёт исходную строку (ещё одно зеркало рядом с тремя инволюциями).
«Выстрелить из зерна в любые данные» мешает счёт: зёрен из T бит всего 2^T, значит и результатов не больше 2^T, а строк длины N — 2^N. Из двух бит правилом «🔺+1» выходят только 4 строки из 8 возможных трёхбитных, и у всех чётное число единиц. Зато для данных, порождённых правилом, сжатие огромное: у Серпинского край — одна единица. Поэтому кнопка отвечает на вопрос «есть ли в строке порядок»: разреженный или повторяющийся край — есть, край-мусор той же длины — не видно.
Продолжение того же разговора: «если бы можно было быстро вычислить правило, которое непременно приводит к нужной строке, — это и был бы суперархиватор». Кнопка рядом с «🧮 GF(2)» берёт ленту (выделенные строки или вся цепочка) и находит самое короткое правило «следующий бит = XOR нескольких предыдущих», которое выдаёт её целиком. В черновике — правило, зерно из L первых бит и 64 следующих бита, вычисленных по этому правилу.
ПОЧЕМУ ТОЛЬКО ЛИНЕЙНЫЕ ПРАВИЛА
Кратчайшее правило среди ВСЕХ возможных (колмогоровская сложность) найти нельзя в принципе — это доказано, а не «трудно». Да и у большинства строк правила короче их самих нет: правил короче n бит меньше, чем строк длины n. Но внутри одного семейства поиск бывает точным и быстрым. Для линейного, над GF(2), это алгоритм Берлекэмпа — Мэсси: за n² шагов, с гарантией, что короче нет. Лента, порождённая таким правилом, хранится как 2·L бит вместо N; у случайной L держится около N/2 — это честный ответ «линейного правила нет», а не промах поиска.
Баг-репорт «сломалось», со снимком. «🧊 Вид» в режиме «все строки»: холст со стрелками на месте, а карточек нет. Проверено в браузере на тех же версиях: «все строки» работает и на столе, и под полем строк, и в отдельном окне. На пустых, однобитных, огромных строках и на строках вперемешку с пустыми ни одно окно не падает. Не повторилось, значит, дело в данных пользователя: у него страница открыта из файла, и память у неё своя. Картинка на снимке объясняется так. «Вид» перерисовывается последним в общей перерисовке. Если какое-то окно раньше него падало, до «Вида» дело не доходило, и холст со стрелками оставался, а карточки не появлялись.
Теперь каждое окно перерисовывается в своём try: упавшее не гасит остальные, а внизу появляется сообщение «⚠ Окно «…» не нарисовалось: … — пришли этот текст». Любая другая ошибка страницы тоже показывается сообщением, с файлом и строкой. Проверено нарочно сломанным окном: остальные, и «Вид» тоже, рисуются, сообщение на месте.
ПОПУТНАЯ ПОЛОМКА: HEREDOC СЪЕЛ \N
Первая сборка v0.034 не загружалась вовсе: `$ is not defined`, а в консоли — SyntaxError в zz-ui.js. Правка вставлялась через heredoc оболочки, и `split("\n")` превратился в `split("` с настоящим переводом строки. Нашлось сразу, потому что проверял сам. Правки со строками, где есть обратная косая черта, нужно вставлять только через файл-скрипт, не через heredoc.
Снимок своего шаблона «Столбик · 70 стр.» и просьба: «крась номер строки, если там есть изменённые по сравнению с сохранённой версией биты, и снимай краску, если восстановилось». Сохранённая версия — свой шаблон-столбик, эталон. У своих шаблонов появился флажок ⚑: им выбирают эталон, а второй щелчок по нему выключает сравнение. По умолчанию эталон — последний сохранённый «+ Столбик»: при загрузке берётся последний свой столбик, а каждый новый «+ Столбик» становится эталоном сам. Номер строки, которая отличается от эталона, золотой. Сравнение идёт строка в строку по номеру, в рабочем поле. Строки, которых в эталоне нет, тоже подсвечиваются. Над полем написано, против какого шаблона сравнение, сколько строк изменено и сколько недостаёт.
КРАСКА СНИМАЕТСЯ САМА
Сравнение считается при каждой отрисовке поля, а не запоминается пометкой. Поэтому, как только строка снова равна эталону (исправил руками, ↩, вставил обратно), номер гаснет сам, и снимать ничего не нужно. При удалении шаблона номер эталона сдвигается, а если удалён сам эталон, сравнение выключается.
Запрос пользователя: «неподвижных бит 2, меняющихся 6 — рядом с номером строки, эти числа компактно; и кнопку, чтобы прямо в строках подсветила красным неменяющиеся; также число 0 и 1 у номеров — отдельной кнопкой показать». Над строками три переключателя. «⇄ н·м» — у номера строки мелко: неподвижных бит (красным) и меняющихся (серым), например 2·6. «0·1» — нулей и единиц, например 3:5. «🔴 неподв.» — неподвижные биты прямо в строках красным, во всех полях и в наложении. Числа у номеров считаются по рабочему полю, колонка номеров расширяется под них сама. Неподвижный бит — тот, что равен своему зеркальному (бит k и бит «длина−1−k»): разворот его не трогает.
Одновременно с этой правкой Zazerkalius правила другая сессия: панель значками, v0.035. Эта версия легла поверх неё, и её работа сохранена. Переводы строк в трёх файлах страницы приведены к LF, как у той сессии.
Две просьбы по снимкам: «возможность скрывать в значки в один столбик» (левая панель: Построения, △ Треугольник, Шаблоны) и «различай оси на бите и междубитные» (🎯 Указатели симметрии: у «111» три скобки выглядели одинаково).
Пользователь: «стрелки пусть крутят, как будто последняя выделенная ось закреплена, — или что-то в этом роде; и сделай кнопку-крест: при нажатии на неё и перемещении двигается, как с Ctrl, сама она стоит на месте».
Запрос пользователя: «надо и плоскости ещё добавить, и чтобы за них крутить, когда остальная ось на месте, как в 3D-программах». Вокруг сцены теперь три полупрозрачных кольца-плоскости через её центр: YZ (поворот вокруг X, красное), XZ (вокруг Y, зелёное), XY (вокруг Z, синее), и их пунктирные оси с подписями. Кольцо под мышью подсвечивается, курсор меняется. Если тянуть за кольцо, сцена крутится только вокруг его оси, а остальные оси остаются на месте. Если тянуть внутри колец, поворот свободный, как раньше. Плоскость текущей строки осталась. Галка называется «оси и плоскости».
КАК СЧИТАЕТСЯ УГОЛ
Поворот вокруг оси мира — это M' = M · R(ось). Угол берётся из того, как мышь обходит центр кольца на экране: если ось смотрит на зрителя, против часовой — плюс, если от зрителя — наоборот. Когда кольцо стоит ребром и обходить нечего, угол считается по движению мыши поперёк проекции оси. Кольцо схватывается, если мышь ближе 9 px к его линии.
Запрос пользователя: «сброс вида, если накрутил отдельные строки, и галку — по умолчанию выключена — что можно отдельные крутить». Схватить строку в «все вместе» теперь можно только с галкой «крутить по отдельности», а по умолчанию она выключена. Без неё щелчок по лесенке только выбирает строку (делает её текущей), перетаскивание крутит всю стопку, Ctrl двигает всю картинку. Кнопка «⟲ сброс строк» возвращает на место всё, что накручено по отдельности: повороты и сдвиги строк стопки, повороты и масштаб карточек «все строки», а заодно масштаб и сдвиг картинки. Направление взгляда кнопка не трогает, для него есть кнопки видов.
Запрос пользователя: «возможность каждого окна — в отдельное». В шапке каждого окна появилась кнопка ⧉. Она выносит окно в отдельное окно браузера, например на второй монитор. Окно продолжает жить: пересчитывается, крутится, следит за строками. Если закрыть то окно или нажать ⧉ ещё раз, окно вернётся туда, где было: на стол или под поле строк.
КАК ПЕРЕЕЗЖАЕТ ОКНО — ТЕМ ЖЕ СПОСОБОМ, ЧТО ПАНЕЛИ LAYERS
В новое окно копируются все стили страницы, тема и шрифт цифр, а само окно переезжает туда целиком (adoptNode), вместе со своими обработчиками. Ловушка одна: код ищет элементы по id в своём документе, а вынесенные живут уже в чужом, и окно перестало бы обновляться. Поэтому поиск по id ($) теперь смотрит и во вынесенные окна, и три места, где элементы искались прямо в документе (указатели симметрии), переведены на тот же поиск. Холст в отдельном окне перерисовывается при смене размера того окна. При перезагрузке страницы вынесенные окна закрываются, а сами обратно не открываются: браузер не открывает окна без щелчка. Если браузер не дал открыть окно, нужно разрешить всплывающие окна для страницы.
Пять сообщений подряд: «возможность хватать за одну в общем виде — выделять, и управление стрелками на клавиатуре и кнопки вверх-вниз-вправо-влево на поле вверху справа»; «добавить полупрозрачные ось и плоскость»; «вся стопка» (про стрелки); «от текущего вида крутится в одной плоскости»; «перемещение с Ctrl — просто передвижение без кручения».
Снимок: режим «все вместе», 70 строк лесенкой — вся стопка умещалась в окно и выглядела точкой. Просьба: «масштаб менять колёсиком». Колесо мыши меняет масштаб большой картинки и приближает к точке под курсором, так что можно подъехать к нужной строке стопки. Shift + перетаскивание или правая кнопка сдвигают картинку. Двойной щелчок возвращает масштаб и место как было. На карточках режима «все строки» колесо увеличивает свою карточку. Масштаб и сдвиг запоминаются, текущий масштаб написан в подписи картинки.
Пользователь: «это, конечно, тоже так, но ещё вариант — что в азбуке Морзе 1-чёрточка вертикальна: ! ! . !», затем «да» на предложенный переключатель. В окне 🧊 Вид появился выбор «лесенка / гребёнка», и он работает во всех трёх режимах: одна строка, все строки, все вместе. В гребёнке каждый бит стоит на своём месте в ряд: 1 — палочка вверх, 0 — палочка к зрителю. Подписи под картинкой для гребёнки свои: спереди штрихкод, сверху инверсия, сзади разворот, сбоку крестик.
В ЛЕСЕНКЕ ТОЧКИ СЛИВАЛИСЬ, В ГРЕБЁНКЕ — НЕТ
В лесенке отрезки идут друг за другом, и спереди точка-ноль сливается с концом соседней чёрточки: порядок пропадает. В гребёнке у каждого бита своё место, поэтому спереди виден штрихкод «| | · |» целиком. Повороты гребёнки дают крест зеркал чище, чем обход лесенки. Инверсия — поворот каждой палочки на 90° вокруг оси ряда (вид сверху): стоячие становятся точками, лежащие встают. Ещё 90° возвращают палочки на место, потому что у палочки нет верха и низа, — поэтому двойная инверсия даёт строку обратно. Разворот — полоборота вокруг вертикали. Сбоку, вдоль ряда, все палочки встают одна за другой, и остаётся крестик — единственный вид, который теряет всё. Рисование стало общим для обеих форм: отрезок — это { начало, конец, бит }; палочка, направленная на зрителя, рисуется точкой.
Снимок: «🧊 Вид», пристыкованный под строками. Просьбы: «пусть вниз прокручивается и удлинять можно все окна» и «и все вместе вид — одна под другой, и также крутить».
Снимок окна «🧊 Вид» и две просьбы: «возможность перетаскивать эти окна под поле строк» и «тут — показать сразу все строки в таком виде с возможностью кручения каждой по отдельности».
Из отвлечения пользователя: «что если 1 — это вид сбоку на линию, а 0 — вид на неё сверху: 0 — линия от экрана ко мне, 1 — линия лежит на экране», затем: «да» на предложенное окно. Каждый бит — отрезок: 1 — вправо по экрану, 0 — к зрителю. Текущая строка рисуется лесенкой на холсте, взгляд крутится мышью или кнопками «сверху / спереди / слева / сзади / справа / наискосок». Внизу — что видно с этой стороны: спереди и с боков — азбука Морзе и соответствующее зеркало, сверху — число лесенок в ту же точку. Зелёная точка — начало строки, золотая — конец, в углу — значок осей.
ОБХОД ЛЕСЕНКИ — ЭТО КРЕСТ ЗЕРКАЛ, А ВИД СВЕРХУ — ТРЕУГОЛЬНИК
Спереди единицы видны чёрточками, а нули точками, потому что эти отрезки смотрят на зрителя. Слева чёрточками видны нули, по порядку, то есть инверсия. Сзади видны единицы задом наперёд — разворот. Справа — инв-разворот. Четыре зеркала окна «🪞 Зеркало» — это четыре стороны обхода одной лесенки. Честная проекция при этом сливает точки с концами чёрточек, и с любой стороны видна только сплошная черта: порядок бит теряется. Весь путь виден только сверху (или наискосок). Сверху это путь по решётке из k шагов вправо и n−k к себе, и таких путей в ту же точку C(n, k) — треугольник Паскаля. Чётность этого числа — Серпинский: оно нечётно ровно тогда, когда k AND (n−k) = 0 (теорема Люка). Число считается точно через BigInt, длинное показывается порядком.
v0.022. Снимок пользователя с ручкой оси 3 и слова «Del выделенной оси». Щелчок по ручке оси без перетаскивания выделяет её: ручка обводится красным, её поле становится рабочим. Del удаляет выделенную ось вместе с её полем. ↩ теперь помнит и число полей, и места осей, поэтому возвращает всё. Выделение оси снимают Esc, любой щелчок по полю и перетаскивание: так Del, нажатый ради строки, не сносит поле. Проверено в браузере настоящим щелчком: выделение, Del (было 3 поля, стало 2), ↩ (снова 3, данные на месте).
v0.023. Снимок: «🪞 Зеркало», ужатое в v0.017, так и осталось узким. Слова: «пусть восстанавливают ширину — если справа свободно». Ужатие окна стало временным. Окно помнит желаемую ширину: растянул за угол — это она, «📐 Разложить» ставит свою, а если ширина не задана, окно берёт столько, сколько свободно. Ещё окно помнит желаемое место — куда его поставили. Каждый раз окно берёт меньшее из двух: желаемую ширину или место до края стола либо до окна справа на той же высоте. Освободилось справа — ширина вернулась. Проверено: ужатое до 270 px окно вернулось к 768; на узком столе 260, на широком снова 780; ширина, заданная за угол (420), держится и возвращается.
Отдельной папки v022 в архиве нет: 0.022 и 0.023 сделаны подряд, до архивации, и в архиве лежит v023, в которой есть обе правки.
Баг-репорт: «Del на строке не должен удалять вверх, не переключать выделение — только нижние». Проверено в браузере. Если ничего не выделено, Del удаляет текущую строку, и на её место встаёт нижняя, так что повторный Del идёт вниз. Но на последней строке текущей становилась строка выше, и следующий Del удалял уже её: столбик съедался вверх. Теперь Del, удалив последнюю строку, останавливается. Следующий Del подряд ничего не трогает и пишет «ниже строк больше нет». Стоп снимают щелчок по полю и стрелки ↑ ↓: после них Del снова удаляет текущую строку. Проверено тем же сценарием: середина — вниз, низ — стоп, после ↑ — удаляет.
Пользователь прислал снимок v0.018 и сказал: «проверь сам», «когда что-то не так, если пишу». Проверено в браузере через локальный сервер: включение наложения, перетаскивание ручки мышью, XOR совпавших бит (два одинаковых треугольника на одной оси гасят друг друга целиком: 78 совпавших мест, ни одной единицы), «⤓ итог» в новое поле, консоль без ошибок. Найдена одна ошибка: ручки стояли примерно вдвое ближе к левому краю, чем их черты.
CH СЧИТАЕТСЯ ОТ ШРИФТА САМОГО ЭЛЕМЕНТА
Место ручки было задано в ch, как у бит и черт. Но ch в свойствах элемента берётся от его собственного шрифта, а у ручки шрифт мелкий (10 px, системный). Поэтому «7ch» у ручки было втрое короче «7ch» у цифр. Теперь ручка лежит внутри точки .axp, у которой шрифт цифр, и место отсчитывается от точки. Замер после правки: середины ручек и черты совпадают до пикселя.
Пользователь после v0.018: «где?». Выбор вида полей показывался только при двух полях и больше, а при «1 поле» его не было видно, и найти наложение было нельзя. Теперь выбор стоит на месте всегда, справа от числа полей. Если выбрать «наложением» при одном поле, полей сразу становится два.
Пользователь уточнил v0.015: «это тоже, но я о том, что в каждом поле нужно до 4 осей для каждой строки». На вопрос, что такое ось, он выбрал вариант «4 черты — 4 треугольника» и добавил: «с возможностью перемещать друг через друга с наложением». У полей строк появился второй вид — «наложением» (первый — «колонками», как в v0.015). Все поля встают в одно пространство. У каждого своя ось, это вертикальная черта своего цвета с ручкой-номером над строками. Строки поля выравниваются по его оси: по центру, влево или вправо, тем же выбором выравнивания. Ручку тянут мышью, оси проходят друг через друга, и треугольники наезжают один на другой. Совпавшие биты сводятся (⊕ XOR, OR, AND или «рабочее поверх») и подсвечиваются, подсказка на бите говорит, из чего он сведён. «↔ оси» разводит поля рядом, «⤓ итог» кладёт наложение в свободное поле для дальнейшей работы (если свободного нет — в рабочее, ↩ вернёт). Щелчок по биту поля делает это поле рабочим.
ПОЧЕМУ МЕСТА — В ПОЛУКЛЕТКАХ
Строка длиной L по центру своей оси начинается на L/2 клетки левее. У нечётной длины это полклетки, поэтому все места считаются в полуклетках, а клетка — это ширина цифры шрифта (1ch). Так треугольник остаётся ровным, как при обычном выравнивании по центру. Биты сводятся, когда стоят ровно на одном месте. Сдвинутые на полклетки рисуются оба, внахлёст, а в «⤓ итоге» идут подряд. Пустые целые клетки между битами итог заполняет нулями. Показ одной строки ограничен 1024 битами, в итог идут все. Править строку на месте и выделять символы можно в виде «колонками».
Снимок пользователя без слов: свёрнутое окно «⇋ Поправка зеркала», у которого правый край с «?» и «–» срезан краем стола. Стол (правая колонка) сужается, когда тянут разделитель у поля строк или сужают окно браузера, а окна держали прежние места и ширину и уходили за край. Теперь окно шире стола ужимается до его ширины (но не уже 260 px), а окно, вылезающее за правый край, сдвигается влево. Это делается после любых перестановок окон, после разделителя, при смене размера окна браузера и один раз при загрузке, когда ширина стола уже известна.
Запрос пользователя: «двойной щелчок по заголовку». Двойной щелчок по шапке окна делает то же, что кнопка «–»: сворачивает окно или разворачивает обратно. Двойной щелчок по кнопкам в шапке («?» и «–») это не задевает. Вместе с «⤒ К верху» (v0.015) окна ниже сразу поднимаются на освободившееся место. Шапка при двойном щелчке больше не выделяется как текст.
Два запроса пользователя со снимками. Первый: «тут возможность до 4 полей одновременно, для каждой строки 4, то есть 4 оси треугольника для дальнейшего взаимодействия». Над строками появился выбор «1 поле … 4 поля». Поле строк делится на колонки, у каждой свои строки и своя ось: треугольник в каждой выравнивается по своему центру, номер строки общий. Рабочее поле одно, и с ним работают все окна, кнопки, шаблоны, ввод, выделение, Del и Ctrl+C/V. Сделать рабочим другое — щелчок по его ячейке, по его заголовку или ← / →. Если полей стало меньше, лишние не стираются: они вернутся, когда полей снова станет больше. ↩ помнит все поля сразу.
Второй запрос: «прижми поля автоматом к верху» (на снимке под свёрнутым «▽ Спуском» осталась пустота). Кнопка «⤒ К верху» в шапке, включена сразу. Свернул, растянул или перетащил окно — те, что ниже в той же полосе, поднимаются и занимают место.
КАК УСТРОЕНЫ ПОЛЯ
Всё поле строк — одна сетка: колонка номеров и 1…4 колонки полей. Сама строка сделана «без коробки» (display: contents), поэтому поля стоят ровными колонками, а выравнивание по центру каждое поле делает внутри своей колонки. Отсюда своя ось у каждого. Z.rows по-прежнему означает «строки»: это ссылка на рабочее поле. Поэтому ни одно окно переписывать не пришлось, а поля сводятся в Z.lanes при сохранении, отмене и отрисовке. Места выделенных символов считаются только в рабочем поле. Взаимодействие полей между собой (XOR поля с полем и так далее) — следующий шаг.
Прижим к верху: окна идут сверху вниз по своему y, и каждое поднимается до нижнего края тех, что стоят над ним и хоть немного перекрываются по ширине. Места по x не трогаются. Если выключить, окна стоят там, где их поставили.
Из размышления пользователя: «как объединить биты правок так, чтобы одни и те же биты принадлежали двум разным строкам», и затем: «да, сделай Проверку треугольника». Новое окно. Треугольник берётся из выделенных строк (если ничего не выделено, то из всех) и узнаётся по длинам: строки короче на бит — ▽ спуск, длиннее на бит — 🔺 Паскаль. Вид можно задать и вручную. Каждая тройка «два бита сверху, один под ними» считается проверкой. Бит подсвечивается тем краснее, чем больше у него сломанных проверок, а найденный испорченный бит обводится. Щелчок по биту в окне переворачивает его в самой строке: так треугольник можно испортить и посмотреть, найдёт ли окно ошибку. «🩹 Исправить» переворачивает самый выгодный бит, пока выгода есть. Окно живое и следит за своими строками. Заодно раскраска 0/1 (нули приглушены) стала общей для всех окон, а не только для строк и креста.
ОДИН БИТ — В ТРЁХ ПРОВЕРКАХ
Внутренний бит треугольника входит в три тройки: снизу в одну и сверху в две. Это и есть «одни и те же биты принадлежат разным строкам»: у треугольника три направления, и каждый бит лежит на всех трёх. Испорченный бит ломает ровно свои проверки, и общий у сломанных — только он. Та же идея, что у сетки с чётностями по строкам и столбцам (RAID, QR-код). Лишние клетки треугольника, которые при сжатии мешали («клеток N²/2, свободы N»), здесь работают как проверки.
Исправление — переворот бит по выгоде: берётся бит, у которого сломанных проверок больше, чем целых. Так декодируют коды LDPC (Галлагер, 1962). Одну ошибку оно находит всегда: сверено на 600 случайных треугольниках, спусков и Паскалей. Несколько ошибок исправляет часто, но не всегда, и тогда окно так и пишет, сколько проверок осталось сломано.
Из отвлечения пользователя: «сигнал: база 10101…, 11 — это первый бит = 1, так как вторая строка; второй бит — 111 на третьей строке = 1», и затем: «да, сделай Сигнал по базе». Новое окно. Каждый бит сообщения превращается в одну строку: 0 — строка базы (маска, повторённая на длину строки), 1 — отступ от базы, то есть её инверсия или сплошные единицы, как в вопросе. Строки идут треугольником (каждая на бит длиннее) или все одной длины. Можно добавить шум в процентах. «📡 В столбик» кладёт строки под текущей и выделяет их. «📡 Прочитать» читает выделенные строки: смотрит, к чему каждая ближе, к базе или к отступу, показывает расстояния и запас и сверяет результат с отправленным.
РАСШИРЕНИЕ СПЕКТРА И ПОЧЕМУ ИНВЕРСИЯ ЛУЧШЕ ЕДИНИЦ
Так работают GPS и CDMA: бит растягивают на k «чипов». Сведений в строке 1 бит, остальное — запас прочности. Между базой и отступом d несовпадающих бит, и строка переживает до ⌊(d−1)/2⌋ испорченных. У инверсии d — вся длина строки: строка из 8 бит выдерживает 3 порченых бита. У «сплошных единиц» при базе 10 не совпадают только нули базы, d = 4, и строка выдерживает всего 1. Поэтому настоящие системы шлют ±, базу и её инверсию. В треугольнике запас растёт от строки к строке: поздние биты сообщения защищены лучше ранних. Если строка стоит ровно посередине, бит не решается, и окно пишет «?».
Пользователь прислал снимок поля и перечислил, чего не хватает: «выделение, удаление по Del, выделение посимвольно без лишних пробелов в фоне выделения, Ctrl+V вставка, окно для вставки строки, из которой строится треугольник, не нашёл».
КАК ВЫДЕЛЕНИЕ БРАУЗЕРА ПРЕВРАЩАЕТСЯ В НОМЕРА БИТ
Биты каждой строки лежат в своём блоке, где нет ничего, кроме 0 и 1, а подпись «ещё N бит» у длинной строки стоит снаружи. Поэтому место выделенного символа — это просто число цифр от начала блока до края выделения. Если выделение уходит за конец показанной части длинной строки, оно тянется до её настоящего конца. Щелчок по битам при выделенных символах поле не перерисовывает: иначе выделение пропадало бы до Del или Ctrl+C.
Запрос пользователя: «Зазеркалиус: построить треугольник по маске 10 — любой маске, длина
задаётся», и уточнение: «числом строк». Слева, над шаблонами: маска из 0 и 1, число строк и кнопка
«△ Построить». Строка k длиной k заполняется маской. Режимов два. «Каждая с начала»: маска у каждой
строки начинается заново, от 10 выходит 1, 10, 101, 1010… «Сплошной лентой»: маска идёт
подряд через все строки, как лента, свёрнутая в ⊿. Если длина маски не делит длины строк, фаза
сдвигается от строки к строке, и в треугольнике проступают косые полосы. Треугольник встаёт под
текущей строкой, текущей становится его вершина, ↩ его убирает. Строк не больше 512.
Слово пользователя: «неудобно работать в Зазеркалиусе, нужно, как в других: по центру строки, с которыми работаем, и шаблоны, которые можно по нажатию вставить; изменять строки прямо в поле строк». Каркас стал трёхколонным:
ПОЧЕМУ ОКНА РАЗЛОЖЕНЫ ЗАНОВО
Стол с окнами стал уже на ширину поля строк, и прежние места окон, рассчитанные на широкий стол, уходили бы за правый край. Поэтому при первом запуске v0.010 окна один раз раскладываются заново. Если стол уже 900 px, они идут одной колонкой по важности: зеркало, поправка, ⊿, спуск, сортировка сдвигов и дальше. Потом раскладку снова держит пользователь, а «📐 Разложить» её сбрасывает.
Выравнивание по центру держится и на длинных строках: у поля внутренний блок шириной в самую длинную строку, так что при прокрутке вбок треугольник не разваливается. Показ одной строки ограничен 4096 битами, дальше надпись «ещё N бит». Править на месте можно всю строку.
Запрос пользователя: «сделай кнопку светлого фона всего html Зазеркалиуса». Кнопка стоит в шапке,
перед ↩. Светлая палитра на странице была и раньше, но включалась только системной темой. Теперь она
заведена ещё и под data-theme="light", и кнопка переключает светлый и тёмный фон. Выбор
запоминается. Пока ничего не выбрано, страница, как и раньше, идёт за системой. Надпись на кнопке
показывает то, что включится по щелчку: «☀ Светлый» или «🌙 Тёмный». Тема ставится до первой
отрисовки, поэтому при загрузке тёмный фон не мелькает.
Запрос пользователя: «ещё туда онлайн-создание треугольника из строки, которую другими инструментами, например этой кнопкой, меняем». Окно «⊿ Сложить в форму» больше не ждёт кнопки. Оно показывает треугольник текущей строки (или всех подряд) и перестраивает его после любой правки строк: кода ⇉, 🔺+1, поправки, ввода, отмены. Первую длину и шаг можно крутить стрелками поля, и картинка меняется сразу. Своё выравнивание: по центру, влево, вправо. «⊿ Сложить» по-прежнему кладёт куски в столбик, а его итог теперь пишется в сообщении, потому что окно тут же показывает новый столбик.
ТУСКЛОЕ — ВЫВЕДЕНО, ЯРКОЕ — НОВОЕ
Смысл окна — увидеть, сколько в строке новых сведений при данной форме. Поэтому строка, которая выводится из предыдущей (🔺+1 от неё или повтор), рисуется тускло: нового в ней ноль бит. У строки «предыдущая + бит» тусклое начало, новые биты — золотом. Яркие строки целиком — это то, что пришлось бы хранить. У Серпинского, склеенного подряд, ярким остаётся только первый бит. У кода ⇉ при ширине 2 видно, что вторая половина каждой пары предсказуема, хоть окно и не помечает её отдельно. Слева у строки номер и знак вида: 🔺, +, =.
Вопрос пользователя: «что если 1 — это 10, а 0 — это 01 из исходной строки, по очерёдности слева», затем: «да, в одну по циклу». Кнопка стоит в столбике строк, под «🧹 Очистить». Левый щелчок выполняет режим, правый меняет его по кругу. ⇉ Код: каждый бит текущей строки становится парой, и вдвое более длинная строка встаёт под текущей. ⇇ Раскод: от каждой пары берётся первый бит. Если в строке есть пары 00 или 11 либо длина нечётная, раскод не делается, а кнопка показывает, на каких битах ошибка. После кода кнопка проверяет, не вышел ли Туэ–Морс.
НЕ СЖАТИЕ, А ИЗБЫТОЧНОСТЬ — И ТУЭ–МОРС
Это манчестерский код (старый Ethernet, RFID). Строка удваивается, а сведений столько же: второй бит пары — инверсия первого. Избыточность куплена ради надёжности: трёх одинаковых бит подряд не бывает (приёмник подстраивает часы по сменам), пары 00 и 11 запрещены (ошибка видна), единиц ровно половина. Правило, повторённое k раз от «0», даёт Туэ–Морса длины 2^k: 0 → 01 → 0110 → 01101001. Отсюда видно, почему Туэ–Морс складывается в ⇋ Поправке ⧉🔁 до самого низа: вторая половина каждого уровня — инверсия первой, то есть то же правило, прочитанное большими кусками. Правый щелчок взят по образцу ⏺ в Code, где он тоже меняет режим одной кнопки.
Слово пользователя: «Zerkalius-zazerkalius.html — всё такое сюда надо скопировать, а этот только сюда». «Всё такое» — кнопки разговора про «суперархиватор». ▽ Спуск и 🧮 Лин. сложность в Зазеркалиусе уже были. Добавлены три окна:
ПОЧЕМУ СОРТИРОВКА СДВИГОВ — ОТВЕТ НА «ПОРЯДОК СТРОК КОДИРУЕТ ПОРЯДОК В СТРОКЕ»
Порядок строк треугольника одинаков для всех строк, поэтому ничего не кодирует: это ключ, а не
данные. Сортировка — другое дело. Она тоже бесплатна (отсортировать может любой), но результат у
каждой строки свой, и по последнему столбцу и номеру строка восстанавливается целиком. Счёт
честный: n бит плюс номер — чуть больше исходного. Выигрыш в том, что похожие биты сходятся в
длинные серии: 011011011011010011 — 12 серий, после сортировки
111111001111100000 — 4. На этом построен bzip2.
Обратный ход проверяет себя. Не каждая пара «столбец + номер» бывает результатом сортировки: пар в n раз больше, чем строк. Если такой строки нет, кнопка так и говорит и ничего не вставляет. Сортировка — удвоением префиксов, у периодических строк совпавшие сдвиги упорядочены по номеру сдвига. Обратный ход сверен с прямым на двадцати тысячах строк, включая периодические.
Вопрос того же разговора: «а если сложить строку в несколько строк по определённому порядку, например треугольником, — появится бесплатная упорядоченность: 1, 2, 3, 4 бита на строку, +1 бит всегда». Кнопка стоит под «⇋ Поправками → слой». Выделенные строки склеиваются в ленту (если выделена одна, берётся она сама) и режутся на куски длиной «первая», первая+шаг, первая+2·шаг и так далее. При 1 и 1 получается треугольник, при шаге 0 — прямоугольник заданной ширины. Куски ложатся в новую цепочку, источник не трогается. В сообщении — сколько строк выводится из предыдущей: «+1 бит», «🔺+1», повтор, — и сколько бит в этой форме новых.
ФОРМА БЕСПЛАТНА, ПОРЯДОК — НЕТ
Форму знают обе стороны, хранить приходится только длину ленты. Но форма лишь раскладывает те же биты по другим местам: это линза, а не источник порядка. Строк, где каждая строка треугольника — предыдущая плюс 1 бит, из 10 бит всего 16 из 1024, а из 5050 бит — одна на 2⁴⁹⁵⁰. Зато если порядок в данных есть, правильная форма его вскрывает. Серпинский, выписанный подряд, в строке выглядит мусором, а в треугольнике каждая строка — «🔺+1» от предыдущей, и нового ноль бит. Так же картинка, вытянутая в строку, оживает в прямоугольнике своей ширины. Поэтому у кнопки есть первая длина и шаг: формы можно перебирать, а выбор формы стоит всего нескольких бит.
Следующий вопрос того же разговора: «а что если поправку и, возможно, симметрию нескольких строк записать битами для всех них», и уточнение: «общими». Кнопка стоит под «⇋ Поправкой». Для выделенных строк (если ничего не выделено, то для всех) она заводит НОВУЮ цепочку, строка в строку: строка №N слоя — поправка D строки №N. Источник не трогается. Вид зеркала по умолчанию общий, один на всю пачку: кнопка берёт тот, у которого единиц во всех поправках вместе меньше всего. Второй вариант в списке — «у каждой свой»: тогда лучший вид выбирается для каждой строки, и его 2 бита (00 ⇄, 01 ⇄🔁, 10 ⧉, 11 ⧉🔁) пишутся в начало её строки слоя. Так вид симметрии тоже становится битами, столбиком слева. В сообщении — сколько несимметричных бит набралось и сколько среди поправок разных.
ЗАЧЕМ ОТДЕЛЬНЫЙ СЛОЙ
Поодиночке поправка строку не сжимает: половина плюс поправка — снова N. Но поправки разных строк бывают похожи: у всех один и тот же сбой в одном месте, повтор через строку, симметрия по вертикали. Пример из разговора: три строки по 8 бит со сбоем во втором бите у всех. Каждая по отдельности стоит своих 8 бит, а вместе — 12 бит половин, одна общая D на 4 бита, 2 бита вида и 1 бит «D у всех одна»: 19 вместо 24. Слой — обычная цепочка, поэтому к нему годятся все готовые кнопки: ⇋ Поправка, ▽ Спуск, 🧮 Лин. сложность. Если порядок есть в самих ошибках, он виден сразу, и можно идти на следующий этаж — поправки поправок. Если слой — шум, этажи на этом кончаются. Общий вид выбран по умолчанию, потому что он стоит 2 бита на всю пачку, а свой — 2 бита на каждую строку.
Тот же разговор про «суперархиватор», следующий шаг: «а что если отзеркалить строку — половины данных достаточно», и сразу за ним: «но если мы половину обозначим на симметричные и несимметричные биты». Кнопка стоит рядом с «▽ Спуском». Строка делится на левую половину L и правую R (при нечётной длине средний бит отдельно). Для четырёх способов достроить R из L — зеркало ⇄, зеркало с инверсией ⇄🔁, повтор ⧉, повтор с инверсией ⧉🔁 — считается поправка D, по биту на каждый бит L: 1 там, где пара не сошлась. Несимметричные биты подсвечены золотом прямо на L — это и есть те самые пометки. Дальше кнопка складывает строку, пока находится зеркало без единой поправки, и пишет, сколько раз это вышло подряд. В конце — грубая цена строки «в мире зеркал».
ПОЧЕМУ ПОМЕТКИ НЕ СЖИМАЮТ САМИ ПО СЕБЕ
Пометка «симметричный / нет» — один бит на каждый бит половины, то есть ещё N/2 бит. Половина плюс пометки дают снова N: зеркало, как и спуск, ничего не выбрасывает, а раскладывает строку на «что похоже на отражение» и «где отличается». Зеркальных строк длины N всего 2^(N/2), при N = 20 — одна на тысячу. Выигрыш бывает, только когда пометок мало: тогда вместо всей D хранятся номера несимметричных битов. А если симметрична и сама половина, и её половина, строка складывается раз за разом до пары бит — так ведут себя Туэ–Морс и Серпинский. Цена считается честно: на каждом этаже 1 бит «сложено ли», 2 бита «каким зеркалом», средний бит и поправка. Ниже 4 бит складывать не пробуем: строку в 2–3 бита складывает любая пара ⇄ / ⇄🔁, это не находка. Случайная строка выходит в N+1 бит, то есть честное «короче нет».
Замер пользователя на v1.623 показал, что кнопка сделала ровно то, что обещала: ячейка квадратная, лесенка 45.06°, остаток 1.6px на 100 столбцов (раскладка браузера квантуется по 1/64px). А треугольник в «центр ½» всё равно был острым, около 53° у вершины. Дело в выравнивании. Строка длиннее предыдущей на g бит, и по центру каждый её край уходит на g/2 столбца за строку, а влево или вправо — на целых g. Прямой угол у треугольника — это 45° у каждого края, то есть сдвиг края за строку равен высоте строки. Поэтому по центру (центр, центр ½, обе оси) ширина столбца теперь 2·высота/g, влево и вправо — высота/g. g — самый частый прирост длины между соседними непустыми строками (у Серпинского и «Номеров» это 1). У лесенок строки сдвигаются своим шагом, для них осталась квадратная ячейка. В сообщении кнопка пишет, какую ячейку поставила и почему.
«📐90° — нет угла 90». Две причины. Первая: межсимвольный интервал округлялся до шага ползунка,
0.5px, а ширина цифры дробная. Ошибка до 0.25px на столбец на сотне столбцов даёт десятки пикселей,
и лесенка заметно уходит от 45°. Вторая: ширину цифры брали из canvas.measureText, который
может разойтись с тем, как браузер на деле раскладывает строку.
Теперь ширина цифры замеряется по самому полю: настоящий шаг столбца (realColStepPx)
минус текущий интервал, а высота строки — по расстоянию между соседними строками (если полотно
отмасштабировано, оба замера меняются одинаково). Интервал ставится с точностью до сотых
(lsExact), ползунок встаёт на ближайшее деление, число под ним показывает точное значение.
Шаг самого ползунка не мельчили: по нему шагают стрелки ◂ ▸ из общего _js/slider-arrows.js
(правка там задела бы все страницы) и протяжка с Shift. Любое движение ползунком возвращает обычные
деления. Точное значение сохраняется в кэше.
«Проверь» — про кнопку «📐90°». Она подбирает межсимвольный интервал под квадратную ячейку и
меняла его так же, как ползунки до v1.620: только CSS, без render(). Сдвиги «½» оставались
посчитанными под прежний интервал до первого щелчка. Та же дыра нашлась ещё в двух жестах:
Shift+протяжка по полю (межсимвольный) и Ctrl+протяжка (межстрочный). Все три теперь зовут
viewRenderSoon. Двойной клик по «↕» (интервал по экрану) перерисовывал и раньше.
«Номер цепочек третье положение — нет, когда номеров». В v1.417 кнопка «№» номеров строк стала
переключать только 10 ⇄ 2, а прятать колонку оставили окну «ℹ Поле». Теперь положение «без номеров»
вернулось, и кнопка снова ходит маятником, как было решено в v1.319: 10 → 01 → нет → 01 → 10. Кольцо
по пути от «нет» к «01» проводило бы через «10» — лишний кадр с другой шириной колонки. Всё для
скрытия колонки (класс hide-rownums, отступ поля) осталось с тех пор и работает как было.
Двойной клик по самой колонке (v1.419) по-прежнему меняет только систему счисления: прятать колонку
двойным щелчком по ней же незачем.
«При изменении размера шрифта, выравнивание центр ½ — потом при клике любом восстанавливается».
Ползунки кегля, межстрочного и межсимвольного, как и выбор шрифта, меняли только CSS-переменные и не
звали render(). А часть раскладки считается при отрисовке в пикселях, по текущему шагу
столбца: сдвиг строк на полстолбца в «½», ширины полей, оси. Она оставалась посчитанной под прежний
кегль, строки разъезжались лесенкой, и любой щелчок, перерисовав поле, всё возвращал. Теперь все
четыре зовут перерисовку, одну на кадр (viewRenderSoon): при протяжке ползунок шлёт input
на каждый шаг.
Попутно исправлена ошибка v1.617: крестик × зафиксированной группы был текстовым узлом внутри
строки, а столбцы строки считаются по длине текста её узлов (realColStepPx и др.) — крестик
сходил за лишний столбец. Теперь знак рисуется псевдоэлементом, текста у узла нет.
«Изменённые потом зелёные перекрашивают почему-то — хотя они красные потом становятся и должны быть». В порядке подсветок «Нов» стоял выше «Изм»: бит, который и дописан операцией, и отличается от оригинала (так бывает у XOR спуска и «Строк → края»: они помечают новыми ровно поменянные биты), горел зелёным, пока пометка «Нов» не слетала. Теперь «Нов» уступает «Изм»: всё, что отличается от оригинала, красное сразу, а зелёным остаётся только то, чему в оригинале пары нет (новые строки, достроенные края).
«Новые после смены выделения должны терять цвет». В v1.600 так слетало только зелёное от XOR
спуска, построений и «Строки → края»; пометки построений («🔺», «🔢») и зеркал держались, пока их не
снимут кнопкой «✕». Теперь правило общее. render() держит снимок newBitsMap
(newBitsSeen): появилась другая строка или другой массив флагов — значит, операция только
что дописала биты, и при них запоминается текущее выделение строк. Операция могла сама его поменять,
поэтому исходным считается выделение сразу после неё. Выделение строк сменили — зелёное снимается
целиком. Выбор отдельных бит («▭ Выбор ячеек») выделением строк не считается и зелёное не трогает.
«Нужна кнопка зафиксировать выделение; все выделения писать в черновик — поочерёдно, по нажатию бит; зафиксированное не снимается Escape — только кнопкой „снять“, которая рисуется крестиком рядом с последним битом».
cellSelOrder: биты попадают в него в том порядке, в каком их выбирали, прямоугольник
протяжки — целиком в хвост, в порядке чтения. Снятые биты выпадают из него сами.Фиксируются только биты цепочки: подсветку групп в колонках паттернов не рисуем. Группы, как и сам выбор, живут до перезагрузки страницы.
«Если по одной щёлкать — не снимать выделение, выделение снимать только по Escape, сразу всех».
Excel-уклад из v1.614 не прижился: биты собирают по одному, а каждый простой щелчок начинал выбор
заново, и держать Ctrl на каждом бите неудобно. Теперь щелчок и протяжка только ДОБАВЛЯЮТ (щелчок
по уже выбранному биту ничего не меняет), Ctrl+щелчок или Ctrl+протяжка с выбранного бита снимают,
Shift+щелчок добавляет прямоугольник от последнего бита. Щелчок мимо битов больше не стирает набор
(так было с v0.941, и собранное терялось от одного промаха). Снять всё разом — Escape: он и раньше
чистил и биты строк, и биты паттернов (clearAllSelections). Остались от v1.614
Shift-диапазон и перерисовка протяжки только при переходе на другой бит.
«Это должна показывать изменения сравнивания только с оригинальной цепочкой; если цепочку сохранить — она становится оригинальной». Раньше красными были биты, перевёрнутые ПОСЛЕДНИМ шагом (по верхушке стека отката): следующий шаг стирал всё прежнее, и понять, что вообще поменялось с начала, было нельзя. Теперь красный бит значит «отличается от оригинала». Оригинал — та же база, что у синих номеров строк и у «↺ Сброса»: 💾-сохранёнка вкладки, а без неё шаблон. Красное копится от шага к шагу, гаснет на бите, который вернули как был, и снимается целиком по 💾: сохранённая цепочка становится новым оригиналом.
Красные пометки XOR спуска (v1.597) и Маски подчинены тому же правилу: бит красный, только если он отличается от оригинала. Сравнение идёт по месту бита в строке, поэтому строка, которая стала длиннее или короче оригинала (зеркала, достройки), не красится вовсе: её биты не с чем сопоставить.
«Надо выделять проще, как прям ячейки в экселе». Раньше каждый щелчок по биту был переключателем: набор только копился, и чтобы начать заново, приходилось жать «✕ Очистить биты» или щёлкать мимо. Так когда-то попросили, чтобы набор не терялся от случайного щелчка. Но собрать его «с нуля» было дольше всего остального. Теперь всё как в Excel:
В битах паттерна то же самое, только в пределах одного паттерна. Строку без Ctrl можно сменить сразу, прежнее сообщение «снимите выбор в другой строке» осталось только для Ctrl. Протяжка теперь перерисовывает поле только при переходе на другой бит, а не на каждое движение мыши.
«Пусть выделенная кнопка (после перемещения, например), если нажать Delete, удалится».
Выделенный значок — тот, что в фокусе: его ставит бросок или перенос (значок сам получает фокус),
а также клик по нему. У выделенного значка видна белая рамка. Delete на нём убирает значок с поля.
Клавиша гасится на слое значков (#fieldBtns): общие обработчики клавиш висят на
document и получили бы её следом, а там Delete удаляет выделенные строки. Проверено
настоящим нажатием: значок ушёл, строки и их выделение на месте.
«Эти цвета также вниз под № и фон поля цепочек сюда». Так же, как у П1/П2 (v1.609/v1.610):
коробка цветов цепочки (#axisColBox) вынута из ряда меню 2 и стоит под «№» цепочки,
шириной с кнопку. В ней столбиком цвет 1, цвет 0 и фон поля Ц: новый двойник
colFieldCAx панельного colFieldC, заведён в fieldColTwins. Стили заданы по id: у замка
тот же класс .axis-col-box, и он остаётся в ряду. Место считает placeChainColBox. Первая
версия ставила коробку на 289 px левее «№»: место считалось раньше, чем меню 2 разводится по полю и
садится на ось. Теперь расстановка зовётся и в самом конце updateAxisSplitPosition. Проверено:
коробка точно под «№», 36 px, фон синхронен с «Видом» в обе стороны.
«Можно ли устранить тормоза при передвижении цепочек за ось?» Профиль на цепочке 300×300
показал, что render() вызывался на каждое событие мыши, даже без сдвига на столбец.
Кадр стоил около 270 мс, события копились в очередь. Почти всё время уходило на принудительные
пересчёты раскладки, а не на логику. Что сделано:
startAxisDrag): кадр рисуется только когда ось сдвинулась на столбец и не чаще
раза за кадр экрана (requestAnimationFrame), рисуется последнее положение. Пока ось тянут
(axisDragLite), не перемеряются ширины номеров и колонок паттернов (fitNumW/fitPatW/
fitPatW2): сдвиг оси их не меняет. Окно «Результат» (самая большая разметка страницы,
8 тыс. узлов из 21 тыс.), отдельное окно результата и «Черновик шага» тоже не пересобираются.
В конце жеста идёт один полный render().fitNumW делал четыре замера вперемешку с записью
CSS-переменных в корень (каждая сбрасывала стили всей страницы). Теперь сначала замеры, записи в
конце и только изменившиеся. То же для --bits-w. Метки обрезанных строк «Результата»
ставятся после всех замеров, а не внутри обхода. minBitsWidthPx больше не читает
offsetWidth ради проверки: ширина уже лежит в dataset.natW.Замер того же жеста (60 движений, по два на кадр, 300×300): было 14 с (из них 12,4 с блокировали обработчики), стало 3,4 с, обработчики около 0. Ось встаёт туда же. Облегчённый кадр 123 мс против 273.
«И цвет фона поля перенеси сюда же, три цвета друг под другом» и «шириною одинаковой с №». Блок
под «№» (v1.609) теперь столбик: цвет 1, цвет 0 и фон поля, каждый шириной с «№» и высотой 14 px.
У фона П1/П2 появился двойник (colFieldLAx/colFieldRAx, заводится в
fieldColTwins). Оригинал остаётся в «Виде» (colFieldL/colFieldR): от него считает
applyFieldColors, его пишет кэш. Правка двойника переписывает оригинал и красит поле. Правка
в панели или загрузка из кэша обновляет двойника (syncColTwins теперь зовётся и из
applyFieldColors). Проверено: обе стороны синхронны, блоки шириной 41 px, как «№».
«Перемести цвета поля паттернов под номера паттернов». С v1.567 пара цветов (1 и 0) стояла в
блоке рядом с «№» вместе с кнопкой выравнивания. Теперь цвета вынесены в свой блок
(#patColL/#patColR, вид планки) и стоят вплотную под своей «№». У П1 блок выровнен
по левому краю кнопки, у П2 по правому, зеркально, как сами «№» (v1.443). Место ставит
placeCol в updateSplitPositions, сразу после блоков у «№». У «№» осталась одна кнопка
выравнивания. Пикеры переехали вместе с обработчиками, связь с панельными цветами
(syncColTwins) цела. В «чисто биты» блоки прячутся, как и остальной ряд. Проверено снимком
обеих сторон.
«Поправь левую границу П2 — она не доходит до конца, по цвету фона видно». У ячеек П2
overflow:visible, а с ним у флекс-элемента min-width:auto, то есть ширина содержимого.
Ячейка с длинным паттерном раздувалась шире колонки (--pat-w2) и вылезала левее границы.
Граница и заливка поля считаются по нулевой строке, а она пустая и узкая. Край П2 выходил рваным:
в замере колонка была 40 px, а ячейки 40, 44, 55 и 67 px. До v1.605 это заслоняла ползущая ширина
П2, пока та не перерастала паттерны. Теперь ширина П2 не меньше той, что нужна самому длинному
паттерну (patW2Need, формула fitPatW2), а ячейке запрещено раздуваться
(.ln .pat2{min-width:0}). Проверено: во всех строках П2 начинается на одном x и одной ширины,
граница #vsplit4 и заливка стоят по нему. Выделение паттерна по-прежнему ничего не двигает.
«Пусть зацеп за пустое поле, где нет битов, двигает все поля влево-вправо вместе с битами».
Протяжка по пустому полотну (v1.018) только прокручивала его. Когда всё помещается в окно,
прокручивать некуда, и не двигалось ничего. Теперь это та же рука, что у ручки #vsplitL0:
весь ряд П1, цепочка и П2 сдвигается сдвигом раскладки (chainShiftCols, margin-left у
.chain) по целым столбцам. Положение ряда на экране — это «сдвиг минус прокрутка», и жест
прибавляет к нему dx. Когда раскладка упёрлась в левый край, дальше идёт прокрутка, как раньше:
длинные строки по-прежнему можно довести до экрана. Сдвиг сохраняется. Выделение строк и паттернов
не трогается: над битами жест, как и был, принадлежит выделению. Проверено: протяжка вправо на
200 px дала сдвиг 17 столбцов, П1 и биты поехали вместе, протяжка влево на 400 px вернула сдвиг к
нулю и дальше прокрутила полотно.
«Не убирает прозрачность при попадании на биты». Фон значка на битах был сплошной (v1.604), но
биты рисуются на z-index 102 (#rows .ln .bits > span), а слой значков стоял на 97, и биты
ложились поверх. Слой поднят до 110: выше бит и оси (101), ниже плавающих окон (120) и полосы меню
(200). Проверено снимком: значок на битах закрывает их целиком.
«Пусть выделять строки можно только в том месте, где лежат биты; клик по строке там, где нет
битов, ничего не делает». Раньше строку выделял клик в любом месте её коробки, включая пустоту поля
и отступы выравнивания. Теперь и клик, и начало протяжки сверяются с настоящими прямоугольниками
знаков строки (pointOnRowBits: непробельные куски текста в .bits > span). По вертикали
годится вся высота строки. Мимо бит ничего не происходит: выделение не ставится и уже набранное
не снимается. Это касается и клика над горизонтом, который с v1.213 снимал выделение. Ячейки
паттернов и колонка номеров живут по-прежнему. Проверено настоящими кликами: бит строки выделяет
её, пустота левее и правее бит ничего не меняет, протяжка по пустоте не выделяет, по битам
выделяет диапазон.
«Пусть когда паттерн выделяется и находится — не двигается ничего». Нашлось две причины.
П2 ползла от прохода к проходу. Её ширина считается «до края окна от правого края бит»
(v1.398). Но биты растягиваются на всё, что оставила П2, а строка кончается на несколько пикселей
раньше края окна (6 px в замере). Каждый проход раскладки прибавлял П2 эти пиксели: выделение
паттерна давало три прохода, П2 шла 134 → 140 → 146 px, биты и ось ехали. Снятие выделения
(fitPatW2) сбрасывало всё обратно. Дальше конца строки П2 всё равно не заходит, поэтому кромка
теперь берётся не дальше конца строки. Пока строка короче окна, расчёт отдаёт ту ширину, что уже
стоит, и лишние проходы ничего не двигают. Если строка длиннее окна, П2, как раньше, сжимается до 40 px.
Мерить от базовой ширины бит (--bits-w) пробовал: она сама зависит от полосы меню 2, а
полоса от поля бит, и выходит новая петля. Клик по паттерну уводил полотно вбок.
scrollToBit ставил найденное вхождение в середину экрана всегда, а теперь только если бита
не видно, так же, как scrollToRow по вертикали. Проверено в браузере: снятие, выделение и смена
паттерна, три перерисовки подряд: ни одна коробка и прокрутка не сдвинулись.
«Нет, так не получится, пусть просто меняют фон на непрозрачный, чтобы на битах их видно было,
если они на битах». Сдвиг на пустоту из v1.602 снят: значки стоят на экране, и прокрутка всё равно
подводит под них строки. Теперь значок, который хоть краем лежит на битах или паттернах, получает
класс .on-bits: фон сплошной, своего оттенка. На пустоте он прозрачный, как в v1.601. Проверка
(fieldBtnsMarkOnBits) идёт после каждой отрисовки (через refreshFieldBtnIcons), при прокрутке
полотна и смене размера окна, не чаще раза за кадр. Битами считаются только непробельные знаки:
пустые строки добиты пробелами, и прямоугольник всего текста метил бы пустоту. Это нашлось
проверкой. Правило броска курсором прямо на биты осталось из v1.594: новую кнопку туда не кладём,
перенесённую убираем. Проверено: на пустоте фон прозрачный, после прокрутки биты под значком, и он
сплошной.
«Цвет фона номеров цепочек — такой же, как у поля Ц». Колонка номеров с v1.328 лежит на заливке
цепочки (#fieldBgC), но с v1.336 поверх неё шла своя подсветка --numcol-bg (белый 12%),
и колонка читалась отдельной полосой. Подсветка погашена (--numcol-bg: transparent), под
номерами теперь ровно --fld-c. Проверено по пикселям: у поля (18, 20, 26), под номером
(17, 19, 25). Вернуть отличие — снова задать переменной полупрозрачный белый.
«Кнопки переносные не должны лежать на битах! Только на пустоте». Проверялась одна точка под
курсором, и длинная подпись (v1.595) ложилась краем на биты. Теперь с битами (.ln .bits > span)
и паттернами (.pat/.pat2) сверяется весь прямоугольник значка, по настоящим прямоугольникам
текста (Range.getClientRects). Пустые отступы выравнивания битами не считаются. Если значок
задевает биты, он встаёт на ближайшее пустое место: поиск идёт кольцами до 240 px внутри полотна
(fieldFreeSpot). Пустого рядом нет — новая кнопка не кладётся, перенесённая остаётся где
была. Курсор прямо на битах: как раньше, новую не кладём, перенесённую убираем. При загрузке значки,
лёгшие на биты, тоже переезжают на пустоту. Проверено: значок на битах сдвинулся на 18 px на пустое
место, поиск занял 11 мс. Прокрутка строк значки не двигает: они стоят на экране, и строки под них
заезжать могут.
«Кнопки, которые перетащил, пусть будут каждая своего оттенка из своей вкладки, разные цвета у
каждой группы, и прозрачные». Группа — это вкладка, где живёт оригинал (.menu-panel). Вне
вкладок группа — верхняя полоса меню или само поле. Оттенок у каждой группы свой, из таблицы
FIELD_BTN_HUE. Сначала оттенки шли золотым углом, но на 16 групп он дал соседей в 20°:
«Строки» и полоса меню вышли обе бирюзовыми. Поэтому таблица ручная, а частые вкладки получили
самые далёкие цвета. Фон значка полупрозрачный в оттенке группы, под ним видны биты. Рамка и
текст того же оттенка. У включённого оригинала фон плотнее и рамка ярче. Группа запоминается в
значке (g), так что цвет остаётся, даже когда вкладку унесли в отдельное окно. В подсказке
значка написано, из какой он вкладки.
«Зелёный должен слетать при изменении вручную выделения». Зелёная пометка («Нов»), которую ставят
XOR спуска, «⊕ класть XOR-ом» и «Строки → края», держалась до «✕», как у всех построений. Теперь
операция запоминает свои массивы флагов из newBitsMap и выделение строк сразу после себя
(xorNewArm). Как только выделение другое, эти пометки снимаются в ближайшей отрисовке.
Зелёное других построений (🔺+1, зеркала и прочие) не трогается: снимаются только те самые массивы.
Красное (v1.597) живёт по-прежнему до правки строк. Проверено в браузере: после XOR 12 красных и
9 зелёных. Перерисовка без смены выделения их не трогает, после смены выделения зелёное ушло, а
красное и чужая зелёная пометка остались.
«Не красит красным, также все биты зелёным красит, красный должен перебивать зелёный». Код
v1.597 был верный: красное стоит выше «Нов». Но номер антикеша у fold-*.js остался
?v=1594. Браузер перечитывал страницу с новым номером в заголовке, а скрипты брал старые
из кеша, та самая ловушка v0.779. Поэтому и был виден зелёный треугольник v1.585 без красного. Номер
поднят до ?v=1599 вместе с версией. Проверено нажатием «⊕ XOR-ом» через http: 12 красных
(все поменявшиеся) и 9 зелёных (биты треугольника, которые не поменялись).
«Просто Повтор» вместо «↪ Повтор отменённого шага…». Голова подсказки (v1.596) бывает длинной и
обрезается «…». Для таких кнопок короткое имя задано руками в FIELD_BTN_SHORT: «↪ Повтор»,
«🗗 Все вкладки в окне», «🗗 Лог находок в окне», «🗗 Маски в окне», «🧹 Очистить список масок»,
«🧾 Окно «Черновик»», «💾 Сохранить цепочку», «📌 Закрепить высоту», «№ Номера П1/П2», «🎨 Цвет
Маски», «✓ Считать наложение». Остальные названия по-прежнему берутся из подсказки. После правки на
поле не осталось ни одной подписи с «…».
«При XOR спуск вниз — пусть красным красит биты изменившиеся, то есть которые изменились от
XOR», затем про «▽⇄ Строки → края»: «эти также». С v1.585 все биты, на которые лёг этаж, метились
«Нов», и эта пометка стояла выше штатного красного «изменён последним шагом». Какие биты XOR
действительно перевернул, видно не было. Теперь xorIntoRowAligned отдельно запоминает биты
строки-цели, которые поменялись 0↔1 (xorChgMap), и они горят красным поверх «Нов». Остальная
часть треугольника остаётся «Нов», хвост, которым строка выросла, тоже «Нов»: он новый, а не
изменённый. То же у «⊕ класть XOR-ом» в построениях и у «Строки → края». Красное держится, пока не
изменится любой бит любой строки (правило Маски), и гасится общим «🔴 Изм. биты». Проверено в
браузере: 12 из 12 изменённых у спуска, 24 из 24 у краёв, после правки красное снимается.
«Также без подписей», на снимке значок «△» без слов. У таких кнопок (△, ↩, 🗗, «+», «−», 📌…) слов на самой кнопке нет, они в подсказке, и v1.595 переносил на поле один знак. Теперь, если в подписи оригинала нет ни буквы, ни цифры, к знаку дописывается голова подсказки: до первого « — », «: », «. » или «; », без повтора знака в начале. Длинная голова обрезается по слову примерно до 32 знаков с «…», незакрытая скобка или «кавычка» уходит целиком: «↩ Отмена», «− Левая линия НАРУЖУ», «🔓 ЗАМОК ПОЛОТНА», «↪ Повтор отменённого шага…». Кнопки со словами показывают свою подпись, как в v1.595.
«Надо их также с текстом». На поле значок нёс только первый знак подписи (как ярлыки меню 2,
pinSlotIcon). Теперь на нём вся подпись оригинала, знак и слова, и она обновляется вместе
с оригиналом («🎭 По маске: нет маски»). Ширина значка по тексту, шрифт как у кнопок приложения.
Новую кнопку при броске держим за левый край, где её знак, а не за середину длинной подписи.
Брошенная или перенесённая, она целиком остаётся внутри полотна по своей настоящей ширине.
Сохранённые раньше значки стояли через 32 px и с подписями налезли бы друг на друга. При загрузке
налезающие разводятся вправо впритык (spreadFieldBtns), остальные стоят где стояли.
«Лучше вместо этого сделай всё поле цепочек полем для этих кнопок, и где их кинуть — пусть там
крепятся, и перетаскивать можно, а если вытащить за пределы поля или на биты — то убрать». Вкладка
«🧰 Кнопки» (v1.592) снята. Над полотном лежит слой #fieldBtns, мышь он пропускает
насквозь, ловят только значки. Любую кнопку бросаешь на полотно, и значок встаёт под курсор и стоит
там на экране. Строки под ним прокручиваются, он нет. Значок перетаскивается по полю. Вытащенный за
полотно или брошенный на биты цепочки или паттерна, он убирается. Новую кнопку на биты не кладём.
Бросок файлов на полотно работает как раньше: файловый обработчик пропускает всё, что не файл. Что
лежало на полке и в слотах меню 2, переезжает на поле рядком у левого верхнего угла. В «чисто биты»
слоя нет.
«В режиме дзен это всё убрать, оставить только цепочки, и в обычном режиме эти меню 2 должны уезжать за верх экрана вместе с первой строкой». Черта горизонта в покое упиралась в низ меню 1 (v1.454), меню 2 висело на черте и имело два своих упора (стопка баров и низ меню 1). При прокрутке все три держали ряд под меню 1. Теперь упоры считаются для непрокрученного полотна: в покое всё стоит как стояло, а прокрутка уносит черту, меню 2, планки П1/П2 и счётчики лесенок вверх вместе со строками, под меню 1. Сама линия оси по-прежнему держится под меню 1. В «чисто биты» (меню 1 скрыто) весь ряд у нулевой строки прячется: меню 2, планки П1/П2, счётчики, черта горизонта. Прячется через visibility: по этим коробкам считается раскладка.
«Сделай отдельное окно-вкладку для переносимых кнопок, и чтобы там, куда закинуть в поле, там и оставалась, а не сама по порядку шла». Набор свой, поле прямоугольное и переносится, как любая вкладка. Дальше: «закрепление значков в меню 2 — это удали». Новая вкладка «🧰» — окно с полем. Любую кнопку приложения бросаешь в поле, и её значок встаёт ровно под курсор, со своими координатами, а не в очередь ячеек. Значок жмёт оригинал и показывает его состояние, как прежние ярлыки меню 2. По полю он переставляется, брошенный мимо убирается, высота поля тянется за угол. Всё хранится в настройках вида. Приёмники меню 2 отключены. То, что было закреплено там, при загрузке переезжает на полку рядком. Пустые контейнеры слотов оставлены: по ним меню 2 садит выравнивания на ось.
«Вот тут неправильно делает». Кэш ложился в строки с самого верха: первая запись попадала в нулевую строку или в построения сверху, и счётчик построений сбрасывался. Нулевая строка оказывалась занятой, вставлялась новая пустая, и цепочка вместе с паттернами съезжала на строку вниз. Теперь запись №1 ложится в строку №1, туда же, откуда «кэш → паттерны» начинает колонку паттернов, так что строка и её паттерн стоят напротив. Нулевая строка и построения сверху не трогаются.
«Паттерны всегда должны начинаться с 1 строки». Вставка строк на нулевую строку или выше («🔻−1», «△ Подъём», спуск «вверх») поднимает счётчик построений сверху, чтобы номера настоящих строк не съехали. Список паттернов при этом не трогался: паттерны стоят по индексам, и первый оказывался на построенной строке с минусовым номером. Теперь в список на том же месте вставляется столько же пустых ячеек, и паттерны едут вместе со строками. Выделение паттернов переносится так же.
«Убери цепляние горизонта за первую строку, только за саму линию». Хват за нулевую строку (v1.441, с v1.580 ещё и в промежутках меню 2) снят: нажатие в строке снова только выделяет. Тянуть горизонт можно за черту и за её толстый отрезок в промежутке под осью (v1.581).
«А подъём есть? Или только спуск?», затем «да» на предложение кнопки. Это «🔻−1 Строка выше», повторённая до упора. Над строкой встают все её предки, каждый на бит короче, вершина сверху. Подъём останавливается на строке в один бит или на первой строке без родителя: у неё последний бит не сходится, а так у половины всех строк. Вставка идёт со сдвигом и переносом привязок, как вставка спуска вверх. От 1010101 подъём даёт 1, 11, 101, 1111, 10001, 110011: это строки 0–5 Паскаля по модулю 2.
«У каждой строки есть край — можно кнопку, которая переведёт все строки выделенные или все, если нет выделения, в такие». Кнопка в окне «▽ Спуск» и на пульте «Построения». Каждая строка на своём месте заменяется краем своего треугольника спуска, длина та же. Треугольник не строится: бит края k — XOR тех битов строки, где C(k, j) нечётно, а по Лукасу это «j ⊆ k» по двоичным разрядам. Значит, край — подмножественная сумма над GF(2), n·log n вместо n² на строку. Преобразование само себе обратное: второе нажатие возвращает строки. Строки не только из 0 и 1 пропускаются.
«Пусть переходит просто на следующую вниз под собой после XOR». В v1.584 выделялась самая нижняя строка треугольника. Теперь выделена следующая строка под источником, и новое нажатие пойдёт от неё: так можно спускаться шаг за шагом.
«Нужно изменить выделение битов, чтобы побитно выделял не всю строку, а какой треугольник XOR». Раньше «новыми» в цели помечались изменившиеся биты вместе с прежней пометкой строки. У строки, вставленной «⬇ Вставить», пометка была на всю строку, и треугольник в ней терялся. Теперь в каждой строке-цели новыми помечены ровно те биты, на которые лёг этаж, изменились они или нет. Так видна форма треугольника. Прежняя пометка этих строк при этом снимается. То же в построениях «⊕ класть XOR-ом»: там помечен след результата.
«Пусть выделяет нижнюю потом строку одну». Раньше после XOR спуска выделялись все строки, куда лёг треугольник. Теперь выделена одна, самая нижняя из них: следующий шаг обычно идёт от неё.
«Не правильно вставляет XOR, пусть учитывает выравнивание» (окно «▽ Спуск», «⊕ XOR-ом»). Этаж
ложился в строку-цель бит в бит от начала, то есть всегда по левому краю, а цепочка показывает строки
по своему выравниванию. У «↔» этаж короче строки и стоит под ней посередине, а XOR шёл со сдвигом.
Теперь этаж кладётся туда, где он стоял бы на экране, будь он сам строкой на месте цели. Место
считается тем же rowShiftFor/rowHalf2x, что и отрисовка, в полустолбцах.
Если у «½» этаж стоит между битами, берётся левый. Та же ошибка была в режиме построений «⊕ класть
XOR-ом» (v1.549). Расчёт вынесен в одну функцию xorIntoRowAligned, и оба места берут её.
«Выровняй верт положения цепочек и паттернов», внутри строки. Текст ячейки паттерна с v1.395 —
коробка высотой в знаки (ради заливки находок) с vertical-align:middle. Middle ставит
её середину не на середину строки, а на «базовая линия + половина строчной буквы», и знаки сидели
на пиксель-два мимо бит. Шрифт у паттернов и бит один, поэтому общая базовая линия даёт ровно то
же место, что у бит. Заливка осталась по знакам.
«Горизонт не хватается там, потому что выделение строк ему не даёт; сделай там линию толще
посередине и кнопки ещё на 2 ширины раздвинь от центра» и «пусть захватывает, как сейчас, толстые
линии, но показывает тонкую верт». Промежуток под осью в меню 2 теперь шириной в три кнопки. В нём
стоит своя ручка черты, #m2HzGrip: зона 11px, линия 3px, в слое меню 2. Это выше
строк, которые перехватывали нажатие под выделение. Протяжка и двойной клик те же, что у самой
черты. Ось под курсором и при протяжке больше не толстеет и не светится, только становится ярче.
Ручка у неё прежние 13px.
«Потоньше верт ось, и захвата нет горизонта там между кнопками». Линия оси была 1px CSS, а при
масштабе 125% это 1,25 точки, и она размазывалась на две. Теперь толщина 1px / devicePixelRatio,
ровно одна точка при любом масштабе. Хват нулевой строки (v1.441) висел только на
.chain, а меню 2 из неё перенесено в .main-layout. Промежутки между
кнопками ловят группы полосы, и до .chain нажатие не доходило. Тот же обработчик
повешен и на полосу, кнопки и слоты он пропускает.
«Не видно… и ось верт надо с 2 строки показывать вниз только и всё, и пунктирной». Линия v1.578 не появлялась. Меню 2 не пускает выше низ меню 1, и оно сползает ниже черты горизонта. Черта шла над кнопками, а проверка «черта внутри полосы» снимала линию совсем. Теперь полоса рисует линию всегда, на высоте черты, даже если та выше её, и в своём слое: он выше всего, что закрывало черту на ширине полосы. Если раскладка сдвинута по вертикали, линия пунктирная, как сама черта. Ось начинается с кромки строки 2 (горизонт плюс два шага строки), выше её нет. Ручка короче вместе с линией. Линия пунктиром 4/4 px.
«Тут, на 0 строке, убери ось и отобрази горизонт между кнопок». Линию оси маской гасим на высоте
полосы меню 2; выше и ниже ось та же, и тянуть её можно везде, маска меняет только видимое. Черта
горизонта шла по кромке нулевой строки, но её тон на тёмном ряду не различался. Полоса рисует на той
же высоте свою линию тоном оси, под кнопками, так что видна она ровно в промежутках. Обе высоты
считает updateAxisSplitPosition после того, как полоса встала на место.
«Убери вправо от столба с номерами, когда они есть, кнопки эти». «№» П1 с блоком цветов и выравнивания садились сразу за линию П1|Ц, то есть над колонкой номеров строк, и закрывали номера верхних строк. Теперь при показанных номерах «№» встаёт за правый край колонки, блок едет следом. Номера скрыты — место прежнее, у линии.
«Выделение залазит на фон границы Л», у любой строки. Сам жёлтый слой был подрезан на полполосы
ещё в v1.380, но под ним в том же шорткате лежал сплошной цвет поля (v1.400). Он крыл и половину
полосы границы внутри поля. У невыделенной строки под полосой холст (заливка #fieldBgC
кончается на полполосы раньше), у выделенной — цвет поля, и полупрозрачная полоса в этой строке
светлела. Цвет поля тоже стал градиентом с тем же стопом, во всех трёх правилах (наведение,
выделение, наведение на выделенную).
КАК НАШЛИ
Замер элементов в точках поперёк полосы ничего не дал: у всех фон прозрачный, и дело было не в
чужом элементе, а в нижнем слое своего. Увидели глазами, увеличив само полотно
(transform: scale(6) у .chain вокруг точки пересечения): в выделенной строке
левая половина полосы была светлее.
«Также»: светлым прямоугольником проступала не подложка, а тень самой полосы
(box-shadow 0 4px 14px из её первого правила, со времён плашки над холстом). Внешняя тень
ложится вокруг коробки, но не под ней, и прозрачная полоса читалась светлым окном в затемнённом
ряду. Тень снята.
«У меню выравниваний убери фон, пусть прозрачным будет, где нет кнопок». Подложки групп (v1.433) различали группы в сплошном ряду. С v1.563 группы разведены по полосе и видны местом, а подложки проступали полосками в зазорах. Сняты все три, фон остался только у самих кнопок.
Нулевая всё ещё не выделялась. Разбор в консоли пользователя показал: нажатие приходит в строку, а события click нет вовсе. Хват горизонта за всю нулевую строку (v1.441) запускал протяжку прямо на нажатии: гасил событие, а на отпускании перерисовывал строки. Строка, на которой нажали, пропадала из документа до того, как браузер выдаёт click, и Chrome его просто не выдавал. Прямой вызов обработчика клика при этом выделял нулевую, отсюда и путаница в прошлых версиях.
Теперь на нажатии хват только взводится. Протяжка горизонта начинается, когда мышь с зажатой кнопкой ушла по вертикали на 4 px (заодно гасится выделение протяжкой, начатое тем же нажатием). Отпустили без движения — это щелчок, и он выделяет строку.
ПРИЗНАК ЭТОЙ БЕДЫ
mousedown есть, click нет, а прямой вызов обработчика работает: значит, между нажатием и
отпусканием кто-то перерисовал элемент под курсором. Ищи обработчики нажатия в фазе перехвата
(addEventListener(…, true)) и то, что они делают на отпускании.
«Всё так же не выделить 0». С v1.569 нулевая строка в набор попадала, но правило стилей v1.407 («она выделяется визуально фоном — убери») гасило у неё подсветку выделения и наведения, и выбранная строка выглядела невыбранной. Правило закомментировано, вернуть — снять обёртку.
ПОЧЕМУ ЗАНЯЛО ЧЕТЫРЕ ВЕРСИИ
Запрет v1.406 держался в пяти местах двух файлов: клик, протяжка, чистка набора в отрисовке,
подсветка в стилях, плюс зона захвата черты горизонта поверх строки. Снимая по одному, каждый раз
получали «всё так же». Когда снимаешь давнее решение, сначала найди все места, где оно записано:
здесь помог бы поиск по номеру версии v1.406/v1.407 во всех шести файлах.
«Нет номеров»: кнопка переключала 10/01, а колонки не было. Её прятало окно «ℹ Поле», которое сильнее режима кнопки: пока оно включено, номера убраны из полей в любом режиме (v0.972). Кнопка меняла систему счисления невидимых номеров. Теперь первый клик по «№» при спрятанных номерах выключает окно и возвращает колонку с прежней системой счисления, следующие клики переключают как обычно.
Кнопку убрали с экрана в v1.419. Пользователь хватился её и выбрал новое место: меню 2,
первой в левой группе, перед цветами цепочки. Над колонкой номеров ей больше не место, там стоят
«№» П1 и блок цветов П1 (v1.567). Узел перенесён целиком, обработчик висит по id. Два расчёта
из её прежней жизни (ширина под колонку номеров и упор, отодвигавший от неё планку «П1») теперь
срабатывают, только пока кнопка в старой планке #axisStrip. В полосе ширина по подписи, с
постоянным минимумом, чтобы полоса не дёргалась при переключении «10/01/—».
«Какая-то полоса остаётся и не даёт выделить 0 строку», второй раз. Причин было две.
#hsplitTop: 9 px во всю ширину,
серединой на верхней кромке нулевой строки. Нижние пикселы лежали на строке и тянули раскладку
вместо выделения. Зона поднята целиком над строкой, линия внутри неё прижата к нижнему краю, так
что на экране черта стоит там же.Кнопка «№» номеров цепочки не пропала: её убрали по просьбе пользователя в v1.419 («№ Ц вообще кнопку убери»), систему счисления с тех пор переключает двойной клик по колонке номеров. Спрошено, возвращать ли.
v1.567 — «это перемести справа от № П1» и «также для П2». Пара цветов и кнопка выравнивания
каждой колонки уехали из планки у линии в поле цепочки, в свой блок (#patCtrlL/#patCtrlR)
вплотную к «№»: у П1 справа от неё, у П2 слева. У линий остались одни подписи «П»/«Л». Кнопка
ближе к «№», цвета с краю (правило v1.321). Меню 2 упирается в эти блоки, а не в «№».
v1.568 — «эти прижми к выравниваниям»: цвета, замок и «⧉» ушли от левой границы и встали вплотную к кнопкам выравнивания. Сдвиг связки под ось теперь делает левый отступ первой группы, а свободное место забирает одно auto-поле у закреплённых значков.
Папки v1567 в архиве этой машины нет: номер подняли, а копию до следующей
правки положить забыли. Восстанавливать нечем, пропуск оставлен.
«Какая-то полоса там ещё лишняя, не даёт выделить 0 строку». Полоса меню с v1.563 растянута на всё поле Ц и лежит поверх нулевой строки. С v1.564 она прозрачная, но мышь забирала вся её коробка: до строки не доходили ни клик, ни наведение, ни начало протяжки. Коробка теперь проницаема, ловят только группы кнопок.
Сама нулевая строка цепочки по-прежнему не выделяется. Это решение v1.406 («не давай 0 строку выделить»), его не трогал. Ячейка её паттерна выделяется, как и раньше.
Подписи «П»/«Л» набирались шрифтом интерфейса (13 px), соседи «№» и биты — кеглем полотна. Буква читалась мелкой и ниже соседей. Кегль теперь общий, по ширине знак полотна как раз равен полосе границы.
Второй (½) ряд меню 2 выпадал от наведения на всю полосу. С v1.563 она во всю ширину поля, и
ряд вылезал от касания «⧉» или закреплённых значков. Условие теперь — курсор или фокус над
группой выравниваний. Взято в :where(), чтобы специфичность не выросла: иначе показ
перебил бы скрытие после выбора (.half-picked).
«Фон 0 строки также выделяется от остальных»: это была её собственная светлая заливка
#bandBg (v1.384), заведённая, чтобы отделить служебный ряд от цепочки. Теперь ряд
отделяют сами кнопки, заливка прозрачная. Элемент оставлен: по его коробке ловится бросок значков
в нулевую строку.
Серия правок нулевой строки подряд, по снимкам пользователя.
updateAxisSplitPosition, раскладку делают auto-поля (класс m2-wide). Края
упираются не в голую линию, а в «№» у границ: накрывать их полоса не должна.rowZeroCenterTop на всех. «№» получила
рост планки (--strip-h), второй (½) ряд меню — рост первого (--m2-h).ПОЧЕМУ УПОР ШИРИНЫ ПОЛЯ ЧИТАЕТ data-nat-w
minBitsWidthPx запрещал ужимать поле уже полосы меню и брал её ширину из коробки.
Растянутая полоса равна самому полю, и упор запер бы ширину навсегда. Поэтому перед растяжкой
полоса меряется «как есть», и упор берёт это число.
Номер поднят до 1.563, хотя 1.562 ещё не ушла в git: подписи ?v=1562 у
пользователя уже в кэше, и правки в .js без нового номера просто не приехали бы.
Проверено в браузере по слову пользователя.
Жалоба: тянешь границу П1 влево — биты паттернов уходят под неё, хотя должны прижиматься к ней и обрезаться слева. Заодно: низ символов срезан «каким-то фоном», а у первого символа линия среза другая.
Все три беды оказались в стилях (Zerkalius-layers.html), код отрисовки не менялся.
text-align:right. Выжило
только гашение пиксельной поправки. Поэтому паттерны стояли от левого края с отступом на всю
сетку самого длинного и прятались за границей, едва колонка становилась уже этой сетки.text-align:right мало. Строка шире своей коробки вылезает вправо
при любом выравнивании. direction:rtl у ячейки уводит переполнение влево,
direction:ltr у обёртки держит порядок бит. Конец паттерна стоит у границы,
срезается начало. Отступ от полосы границы из v1.446–1.447 не доходил ни разу: его перебивало
обнуление полей с !important. Теперь доходит.clip-path: inset(0 …), которым с v1.198 открыт левый
край П1. Сверху и снизу он держал коробку строки, а она высотой в межстрочный, то есть бывает ниже
кегля. Сверху и снизу область расширена на кегль..pat-txt. Та с
v1.395 центрирована по строке, а он оставался на базовой линии. Получил те же три свойства.ТРЕТИЙ РАЗ ОДНА И ТА ЖЕ ЛОВУШКА
Текст, дописанный после закрывающего маркера комментария, превращается в CSS и молча съедает соседнее правило. Так было с номерами в v0.879, так вышло и здесь. Ошибок в консоли при этом нет: CSS не падает, он пропускает. Дописывая к старому комментарию, вставлять текст ДО его маркера.
Проверено в браузере по слову пользователя: после протяжки границы на 300 px конец паттерна стоит в 13 px от полосы, лишнее срезано слева, первый символ на одной высоте с остальными.
v1.554–1.555 — «🔥 Память»: шагом теперь считается любое изменение цепочки (кнопки-правки номер шага не двигают, а для памяти это тот же шаг), и у накала появился второй смысл — «повторяется»: бит горит тем ярче, чем короче его собственный период. v1.556–1.557 — дубли новых кнопок во вкладке «Новое», и дубли научились повторять меняющуюся на ходу надпись. v1.558–1.559 — «👁 Только эти» удалено целиком по просьбе пользователя. v1.560 — у «▽ Спуска» появились «⬇ Вставить» и «⊕ XOR-ом», с выбором «треугольник / только край» и «вниз / вверх». v1.561 — Сброс возвращает ползунку 🔢 то число строк, что было до встройки.
ПОЧЕМУ НАКАЛ ПОТРЕБОВАЛ ВТОРОГО СМЫСЛА
Пользователь: «память включена, цикл прогнан, а 10101 не разгорелась». Память считала верно: под Кругом 10101 → 01010 → 10101, и каждый бит меняется каждый шаг, так что счёт «держит значение» честно стоит на нуле. Но смотрят-то на другое: строка возвращается к себе за два шага, память у неё предельная — просто это не замер, а ритм. Поэтому режима два, и переключаются они одной кнопкой. Период ищется по последним шестнадцати видам строки, и нужно хотя бы два совпадения подряд: одно могло быть случайным.
УРОК ОБ УДАЛЕНИИ КУСКА РАЗМЕТКИ
Удаляя ряд «👁», я захватил лишний </div>. Разметка дальше уехала внутрь
блока «Вид», панели #leftPanel/#rightPanel пропали, и страница
нарисовала одну верхнюю полосу, упав с Cannot read properties of null. Это ровно то
правило, что записано в своде: после вырезания перечитывать ОБЕ границы. Проверять удобно счётом
тегов: у рабочих версий открывающих <div 203, закрывающих 204 — соотношение
постоянное, и любое расхождение видно сразу.
v1.549 — переключатель у построений: «⬇ вставлять новой строкой» (как было) или «⊕ класть XOR-ом в строку ниже» — запрос: «построение делать прямо на строках, кладя в биты (XOR) или между имеющихся». v1.553 — зеркальная пара кнопок: «🔻−1 Строка выше» (обратный шаг Паскаля) и «🔢−1 Пред. номер»; у обратного Паскаля последний бит служит проверкой: не сошёлся — родителя у строки нет вовсе, и так у половины всех строк. v1.550–1.552 — починка подсветки неподвижных бит.
ПОЧЕМУ ПАЛИНДРОМЫ «НЕ РАЗГОРАЛИСЬ» — ДВЕ ПРИЧИНЫ СРАЗУ
Пользователь принёс: «1000 горит, а 10101 нет». Первая причина — та же, что была у «🔥 Памяти» в v1.536: подсветка стояла в общей ветке раскраски НИЖЕ служебных пометок «новый / изменён / вставлен», а только что построенная строка помечена новой целиком. Поднята выше (v1.550).
Вторая — набор строк: подсветка красила только ВЫДЕЛЕННЫЕ, унаследовав это правило у кнопки «⇄ Реверс». Той набор нужен — она делает разворот; здесь же чистый показ, и привязка к выделению только врала. Теперь красит всю цепочку (v1.551). Чтобы такие случаи больше не разбирать вслепую, кнопка при включении сама печатает счёт: сколько неподвижных бит в каждой строке (v1.552) — по нему сразу видно, где расходятся счёт и цвет.
Zazerkalius: v0.002 — строки из текстового файла (📂, перетаскиванием на страницу, вставкой нескольких строк в поле) и 💾 обратно в файл; v0.003 — в подсказке про счёт зёрен развели T и N («T — это N?» — нет: T — длина зерна, N — длина нужной строки); v0.004 — «⇅ Вокруг текущей» (зеркало проходит через строку, соседи меняются парами) и окно «🔎 Орбита»: где в столбике текущая строка и её отражения — целиком и кусками. Layers v1.548 — вкладка «🪞» с тем же зеркальным крестом и указателями симметрии для выделенной строки.
ПОЧЕМУ И В LAYERS
Пользователь: «в Layers тоже не помешает — там функционал обширнее». Зазеркалиус — чистое окно на симметрию, Layers — мастерская, где строки строят, режут и гоняют. Крест и указатели нужны в обоих местах: в мастерской — чтобы видеть симметрию прямо на том, над чем работаешь. Код креста в Layers свой, короткий, на Манакере самого Layers: подключать zz-core.js туда нельзя — имена его функций GF(2) совпадают с теми, что уже есть в fold-4-tools.js.
Решение пользователя: «легче будет по новой создать для истинного Зеркалиуса интерфейс весь»;
«истинный — Зазеркалиус — окно на ту сторону зазеркалья». Главное — симметрия, «в первую очередь
недавние» инструменты и указатели, и «все подсказки — чтобы не потерялись, а применились в новом».
Новая страница zazerkalius/Zerkalius-zazerkalius.html, ссылка — первой в лаборатории хаба.
Слева столбик строк (🔺+1, 🔢+1, 🎲, ⇅); в центре — зеркальный крест: вертикальная черта —
разворот ⇄, горизонтальная — инверсия 🔁, в четырёх четвертях вся орбита V₄, золотом неподвижные
биты; под крестом — указатели симметрии: скобки под каждым палиндромом и антипалиндромом,
черта скобки — сама ось. Окна-инструменты: ▽ Спуск, 🔁 Цикл и память (μ, λ, 🔥 накал), 🧮 GF(2),
🧮 Лин. сложность, 🧬 Лента (оси через стык строк и ядро децимации), 📖 Подсказки. Окна тащатся
за шапку, тянутся за угол, у каждого «?» с подсказкой.
ПОЧЕМУ С НУЛЯ, А НЕ ЕЩЁ ОДНОЙ ВКЛАДКОЙ В LAYERS
В Layers 42 тысячи строк и 282 кнопки, и каждая правка интерфейса (ползунок, ось, размеры окон)
стала борьбой с наслоениями, а не работой над идеей. Математика же там хорошая и проверенная —
её вынули в zz-core.js один в один, без интерфейса: там нет ни DOM, ни состояния
страницы. Layers не тронут и работает как работал.
Подсказки не пересказаны заново, а перенесены: тексты «?» у окон — из подсказок кнопок Layers и записей этого журнала (почему спуск — зеркало, а не сжатие; GF(2); Колмогоров; «ударение»; 🔺+1 против ▽). Потеряться им теперь негде: они живут рядом с тем, что объясняют.
«Режется высота показа окон и ширина, и никак не увеличить руками». За угол тянулся только «Лог
находок», остальным ширину держал !important. Теперь уголок есть у каждой плавающей панели
и у каждой выпадающей вкладки, вниз — до края экрана. В доке ручной размер гасится: там панель, как и
раньше, по ширине дока. Окно «▽» лишилось своего потолка в 60% экрана — размер ему задаёт само окно.
v1.545: ось цепочки — 1 px вместо 2 и вдвое прозрачнее («потоньше и потуше, слишком выделяется»); при наведении и перетаскивании — прежняя яркая. v1.546: в «🧾 Черновике шага» треугольник спуска было не разглядеть — у него теперь своя вкладка «▽» в строке меню: за ⋮⋮ уносится на поле, галкой закрепляется. Цифры — шрифтом, кеглем и разрядкой полотна (те же 0 с точкой внутри), шрифт полотна дан и битам в черновике. Выравнивание у окна СВОЁ — по центру, влево, вправо.
ПОЧЕМУ ВЫРАВНИВАНИЕ НЕ ОТ ЦЕПОЧКИ
Сначала окно брало выравнивание цепочки; пользователь остановил: «выравнивание надо разное, отдельное». У треугольника своя геометрия: по центру каждый бит XOR стоит ровно под своей парой, влево — край выстраивается столбиком и читается сверху вниз. Цепочке нужно одно, спуску другое, и связывать их значило бы переключать одно ради другого.
Уточнение пользователя: ползунок и был про то, чтобы прятать хвост цепочки вместе с паттернами; сломался он оттого, что раньше строк выше нулевой и вписанных построений не бывало, «а они, даже вписанные, должны быть как родные и считаться». Предел ползунка брался из длины ШАБЛОНА и дальше не менялся: цепочку достроили кнопками — строк стало больше, а ползунок стоял на старом числе.
ПОЧЕМУ СВЕРКА В КАЖДОМ render()
Строки добавляются десятком разных путей (🔺+1, 🔢+1, вставки, склейки, перенос), и сторожить каждый — значит однажды забыть очередной. Поэтому ползунок сверяется с цепочкой при каждой отрисовке: значение — сколько строк видно от нулевой вниз, предел — видно плюс спрятано, но не меньше шаблона. Откуда строка взялась, неважно. Построения над нулевой он, как и раньше, не режет.
Запрос: «хотел скрыть строки, оставить только 10–15, а это не работает». Не работал ползунок 🔢 во «Виде», и он не про это: он берёт ПЕРВЫЕ N строк шаблона и режет хвост снизу. Середину им не вырезать, а на цепочке, построенной кнопками, его предел — длина шаблона. Теперь во «Виде», под шрифтом, два поля «с» и «по» и кнопка «Только эти». Номера — как в колонке номеров, Enter тоже показывает.
ПОЧЕМУ ТОЛЬКО ПОКАЗ И ПОЧЕМУ НУЛЕВАЯ СТРОКА ОСТАЁТСЯ
Строки не вырезаются из данных: флаги сдвигов и инверсий привязаны к НОМЕРУ строки, и вырезка сверху сдвинула бы их на чужие строки. Спрятанная строка просто не попадает на экран. Нулевая строка и строка горизонта видны всегда: на первой стоит меню 2, перед второй — черта. В кэш выбор не пишется: после перезагрузки видна вся цепочка, чтобы спрятанное не приняли за потерянное.
Запрос: «скопировать в дополнительную вкладку все кнопки, которые понадобятся и которые сделаны в текущей сессии». За два дня их набралось больше десятка, и разбрелись они по «Построениям», «Строкам» и «Выделить». Теперь они собраны на вкладке «Новое» в строке меню: 🔺+1, 🔢+1, ▽ Спуск, ⇄🔎 Неподвижные, 🔁 Инв меняющихся, 🔥 Память по циклу, ⇅ Зеркало по горизонту, 🧮 GF(2) с выбором шага и t, ⤓ Вписать, 🧮 Лин. сложность, 🪞 Оси сквозной с выбором обхода, 🧬 Ядро децимации. На старых местах всё осталось.
ПОЧЕМУ ДУБЛИ-ПУЛЬТЫ, А НЕ КОПИИ
Настоящая копия кнопки — это второй обработчик. Правку внесут в один, про второй забудут, и две кнопки с одной надписью начнут делать разное. Поэтому кнопка на вкладке своего кода не имеет: клик по ней нажимает оригинал. Надпись и подсказку она при запуске берёт у оригинала, и когда тот «включён» (🔥, ⇄🔎), подсвечивается вместе с ним. Списки и поле t держат то же значение, что оригиналы, в обе стороны. Ссылки на оригиналы запоминаются заранее: «🗗 Панели в окно» уносит панели в другое окно живыми, и поиск по id в момент клика их бы уже не нашёл.
СПИСОК «ОСТАЛОСЬ» ПО LAYERS ЗАКРЫТ ЦЕЛИКОМ (v1.531–1.535)
Все шесть пунктов сделаны. Сделаны БЕЗ проверки пользователем — он попросил пройти их подряд и проверить потом. Что проверить в первую очередь:
21.09 Claude прогнал проверку сам — разовое исключение по слову пользователя (на сайте, v1.535; правило «тестирует пользователь» остаётся в силе). Консоль пустая, все функции на месте.
1. 🔥 Память — счёт ВЕРЕН (Круг Инв, три шага: неподвижные позиции набрали 1, перерисовка
без шага счёт не двигает), но накал НЕ ВЫХОДИЛ НА ЭКРАН: служебная пометка «изменён» стояла в
отрисовке выше и перехватывала бит. Исправлено в v1.536 — накал теперь важнее служебных пометок.
Само исправление вживую не проверено: встроенный браузер не открывает локальные файлы.
2. Детектор цикла — счёт ПРОВЕРЕН: Круг λ=6, Круг Инв λ=12 (вдвое), вход μ=3 + петля
λ=4 на пробной цепочке; Брент с выключенной таблицей даёт то же. Живым «▶ Авто» не гонялся —
остаётся: нет ли ложной остановки (если в ключ состояния не попало поле, от
которого зависит шаг, прогон остановится раньше времени — тогда добавить поле в
cycleStateKey). И не замедлился ли прогон на большой цепочке: ключ — вся цепочка на
каждый шаг.
3. ⇅ Зеркало — блок без горизонта ПРОВЕРЕН (переставил, повторный клик вернул как было);
с поднятым горизонтом — не гонялся.
4. 🧬 Ядро — ПРОВЕРЕНО в v1.536: Туэ–Морс замыкается на одном классе при k = 2 и 4,
случайная лента растёт. Серпинский, склеенный из строк, растёт тоже — и это верно: склейка строк
растущей длины автоматной не является (прежняя подсказка у кнопки ошибалась, исправлена).
5. 🧮 GF(2) — ПРОВЕРЕНО: все четыре Круга совпали с настоящими rotateStr… бит в бит;
период Круга Инв 2n, палиндромов длины 5 — 8, у Правила 90 единственное решение — ноль.
6. Оси сквозной — обходы ПРОВЕРЕНЫ (карты ячеек разные; на Серпинском карта одна и та
же — его строки палиндромы, так и должно быть); порог ленты 8256 бит — 27.
7. Нулевая строка — откуда в ней брались биты, так и не найдено (сторож v1.529 лечит
последствие).
Знак Zerkalius в объёме: пирамида и её зеркало под общим основанием. Верхняя половина несёт картину бит, нижняя — ту же самую, отражённую и инвертированную. Подробности устройства — в методичке внутри самой страницы (кнопка 📖 Методичка или клавиша H).
Канвас без единой библиотеки. Восемь граней, обход вершин выправляется по факту (нормаль выпуклого тела обязана смотреть туда же, куда её собственный центр) — поэтому отсечение невидимых граней работает без исключений. Биты лежат рядами, параллельными экватору, в барицентрических долях со сдвигом на полшага, чтобы не садиться на рёбра. Настройки: плотность, размер цифр, скорость; всё в памяти браузера.
Три действия: ⇄ разворот, ⇅ инв-разв, ↻ Круг Инв. keep считает, сколько шагов
подряд бит не менял значения.
ПОЧЕМУ ПО ЗНАЧЕНИЮ, А НЕ ПО «ПАЛИНДРОМНОСТИ МЕСТА»
Палиндромность — верный ответ ровно для одного разворота. Возьмёшь другое действие, и правило станет другим, а вопрос тем же. Сравнение «до и после» верно для любого, поэтому все три кнопки пользуются одной памятью.
Место, которое дрогнуло, гаснет почти до фона (на тёмном полотне гаснуть честнее, чем чернеть); место, которое стоит, разгорается и краснеет. Через несколько тактов светится один скелет — это симметрия ряда, ставшая видимой.
Важное про чистый реверс: он сам себе обратен, два шага возвращают ряд. Память насыщается за пару тактов и дальше стоит — это не поломка, это ответ. Чтобы память рисовала, а не замирала, и заведён ↻ Круг Инв: период 2n, каждый такт задевает другие места.
Тело крутят протяжкой мыши, а протяжка для браузера — ещё и выделение текста: подписи кнопок и заголовок закрашивались синим. Запрет на всю страницу разом: это прибор, а не документ. Заодно убрана синяя вспышка по тапу на сенсорном экране.
Стрелки ◄ ► у каждого ползунка: шаг берётся из атрибута step самого поля,
поэтому новый ползунок достаточно разметить — код трогать не нужно. Значение рассылается событием
input, иначе ползунок двигался бы, а дело за ним не делалось. Удержание: первый шаг
сразу, пауза 380 мс, потом повтор каждые 70 мс.
Узкий экран: панель переезжает вниз отдельным листом со своей прокруткой (раньше она не влезала
по высоте, а overflow:hidden у body не давал доскроллить — нижние настройки были
недостижимы). Кнопка ⚙ прячет её. Щипок двумя пальцами вместо колеса. Плотность пикселей
ограничена двойкой: на телефонах она бывает 3 и выше.
Пару не пришлось заводить — она уже была. Бит верхней грани и бит нижней с тем же номером вокруг оси и теми же координатами стоят в зеркальных точках и всегда противоположны по значению. Тронешь один — второй меняется в тот же миг, и не потому, что между ними что-то передалось, а потому, что они с самого начала одно целое, просто увиденное с двух сторон зеркала.
Наведение на цифру зажигает двойника и тянет нить. Кнопка 🔗 Нити показывает занавес целиком, ползунок прореживает (при 26 рядах пар больше тысячи). Нить всегда отвесная: у двойников общие две координаты из трёх, а третья противоположна.
Поиск под курсором идёт по списку, который собирает сама отрисовка, — в нём только то, что реально нарисовано.
Пробел — вращение, Enter — цикл, ◄ ► — шаг назад и вперёд, ▲ ▼ — такт, 1 2 3 — действие, D·L·F·R·T — кнопки. Буквы работают и в русской раскладке.
Шаг назад: разворот и инв-разв сами себе обратны, а Круг Инв вправо обращается Кругом Инв влево. Счётчик шагов убывает (он показывает, на сколько картина ушла от исходной), а память — нет: она про то, что бит выдержал сделанный шаг, и шаг назад такой же сделанный шаг.
Тогда же вскрылось: раскраска памяти включалась по счётчику шагов и, пройдя вперёд и вернувшись к нулю, погасла бы при набранной памяти. Завёл ей отдельный флаг.
Кнопка 📖 Методичка (H или F1) открывает лист со всем описанием: устройство, управление, настройки, память, связи. Не отдельный файл: справка, живущая рядом с прибором, расходится с ним на второй же правке, а живущая внутри правится тем же движением.
Пока лист открыт, прочие клавиши не работают — иначе Enter, нажатый ради прокрутки, втихую запускал бы цикл за спиной у читающего. Внутри методички выделение текста разрешено (единственное место на странице): отсюда его копируют.
В методичку добавлен раздел «Где искать остальное» со ссылкой на этот журнал: из прибора можно уйти читать, не разыскивая файл.
Тогда же все пять новых файлов (октаэдр, журнал, три SVG) переехали из
Binary-Drum-Machine\ в Binary-Drum-Machine\oktaedr\ — в корне репозитория
они терялись среди рабочих HTML. Ссылка методички на журнал относительная, файлы переехали вместе,
поэтому чинить её не пришлось.
Версия 0.007 отдельно в архив не попала: 0.008 последовала сразу за ней. В нумерации
archive\Zerkalius-oktaedr\ дырка на 007 — оставлена намеренно, по решению пользователя.
Ползунок «Свечение бит», 0–20. Ореол берёт собственный цвет цифры, поэтому красные биты памяти светятся красным, а не голубым: накал и подсветка остаются одним сообщением, а не двумя.
Радиус убывает с расстоянием — тем же делением перспективы, что и кегль. Без этого дальние цифры светились бы как ближние, и объём спереди назад сплющивался бы.
ПОЧЕМУ ПОГАСШИЕ ПАМЯТЬЮ НЕ СВЕТЯТСЯ
По смыслу — они ушли в фон, светиться им нечем. И по делу: тень в холсте считается на каждую букву отдельно и на большой плотности стоит дороже всего остального вместе взятого. Отключить её там, где она не нужна, дешевле, чем нарисовать. Ноль на ползунке — самый быстрый режим.
Наведение держится ровно пока мышь на месте — отвёл, и пара погасла, а тело ещё и само крутится. Клик по цифре оставляет пару гореть своим цветом (сиреневым): можно набрать несколько, отпустить мышь и смотреть, как они ходят при вращении и что с ними делает шаг. Повторный клик по той же цифре снимает её, ✕ Снять или Esc — все разом; на кнопке видно, сколько набрано.
КАК ОТЛИЧАЕТСЯ КЛИК ОТ ПОВОРОТА
Одна и та же кнопка мыши и крутит тело, и закрепляет бит, поэтому решает не нажатие, а то, сдвинулась ли рука: ушли дальше четырёх пикселей — поворот, остались на месте — клик. Порог нужен и для мыши, и особенно для пальца.
Ключ закрепления — строка «слот:ряд:место», а не объект: набор проверяется на КАЖДУЮ цифру каждого кадра, и сравнение строк тут дешевле любого обхода.
Порядок яркости: закреплённый перебивает память, наведение перебивает закреплённый. То, на что показывают сейчас, всегда главнее отложенного про запас.
Смена плотности бит снимает закрепления: мест становится другое число, и старые указывали бы в пустоту.
Баг-репорт: «одна синяя грань не видна, а яркая — как типа видна».
ПРИЧИНА ОКАЗАЛАСЬ В РАССОГЛАСОВАНИИ
Рёбра рисуются полной яркостью всегда — это силуэт, ему положено. А заливка грани стояла на
глухих 0.07, и яркость цифр падала ПРЯМО пропорционально наклону. Грань, повёрнутая
почти ребром, получала цифры на 23% прозрачности, то есть никакие, — и выходила пустым ярким
контуром. Снаружи это читается как «лицевая грань, на которой ничего нет».
Теперь наклон грани (facing) считается ОДИН раз и им пользуются все трое: заливка
идёт по наклону, а яркость цифр — через корень. Корень поднимает край шкалы, не трогая
середину: та же грань получает уже 43% вместо 23%, и пустых контуров не остаётся.
☯ Дзен — прячет всё, кроме тела: панель, заголовок, версию, подсказку, шестерёнку. Вход и выход: кнопка, клавиша Z, щелчок колесом мыши (тот же жест, что на остальных машинах Зеркалиуса), а из Дзена ещё и Escape. Не сохраняется намеренно: открыть страницу и увидеть голое тело без единой кнопки — плохой способ начать.
⏺ Запись видео — подключён общий recorder.js, а не написан свой. Пишется
только холст, панели в кадр не попадают, куски ложатся на диск по ходу дела.
ДВА СТОЛКНОВЕНИЯ, КОТОРЫЕ ПРИШЛОСЬ РАЗВЕСТИ
Клавиша R. Её занимал общий модуль записи — на ВСЕХ машинах. Ломать общий уговор ради одной страницы неправильно, поэтому отступила страница: «новая картина» переехала на N.
Средняя кнопка мыши. Один щелчок делал три дела разом: входил в Дзен, начинал поворот и,
раз рука не сдвинулась, на отпускании закреплял подвернувшийся бит. Теперь крутит и закрепляет
только основная кнопка (e.button !== 0 → return); у пальца и пера button тоже 0, так
что касаний это не трогает.
Shift+клик по цифре переворачивает бит. Меняется ОДНО число в картине, а на экране переворачиваются ДВА: двойник меняется сам, потому что он не копия, а то же самое число, прочитанное с другой стороны зеркала. Память этого места обнуляется — она считает шаги, а ручная правка шагом не является, и засчитывать её как «бит устоял» было бы враньём.
Обычный клик по-прежнему закрепляет пару. Shift выбран вместо двойного клика: двойной пришлось бы отличать от двух одиночных по времени, и первый успевал бы закрепить пару прежде, чем станет ясно, что клика два.
РЁБРА ГАСНУТ ВМЕСТЕ СО СВОЕЙ ГРАНЬЮ
Прежде ребро рисовалось в полную силу, если хоть одна его грань лицевая. Но отвернувшаяся грань не рисует ни заливки, ни цифр — и оставалась пустым ярким треугольником, обведённым рёбрами соседей. Снаружи это читается как «грань горит, а на ней ничего нет».
Теперь ребро берёт яркость от самой развёрнутой из своих лицевых граней и гаснет вместе с ней. Нижний порог оставлен: силуэт тела обязан читаться всегда, иначе на скользящих ракурсах октаэдр расплылся бы в туман.
Это ВТОРАЯ попытка по тому же баг-репорту. Первая (v0.011) поднимала яркость цифр через корень — и была не о том: на снимке пустой треугольник широкий, а грань, стоящая почти ребром, выглядела бы узкой полоской. Причина оказалась не в затухании, а в том, что яркость рёбер вообще не зависела от наклона.
Кнопка ◎ Наведение (клавиша V), по умолчанию ВЫКЛЮЧЕНА. Пока она не нажата, движение мыши над телом ничего не подсвечивает.
ЗАЧЕМ ВЫКЛЮЧАТЕЛЬ
Пара загоралась от ЛЮБОГО движения мыши над телом — в том числе когда её просто ведут мимо или уже отпустили после поворота. На плотной картине это сплошное мельтешение, и главное — оно случается тогда, когда его не просили. Кнопка возвращает подсветке смысл события.
На клик это не влияет: и закрепление пары, и Shift+правка бита работают всегда. Клик — всегда намеренный, в отличие от проезда мышью.
Заодно уходит и лишняя работа: перебор шёл по КАЖДОЙ нарисованной цифре на каждое движение мыши — самая частая работа страницы. Теперь при выключенной кнопке его нет вовсе.
Баг-репорт: «рёбра, которые внутри, всё ещё светятся как видимые».
ПОЧЕМУ ЯРКОСТИ БЫЛО МАЛО
Тело полупрозрачное — в том и смысл, иначе не разглядеть нити между двойниками. Значит рёбра дальней стороны просвечивают насквозь и оказываются НА картинке рядом с ближними. Отличать их одной приглушённостью не выходит: на тёмном фоне и четверть яркости читается как светящаяся линия, а глазу приходится сравнивать две яркости вместо того, чтобы просто видеть.
Пунктир снимает вопрос и снимает давно: в черчении штриховая линия — невидимый контур, сплошная — видимый. Сравнивать нечего, достаточно формы. Заодно яркость опущена до 0.16.
Кнопка △ Скрытые рёбра на месте: их по-прежнему можно убрать совсем.
Третья попытка по тому же баг-репорту, и, похоже, настоящая причина.
ЯРЧЕ ОТ НАЛОЖЕНИЯ, А НЕ ОТ ЯРКОСТИ
Кегль цифры считается от РАССТОЯНИЯ, а не от наклона грани. На косой грани буквы остаются прежнего размера, а места под них становится в разы меньше — они наезжают друг на друга десятками. Полупрозрачные, они при этом складываются: двадцать цифр по 40% дают сплошную заливку. Узкая полоса выходит ЯРЧЕ нормальной грани, хотя прочесть там нечего.
Вот почему две прошлые попытки не помогли: я крутил общую яркость (v0.011 поднял её цифрам, v0.012 увязал с наклоном рёбра), а дело было не в ней. Против наложения яркость бессильна — чем её меньше, тем больше цифр нужно, чтобы полоса всё равно набралась до сплошной.
Теперь грань с наклоном ниже 0.11 не рисует цифр совсем, а на подходе к порогу гаснет плавно, до нуля, так что перехода не видно. Рёбра остаются: силуэт обязан читаться всегда.
Хвост того же разбора: биты спрятались как надо, а полоса осталась. Полосой оказалась линия экватора.
Она нарочно самая заметная — это линия зеркала, — но заметность была глухая: ширина 2.6 и свечение 14 держались при любом повороте. На скользящем ракурсе такая линия ложится поперёк грани жирной светящейся полосой, шире и ярче всего, что рядом, и тянет взгляд на себя, хотя показывать ей в этот момент нечего.
Теперь и толщина, и ореол идут по наклону: смотрит на нас — во всю силу, встал ребром — обычная тонкая линия. Цвет не трогали: экватор остаётся белым и узнаётся по цвету, а не по жирности.
Три правки подряд об одном и том же, и каждая снимала свой слой: v0.015 — наложение цифр, v0.016 — постоянную толщину экватора. Общее у них то, что «слишком ярко» почти никогда не лечится яркостью.
И вот, кажется, корень всей этой истории с полосой.
СТАРАЯ ПРОВЕРКА ГОДИЛАСЬ ДЛЯ КАМЕРЫ В БЕСКОНЕЧНОСТИ
Лицевая грань определялась одним сравнением: n[2] > 0 — нормаль смотрит в
сторону зрителя по оси Z. Это верно, когда камера удалена БЕСКОНЕЧНО и все лучи взгляда
параллельны. У нас же перспектива, и камера стоит в четырёх радиусах от тела: лучи расходятся
веером, и у краёв силуэта ось взгляда и направление НА ГЛАЗ заметно расходятся.
Грань могла смотреть «вперёд» по оси и при этом быть отвёрнутой от самого глаза. По старой проверке она числилась лицевой — и её рёбра рисовались сплошными и яркими внутри тела, где им взяться неоткуда. Отсюда и белые линии, которые «светятся как видимые».
Теперь берём вектор от середины грани к глазу и сравниваем с нормалью. Из того же произведения выходит и наклон, которым пользуются заливка, цифры, свечение и яркость рёбер — то есть все прежние правки начинают работать от ВЕРНОГО числа.
Три предыдущие попытки лечили следствия и потому помогали лишь отчасти: они подкручивали яркость того, что вообще не должно было рисоваться.
Три версии, всё векторное и правится текстом:
zerkalius-logo.svg — главная. Октаэдр в палитре приложения; цифры нижней половины
инвертированы относительно верхней, то есть знак буквально показывает «инв-разв». Строки цифр
наклонены skewY(26.565°) — это atan(0.5), наклон изометрического
ребра, — поэтому лежат НА грани, а не поверх неё.zerkalius-mark.svg — 64×64, без цифр: ромб с перекладиной. На 16 пикселях цифры
не выживают, а излом и два цвета читаются. Это favicon и иконка вкладки.zerkalius-logo-green.svg — прежняя зелень, но уже с отражением.ОСТАЛОСЬ
Надпись в SVG набрана системным шрифтом (Segoe UI / Inter). Для публикации его надо перевести в кривые или подключить файлом, иначе на чужой машине начертание съедет.
Генератор всех трёх — mklogo.py, лежал во временной папке. Если понадобится
править пропорции — попросить положить его рядом.
Пользователь сообщил: при нажатии «Зазеркалиус» на мобильном хаб виснет; затем попросил убрать фоновую сетку. Хаб перехватывал ссылку, ждал 650 мс полёта кнопки и сразу загружал скрытый экземпляр всего Zazerkalius для нот. Теперь на сенсорном устройстве и при «меньше движения» ссылка открывается обычным переходом сразу. Скрытый звуковой движок загружается только при первой звуковой команде; команды ждут сообщения о готовности, поэтому первое нажатие не теряется. Ромбосетка удалена со страницы и из кадра видеозаписи; треугольник Серпинского и ноты сохранены.
Проверено в браузерной эмуляции 390 × 844 и 844 × 390 с касаниями и четырёхкратным замедлением процессора: открытие Zazerkalius, отзывчивость его панели, возврат в хаб; до запуска ноты у скрытого iframe нет адреса загрузки. Первое включение звука по-прежнему требует загрузки движка.
Пользователь заметил: при выключенной верхней «?» некоторые подсказки всё равно появляются. Прежний переключатель убирал только уже существующие атрибуты title; перерисовка кнопок и наведение на номер строки создавали их снова. У панели «Алгоритм» был отдельный обработчик наведения, у SVG — свои элементы title. Теперь выключенный режим отслеживает новые и обновлённые подсказки, сохраняет их текст без браузерного атрибута и гасит подсказку алгоритма. Внутренний код продолжает читать и обновлять .title, поэтому при включении возвращается актуальный текст. Подсказки вынесенных окон подчиняются тому же переключателю. При включённых подсказках наблюдатель отключён.
Проверено в браузере: выключено — ноль атрибутов title и пустые SVG-подсказки; добавление и обновление HTML/SVG, наведение на строку и кнопку конуса не возвращают подсказок. Повторное включение восстанавливает обновлённый текст. Регрессионные проверки панелей — 20 из 20.
Пользователь попросил: первое кольцо в магнитном автокручении и кнопках шага не должно прилипать к осям холста — это нужно только при вращении рукой. Из поиска следующего магнита исключены вертикаль и горизонталь холста, в том числе для одного бита без лазера. Границы и оси симметрии соседних колец остаются целями по выбранным настройкам. Ручная защёлка к осям сохранена. При отсутствии подходящего соседа шаг не совершается, автокручение останавливается.
По снимку группы «☀ · ☾» пользователь уточнил: вся группа должна скрываться за кольцами. Её особый слой был выше рисунка колец; теперь поднятые группы «Вид», «Щели» и «☀ · ☾» ниже рисунка, поэтому кнопки, фон и зубчатая рамка перекрываются вместе.
Проверено в браузере: шаг вперёд и автокручение из 32° идут к границе соседа на 210°, минуя оси холста; обратный шаг из 2° — к −150°. Между автоматическими скачками кольцо стоит. У раскрытой «☀ · ☾» кольца закрывают фон и кнопки; закрытая кнопка не получает щелчок, видимая получает. Ошибок консоли нет. Проверки геометрии и панелей: 59 из 59.
Пользователь попросил сделать автоподстройку скоростей шариков для всех режимов колец, а не только для «симм.» с T−1. Причина: сквозной проход искал одну постоянную скорость на весь путь. Она обязана совпасть сразу на двух стыках (К2 → К1 и К1 → К2 через центр). При одной скорости второй стык полностью задан первым: выход идёт на грань под углом 3a − 2φ + π от начала. Подходящая грань на К2 есть лишь при удачном положении колец, а в T−1, «между» и 2n — почти никогда.
Теперь кнопка «⚙ подстройка» в группе «Шарики» по умолчанию включена. Каждый прямой отрезок до следующего стыка шарик проходит со своей постоянной скоростью: ближайшей к заданной, не быстрее 4×. Время прихода считается точно, по разности скоростей вращения двух колец (planSegment в zz-ball.js). Путь через центр — один отрезок до внешнего стыка К1 по противоположной грани. Это работает и на К3 и дальше. Если совпадения нет (кольца крутятся одинаково), шарик ждёт, а не разворачивается. «↦ сквозной», «⇄ 2», «↦ 3/4» и «∞» сначала ищут общую постоянную скорость, как раньше, а если её нет — запускаются с подстройкой. Без пары противоположных внешних граней (T−1, «между») группа берёт сколько есть граней. Выключенная «⚙» возвращает прежнее поведение: одна скорость, при несовпадении — разворот.
Проверено тестом tests/ball-auto.test.cjs: 4 режима колец × ◐/✚ у строки 1 × 3 режима кручения × 3 положения × 2 и 3 кольца × все старты × 2 шага кадра — 3456 прогонов, все выходят, разворотов 0. Петли ∞ в T−1 и «между» идут без разворотов. Прежние тесты шариков проходят.
Пользователь поправил: в режимах «1 щель» и «все» вырезов нет, но щели — такие же прямые, как грани, и магнит по ним работает. Шарики там не включались вовсе. snapshot() в zz-ball.js пропускал только вырезы с полукольцом или ✚ у строки 1 и ровно два бита во втором кольце. Теперь кольца без вырезов тоже годятся. Грани берутся те же, что у магнита (coneRingFeat / coneFeatEdges): границы битов колец строк и ячеек кольца за чертой. У строки 1 из одного бита — её разрез и прямая напротив через центр (как черта и пунктир coneR1Cut). По ней шарик проходит центр. Условие «ровно два бита у К2» снято. Автоподстройка скоростей v0.1025 работает здесь так же.
Проверено: tests/ball-auto.test.cjs дополнен этим режимом и строкой 1 со щелью — 6300 прогонов, все выходят, разворотов 0. Прежние тесты шариков проходят. В браузере в «1 щель» и «все» шарики включаются, «↦ сквозной» запускается.
Пользователь попросил: в режиме магнита по граням скорость задавать как шаги к грани в секунду. Раньше ползунок и там показывал °/с, а пауза после скачка была «угол скачка / скорость» (не меньше 0,16 с). Короткий скачок шёл почти сразу, длинный ждал долго, и темп от ползунка не читался. Теперь при «🧲 по магнитам» ползунок задаёт свою скорость Z.coneMagSp: 0,1…30 шагов в секунду, по логарифму, по умолчанию 2. Подпись — «N шаг/с», и у ползунка рядом с ▶ тоже. Пауза между скачками — ровно 1 / скорость. Обычная скорость кручения (°/с, бит/с) хранится отдельно и при выходе из режима магнитов возвращается как была. Направление по-прежнему задаёт ↻ / ↺. «⌖✕ сброс» и «Положения» сохраняют обе скорости.
Проверено в браузере: при включении магнитов — «2 шаг/с», края ползунка — 0,1 и 30 шаг/с, после выключения — прежние «3 бит/с» на том же месте ползунка.
Пользователь попросил убрать ручное задание скоростей шариков и оставить только автоподстройку. Из группы «Шарики» убраны поле «Скорость ×», одиннадцать кнопок дробей (¼ … 32) и переключатель «⚙ подстройка». Подстройка включена всегда (Z.coneBallAuto ставится при запуске страницы). Базовая скорость — всегда 1×, диаметр за T₀. Сохранённый прежде множитель (например 1/4) при загрузке сбрасывается на 1. «↦ сквозной», «⇄ 2», «↦ 3/4» сами передают найденную скорость, а без общей скорости едут с подстройкой. Подсказка группы переписана под новый порядок.
Проверено: тесты шариков проходят (6300 прогонов автоподстройки, разворотов 0), в браузере панель собирается без строки скорости и без ⚙.
Пользователь спросил, почему сам собой включается луч лазера — не от шариков ли. От них. «↦ сквозной», «⇄ 2», «↦ 3/4» и «∞» перед запуском гасили солнце щелчком по «☀». Солнце работает только вместе с «⌖ луч-часы» и при включении ставит их само. Выключение солнца по правилу v0.208 возвращает к лазеру: луч-часы остаются гореть, и появлялся луч. Теперь вместе с солнцем гаснут и луч-часы. Кроме того, шарикам луч-часы и солнце больше не нужны: их проверку из snapshot() убрали, кольца крутятся и без них. Вторая, не связанная с шариками причина остаётся прежней (v0.134): кнопки шага |◀ ▶| вне режима магнитов сами включают луч-часы — шаг идёт до события лазера.
Проверено в браузере: шарики активны при выключенных луч-часах и солнце; солнце вкл → «↦ сквозной» → солнце и луч-часы выключены, проход запущен. Тесты шариков проходят.
Пользователь попросил: при скрытых «✛ осях» ручное кручение кольца 1 не должно прилипать к вертикали и горизонтали холста. Все три места, где оси были целью, теперь требуют Z.coneAxes: прилипание строки 1 рукой (coneR1AxisSnap), привязка «границы частей» (conePartTargets) и 🧲-магнит (coneMagSnap). Соседние кольца остаются целями, как раньше.
Второе — «да, убери»: кнопки шага |◀ ▶| вне режима магнитов сами включали «⌖ луч-часы» (v0.134), потому что шагали до события лазера. Теперь без луч-часов они ничего не включают. Шаг идёт до ближайшего мига, когда грань одного кольца ложится на грань соседнего (кольца строк и за чертой, те же грани, что у «⏸ грани»). Миг считается точно по скоростям колец, а не перебором. С включёнными луч-часами или солнцем шаг прежний — до события света.
Проверено в браузере: при скрытых осях кольцо 1 в 1° от вертикали тянется только к соседу, при показанных — к вертикали. Луч-часы выключены: ▶| дважды и |◀ встают точно на совпадения граней соседних колец, луч-часы остаются выключенными.
По снимку ряда «|◀ ▶ пуск ▶|» пользователь заметил: широким должен быть пуск, а не стрелки. Когда группа «Кручение» шире своих кнопок, tzJustify раздаёт лишнюю ширину ряда. У «▶ пуск» стоит data-w1 (одна кнопка при замере), и растяжка его пропускала (правило v0.490). Тянуть в ряду оставалось только стрелки, и они росли. Новая метка data-tzgrow разрешает растяжку и при data-w1; у пуска она стоит. Стрелки — полукнопки .ib — тянутся, только если больше нечему, поэтому остаются узкими.
Проверено в браузере: группа «Кручение» с заданной шириной — пуск 91 → 112 px, стрелки остаются 49 и 50 px, ряд доходит до рамки.
По снимку кольца 1 из одного бита, вставшего под непонятным углом при выключенных «✛ осях», пользователь спросил, к чему оно магнитит. Оси уже не держали (v0.1030), держал лазер. Тянешь строку 1 — её вырез защёлкивается на луче (coneAimSnapD, v0.139), и защёлка срабатывала при выключенных «⌖ луч-часах», когда луча нет на холсте. К тому же вырез лазера не обязательно совпадает с видимой чертой разреза: его место задаёт ещё и прицел лазера (coneAim). Поэтому кольцо вставало, ни с чем видимым не совпадая. Теперь к лазеру прилипает, только когда он виден: луч-часы включены, солнца нет. Остаются видимые цели — соседние кольца. Оси симметрии соседа работают по кнопке «🧲 сим.».
Проверено в браузере: вырез в 2° от лазера — при выключенных луч-часах защёлки нет, при включённых — есть.
Пользователь спросил, одинаковые ли грани в «T · все» и «N щель», и на ответ «да, все границы битов» сказал «сделай» — чтобы в «N щель» гранью была только щель. У лазера там одна щель на кольцо строки, между последним и первым битом, остальные границы для луча — стена. Магнит же и шарики брали все границы. Теперь coneRingFeat метит такое кольцо (one), и coneFeatEdges отдаёт у него одну грань. Через них идут ручная привязка, «🧲 гран.», шаги и автокручение по магнитам, «⏸ грани» и шаги |◀ ▶| без луч-часов. 🧲-магнит (coneMagSnap) так же берёт у таких колец только щель, свою и чужую. У шариков кольцо строки в «N щель» — один блок во весь круг с единственной гранью. Строка 1 и кольцо за чертой не меняются: у лазера у них и в этом режиме щели на каждой границе.
Проверено: в браузере грани колец «1, 11, 101 + за чертой» — 2·2·3·4 в «T · все» и 2·1·1·4 в «N щель», «↦ сквозной» в «N щель» запускается с подстройкой. Тест шариков дополнен «N щель» (7128 прогонов, разворотов 0). В solarius-geometry.test.cjs песочница получила coneOneSlit, тест ручной привязки строки 1 — включённые оси (сломан v0.1030) и проверку, что при скрытых осях привязки к ним нет: 39 из 39, панели 20 из 20.
Пользователь попросил режим «ни лазер, ни солнце — Грани»: когда из центра выстраивается прямая из кольца 1 через грани всех внутренних колец, на следующем кольце в любом его месте ставится засечка. По второму слову это отдельная группа «Грани» (#solEdgeGrp, цвет #ffd166) с кнопкой «⟂ грани» (Z.coneNotch). Включение гасит солнце и луч-часы, а включённый лазер или солнце гасит грани. Прямая — общая грань кольца 1 и всех колец строк над чертой, грани те же, что у магнита (coneEdgeRings): границы битов, в «N щель» — сама щель, у строки 1 из одного бита — разрез и прямая напротив. Засечка ложится на кольцо за чертой в его собственных частях (Z.coneNotches), не обязательно на границу ячейки, и крутится вместе с ним. При ▶ все совпадения кадра ищутся точно (coneNotchSweep через zzEdgeMeet), в том числе при включённых шариках. Стоящее и крученное рукой положение проверяется при отрисовке. Сменилась строка за чертой — засечки начинаются заново; правый щелчок по кнопке стирает их. Нужны хотя бы две строки над чертой: при одной кольце 1 «совпадает» само с собой всегда.
Проверено в браузере: на кольцах «1, 11, 101» точный поиск находит те же совпадения, что перебор 60 000 мелкими шагами. Засечки видны жёлтыми чертами на кольце за чертой. Включение лазера выключает режим. Засечка точно на стыке записывается как место 0, а не P. На симметричных строках засечки попадают на границы ячеек (так выходит геометрия). При сдвиге кольца 3 на 0,37 части грани всех трёх колец на одну прямую не сходятся — засечек нет.
По снимку кольца, прилипшего непонятно к чему, пользователь попросил внизу показывать при ручном кручении, какой гранью какого кольца сейчас примагнитилось и к чему. Пока кольцо тянут рукой и оно прилипло, под холстом конуса горит розовая подпись (#coneSnapInfo, поверх, ничего не сдвигает), например «🧲 Кольцо 3: середина бита 2 → грань 2 кольца 2». Отпустили — подпись гаснет. Грани и середины битов нумеруются по кругу от начала кольца (coneSnapFeat: coneFeatEdges / coneFeatMids). У строки 1 из одного бита — «разрез» / «прямая напротив разреза». Цель берётся из привязки и места прямой: грань или середина соседнего кольца, ось симметрии кольца, вертикаль или горизонталь, лазер. Подпись есть у всех видов ручного кручения: кольца строк, строки 1, кольца за чертой и 🧲-магнита. Для строки 1 coneR1AxisSnap теперь отдаёт и подпись цели.
Проверено в браузере: «Кольцо 2: грань 1 → грань 1 кольца 1», «Кольцо 3: середина бита 2 → грань 2 кольца 2», «Кольцо 4 (за чертой): грань 3 → грань 2 кольца 2», «Кольцо 1: прямая напротив разреза → вертикаль». Подпись у нижнего края холста, гаснет. Тесты геометрии 39 из 39.
Пользователь попросил: при включённых «🧲 оба» и «🧲 гран.» подсвечивать при автокручении совпадения граней соседних колец так же, как при ручном кручении. При ▶ совпадение длится миг и проскакивает между кадрами. Поэтому каждое совпадение границы кольца с границей соседнего за кадр ищется точно (coneSeamSweep, грани — coneEdgeRings, как у ручной привязки) и вспыхивает той же розовой чертой между двумя кольцами. Вспышка гаснет за 0,9 с, как вспышки лазера. Пары — все соседние кольца, включая кольцо за чертой: при ▶ крутятся все, «текущего» кольца нет. Работает только при «🧲 гран.» и не в кручении по магнитам, где свои лучи. Работает и при включённых шариках.
Проверено в браузере: на кольцах «1, 11, 101» при стоящем кольце за чертой точный поиск даёт по парам 2, 1 и 6 совпадений. Перебор 40 000 мелкими шагами даёт столько же, если не считать дважды точку ровно нулевой разности.
По строке «N щель» таблицы «Кольца» пользователь попросил выделить эту щель цветом, чтобы её сразу было видно. В «N щель» у кольца строки одна щель — между последним и первым битом. На рисунке она была тонкой прорезью среди черт границ, а при «◯ чистых» без прорезей её не было видно вовсе. Теперь щель каждого кольца строки — ярко-зелёный клин (#22e07a, со свечением) во всю толщину кольца. Ширина клина — как у самой щели (ползунок «щель»), но не тоньше 3 px. Клин крутится с кольцом (coneOneSlitDraw). Строка 1 (у неё свой вырез) и кольцо за чертой (щели на каждой границе) не подсвечиваются. Место — то же, что у грани магнита и шариков в этом режиме (v0.1033).
Проверено в браузере: строки «1, 11, 101, 1111», «N щель», «◯ чистые» — у колец 2–4 по одному зелёному клину.
Пользователь заметил: при ручном кручении подсветку совпавших граней перекрывает жёлтое выделение кольца, и сцепления не видно. Жёлтое — золотая рамка «бит под мышью» (v0.173). При кручении рукой мышь всё время стоит на тянущемся кольце, рамка обводит бит по его краям — как раз там, где грани сцепляются, — и рисовалась после розовой подсветки. Теперь рамка и сканер рисуются раньше: под лучами кольца в руке и под розовой подсветкой сцепления (по кольцу в руке и после шага по магнитам). Сама рамка не убрана.
Проверено в браузере: отрисовка с рамкой бита, лучами шага по магнитам и сканером проходит без ошибок.
По снимку зелёных клиньев v0.1037 пользователь попросил: щель одинаковой ширины у всех. Клин шёл по углу: расширялся наружу, и у колец с разным числом битов был разной ширины (угол щели coneSlitHalf(n) зависит от длины строки). Теперь это полоса с параллельными краями одной ширины на всех кольцах: 8 % ширины кольца, от 3 до 8 px. Место прежнее — щель между последним и первым битом.
Проверено в браузере: строки «1, 11, 101, 1111» в «N щель» — зелёные полосы колец 2–4 одной ширины, без расширения.
Пользователь спросил, почему в «N щель» у строки 1 нет щели. Она есть, но устроена иначе, чем у колец строк. Это вырез-затвор (v0.139/v0.664): луч выходит из строки 1 только через него, а место задают поворот строки 1 и прицел лазера (coneCutAngle). Подсветка v0.1037 его пропускала. Теперь у строки 1 — та же зелёная полоса одной ширины, от центра до края кольца 1, по месту выреза. Она крутится со строкой 1.
Проверено в браузере: строки «1, 11, 101, 1111» в «N щель» — зелёная полоса от центра по вырезу строки 1 (198° при фазе 0,3) и полосы колец 2–4.
По снимку одной строки «1» пользователь спросил: «тут напутано? грани не в вырезе зелёном?». Напутано. Зелёная полоса v0.1040 — настоящая щель строки 1, вырез-затвор лазера. А магнит, шаги, «⏸ грани» и шарики считали гранью строки 1 из одного бита её разрез (место 0). Он лежит напротив выреза, если прицел лазера не повёрнут. В режиме «🧲 гран.» розовая подсветка сцепления горела сплошной сверху, а у зелёного выреза был только пунктир. Теперь у строки 1 из одного бита без вырезов («N щель», «все») гранью считается сама щель (xc в coneRingFeat; coneFeatEdges → щель, coneFeatMids → прямая напротив неё). У шариков строка 1 — блок от щели до прямой напротив. В подписи привязки — «грань 1» (щель) или «прямая напротив щели». При вырезах, ◐ и ✚ — без изменений.
Проверено в браузере: строка «1» в «N щель» — щель вниз (90°), грани строки 1 — 90° и 270°, ручная привязка к кольцу за чертой — на 90°: «🧲 Кольцо 1: грань 1 → грань 2 кольца 2 (за чертой)». Тесты геометрии 39 из 39 и шариков проходят.
Пользователь спросил, разные ли понятия «щель» и «разрез». У колец строк 2, 3… это одно и то же: щель — граница битов (в «N щель» — между последним и первым). У строки 1 программа вела два места. Разрез — граница бита с самим собой, начало бита 0, черта от центра. Щель — выход лазера (вырез-затвор, «▮ щель 1»): по правилу v0.139 «лазер вверх, выход в начале — напротив» она стояла на +180° от разреза. Поворота прицела давно нет (coneAim() всегда 0), так что щель всегда была ровно напротив разреза. Пользователь выбрал вариант «2»: щель ставится на разрез. Теперь coneCutAngle() = начало бита 0 строки 1, как у прочих колец щель = граница. Вместе с ней переехали зелёная полоса, золотые края выреза, прохождение лазера, свет солнца из ▮ и грани магнита и шариков (v0.1041 брала щель — теперь это тот же разрез). Следствие: в стартовом положении щель вверху, под лучом лазера, и луч проходит сразу. Прежде для этого строку 1 надо было довернуть на полоборота.
Проверено в браузере: строки «1, 11», «N щель», поворот 0 — щель и разрез вверху (270° / −90°), лазер вверх проходит кольцо 1 и уходит до кольца за чертой. Грани строки 1 — 90° и 270°. Тесты геометрии 39 из 39, панелей 20 из 20, шариков проходят.
Договорились о словах: разрез — граница бита, вырез — всё между битами (только в режимах 2T), щель — разрез или вырез, через который проходит свет. У кольца 1 из одного бита разрез один, из центра наружу. Программа же всюду брала вторую линию — прямую напротив разреза через центр: в общем списке граней (coneEdgeRings: «⟂ грани», «⏸ грани», шаги |◀ ▶| без луч-часов, вспышки при ▶) и как «середину бита» (ручная привязка, 🧲-магнит). Из-за этого «⟂ грани» ставила засечки и по прямой, где разреза нет. По слову «да, убери отовсюду, кроме шариков» её больше нет нигде, кроме шариков: у кольца 1 из одного бита одна грань (флаг r1 в coneRingFeat, coneFeatMids пуст). Шарики по-прежнему проходят центр по ней — у них своя геометрия в zz-ball.js.
Проверено в браузере: строки «1, 11» в «N щель» и «все» — у кольца 1 одна грань (270°), «середин» нет, шарики включаются. Тесты геометрии 39 из 39, панелей 20 из 20, шариков проходят.
Прямая напротив разреза кольца 1 осталась только у шариков (v0.1043). Пользователь попросил сделать это вариантом: шарик из центра выходит только по одному пути. Кнопка «⊙ один путь» в группе «Шарики» (Z.coneBallOne, по умолчанию выкл.). Включена — у кольца 1 из одного бита для шарика есть только разрез: один блок во весь круг, без прямой напротив. Шарик, пришедший по разрезу в центр, выходит по нему же. Это его путь, не разворот: шарик остаётся зелёным, разворотов 0. Автоподстройка считает отрезок «к центру и обратно» до стыка К1 одним куском. Выключено — как раньше, насквозь по прямой напротив. При ◐ и ✚ у кольца 1 свои грани с обеих сторон, там без изменений.
Проверено: тест шариков дополнен «одним путём» во всех режимах колец и трёх режимах кручения (все старты выходят, разворотов 0), прежние тесты проходят. В браузере кнопка включается и гасится, «↦ сквозной» с ней запускается.
Договорились с пользователем о трёх словах и внесли их в словарь журнала. Разрез — граница бита. Вырез — всё между битами, только в режимах 2T. Щель — разрез или вырез, через который проходит свет. Первая формулировка была «щель — разрез или вырез на стыке кольца». Она верна для «N щель», T−1 и 2n, но в «все», «между» и «симм.» щелей больше, чем одна на стыке, поэтому взяли общую. На странице щель строки 1 называлась «вырезом» (подсказка «⌖ луч-часы», строка лазера в тексте алгоритма); теперь там «щель строки 1 — разрез, начало бита 0».
Пользователь попросил режим: шарик, дойдя до центра, поворачивает щель кольца на 180° и идёт дальше в ту же сторону. Кнопка «⊙ один путь» стала кнопкой по кругу на три положения (Z.coneBallCenter): «центр: насквозь» — по прямой напротив разреза; «⊙ назад» — обратно по тому же разрезу (v0.1044); «⟳ щель 180°». В последнем у кольца 1 из одного бита для шарика только разрез. Шарик доезжает по нему до центра и стоит там до конца кадра. Затем кольцо 1 поворачивается на полоборота довода строки 1 (applyFlips, Z.coneAimRot + 180°), его разрез ложится на продолжение пути, и шарик едет наружу в прежнем направлении. Скорость к стыку К1 подстраивается уже после поворота. Поворот настоящий: кольцо и его зелёная щель видны на новом месте, все шарики на кольце 1 поворачиваются с ним, в оборотах кольца 1 — по ½ на каждый переворот. При ◐ и ✚ — всегда насквозь.
Попутно найдена ошибка v0.1041: место щели строки 1 считалось из углов, и округление давало то 0, то 0,9999999. Шарики принимали это за другую форму колец и сбрасывались посреди пути в «N щель» и «все». Теперь место прижимается к целому.
Проверено: тест шариков — «щель 180°» во всех режимах колец и трёх режимах кручения (выход без разворотов, направление через центр сохраняется). В браузере через настоящие кадры «↦ сквозной» в «N щель»: «щель 180°» — довод +180°, один переворот, чистый выход, у кольца 1 на ½ оборота больше, чем «насквозь»; «назад» и «насквозь» — чистые выходы. Прежние тесты проходят.
Пользователь попросил кнопки масштаба плюс и минус наверху: треугольники рядом с балансами, правее и левее, такого же размера. Теперь у верха холста конуса в ряд: «−», баланс «1», ромб «✛ оси», баланс «0», «+». Кнопки масштаба — треугольники остриём вниз 48×24 (на телефоне 32×16), как балансы, вплотную к ним (.c3zoom, место — в c3AxesPlace). Масштаб — к центру конуса, шаг ×1,25 / ×0,8, как у «− +» пульта 3D. Если держать кнопку, шаг повторяется. Балансов нет — кнопки стоят по бокам ромба осей. В фоне хаба скрыты.
Проверено в браузере: «−» слева вплотную к паре балансов, «+» справа, верх общий, размер 48×24; «+» → масштаб 1,25, «−» → снова 1.
«Острые вверх»: кнопки «−» и «+» теперь треугольники остриём вверх, знак — у основания. Они стоят «в замок» с балансами, как в сетке треугольников: каждый заходит на соседний баланс на полширины, и их наклонные стороны совпадают. Нажатия ловит только сам треугольник (обрезка по контуру), поэтому балансы под ним не перекрыты. Без балансов кнопки стоят по бокам ромба осей, как раньше.
Проверено в браузере: «−» на 24 px левее левого края пары балансов, «+» — на 24 px левее правого края (полширины), треугольник остриём вверх.
Пользователь попросил рядом с «⟂ грани» кнопку режима щели, чтобы подсвечивался только вылет по щели. Кнопка «▮ щель» (Z.coneNotchSlit): засечка на кольце за чертой ставится, только когда прямая из центра проходит через щели всех колец строк, а не через любые разрезы. По словарю щель — разрез или вырез, через который проходит свет. В «N щель» это одна щель кольца, в «все» — каждый разрез; там ничего не меняется. В режимах с вырезами в счёт идут только края вырезов: с одной стороны бит, с другой пусто (coneEdgeRings(true)). Разрезы между соседними битами без выреза и границы частей внутри самого выреза не считаются. У строки 1 — её щель или края открытой половины / четвертей. Включение и выключение начинает засечки заново.
Проверено в браузере (строки «1, 11, 101», ◐): граней у колец строк по режимам — T−1 2·3·5 → 2·2·2, 2n 2·4·6 → 2·2·2, «между» 2·3·5 → 2·2·4, «симм.» и «N щель», «все» — без изменений. Засечек в T−1 за 12 шагов фазы — 7 по разрезам, 4 по щелям.
Пользователь попросил добавить в «Грани» кнопку вылета шарика из щели кольца 1 и дальше по щелям или граням — как выбрано. Кнопка «● вылет» запускает один шарик из центра наружу через щель кольца 1 (раньше из центра мог уйти и по прямой напротив). Дальше он идёт кольцо за кольцом до выхода. С «▮ щель» шарик переходит только на щели: в режимах с вырезами соседние биты без выреза для него — одна стенка (блоки сливаются, Z.coneBallSlitOnly), грани — края вырезов. Без «▮ щель» — по любым граням. Скорость подстраивается сама. Обычные запуски из группы «Шарики» слияние снимают.
Найдено при проверке: без «◯ чистых» кольца нарисованы с зазором (72 % полосы), и шарик у зазора ждал бесконечно — стык не «касался». Теперь зазор для шариков — пустое место, шарик пересекает его по той же прямой.
Проверено в браузере через настоящие кадры (строки «1, 11, 101», ◐, без «чистых»): T−1 со щелью и без, 2n и «между» со щелью, «N щель», «все» — все вылеты до конца, чисто. Со щелью в T−1 кольцо 2 проходится по краю выреза (150°), без неё — по внутреннему разрезу (30°). Тесты шариков проходят.
Пользователь попросил режим вылета: после вылета шарика из кольца 1 сразу же за ним начинает вылет второй, и так далее. Кнопка «⛓ цепочка» в группе «Грани» (Z.coneBallChain) — к «● вылету». Первый шарик стартует из центра через щель кольца 1. Как только последний вылетевший перешёл на кольцо 2 (или уже вышел совсем), из центра стартует следующий — с той же базовой скоростью, через ту же щель, по щелям или граням, как выбрано «▮ щель». Всего до 64 шариков, они пронумерованы. Счёт — в строке шариков: сколько движутся, вышли, без разворота.
Проверено в браузере через настоящие кадры (строки «1, 11, 101», T−1, ◐, «▮ щель»): за 1500 кадров вылетело 25 шариков, каждый стартовал на кадре выхода предыдущего из кольца 1. 21 уже вышли, все без разворотов.
Идея пользователя: шарик вылетает и, если упирается в дугу, а не в щель или вырез, исчезает. С автоподстройкой на каждом отрезке шарик в дугу не упирается никогда, поэтому договорились о правилах. Скорость подстраивается только на первый вылет первого шарика — от центра до кольца 2 — и дальше постоянная для всех отрезков и всех шариков цепочки (lossSpeed). Внутри кольца шарик едет по щели. Кнопка «✕ дуга» в группе «Грани» (Z.coneBallLoss) — к «● вылету». На стыке шарик проходит, если на его прямой щель следующего кольца — с допуском её ширины, как у лазера (coneSlitHalf), тогда встаёт на неё — или открытый вырез (едет дальше с кольцом с того же места). Иначе — дуга бита: шарик исчезает (stage = "lost", не рисуется). В строке шариков — «исчезли на дуге N». В цепочке после исчезновения стартует следующий.
Проверено в браузере через настоящие кадры (строки «1, 11, 101», ◐, цепочка, 1500 кадров): у всех шариков одна скорость — найденная первым (1,5 / 2 / 0,857 / 3 по режимам). «N щель» — 37 из 38 исчезли (36 на кольце 2), T−1 — 43 исчезли, 6 вышли, T−1 со «▮ щель» — 20 исчезли, 1 вышел, «все» — все 64 на кольце 3. Разворотов нет. Тесты шариков проходят.
Пользователь попросил режим: шарик, вылетевший в кольцо за чертой, ставит «1» в бит, — и прокрутить до четырёх строк. Кнопка «1 за чертой» в группе «Грани» (Z.coneBallMark) — к «● вылету». Шарик, вошедший в кольцо за чертой, ставит «1» в ячейку у своей грани: по часовой от неё, а если там вырез — в ячейку до неё. Вошёл через открытый вырез — ячейки нет. Все ячейки «1» — строка уходит в поле, как у лазера (fillAutoCommit), и вылеты сами продолжаются с новым кольцом (restartRun). Цепочка больше не кончается на 64: вышедшие и исчезнувшие уходят из списка, номера идут дальше.
Прогон с одной строки «1», «По 1», 3 бит/с, цепочка (строки — всегда одни «1», так устроено правило):
Найдено и исправлено при прогоне: после ухода строки в поле отрисовка пересобирала шарики «на старт» раньше перезапуска; теперь в этом режиме вылеты продолжаются.
Пользователь прислал файл zazerkalius-vse-20261009-2308.json и уточнил: настройки нужны только для ссылок, которые ему присылаются в чат. Пресет «Шарики · дуга и цепочка» открывает всю страницу с кнопками и раскладкой из файла независимо от памяти браузера. Начальное состояние страницы и кнопка «✖ Сброс» сохранены прежними. Из копии для ссылки исключены home, coneLog и cgrpTri_pered_sbrosom; исходный экспорт сохранён.
По просьбе «для всех режимов в том тесте дай ссылки» подготовлены пять пресетов прогона до четырёх строк. Общие условия: одна строка «1», «По 1», 3 бит/с, «⛓ цепочка», «1 за чертой», начальные повороты — нулевые; запуск кнопкой «● вылет»:
Пользователь заметил: шарик проходит через щель, а «1 за чертой» всё равно ставит единицу. Уточнил правило: писать нужно при попадании в дугу бита, а щель должна пропускать. Теперь при подходе к кольцу за чертой проверяется фактический угол в момент касания: щель с допуском её ширины и открытый вырез пропускают без записи, сплошная дуга поглощает шарик и ставит «1» в попавший под него бит. Действует и без «✕ дуга»; на внутренних кольцах исчезновение по-прежнему зависит от «✕ дуга». При «▮ щель» сохраняется карта исходных битов внутри объединённой стенки, поэтому удар пишет именно свой бит, а не крайний. Автоподстройка, пришедшая точно в щель, единицу не ставит.
По просьбе считать исчезнувших у каждой строки добавлен постоянный по ширине столбик ✕N, включая строку за чертой. Число обновляется в момент поглощения; при заполнении строка забирает свой счёт в поле. Счёт хранится отдельно от списка шариков: очистка старых записей цепочки и переход к новой строке его не теряют. Новый «● вылет» начинает новый счёт. Общий счёт исчезнувших тоже накопительный. У колец «N щель» восстановлен допуск ширины щели, отсутствовавший в их геометрии шариков. В пяти ссылках теста исправлена моя ошибка масштаба скорости: coneAutoSp = 30 даёт обещанные 3 бит/с в режиме «По 1»; прежде 3 в этом ключе давало 0,3 бит/с. Настройки пользовательского пресета из файла не менялись. После исправления правила записи прежние результаты по времени остаются историей предыдущего поведения.
Дополнительно: кнопка скорости 1/2/3 — авто, прямая от центра до края К1 за оборот К1, за полоборота. С «✕ дугой» авто фиксирует найденную скорость первого перехода; без неё подстройка идёт отдельно на каждом прямом отрезке. В режимах 2/3 автоподстройка отключена, скорости задаются точно через угловую скорость первого кольца.
Выбор удара — застрять / отскок. Отскок возвращает шарик назад по его прежней грани; попадание в бит за чертой всё равно записывает 1. При переносе заполненной строки шарики на неизменившихся внутренних кольцах продолжают путь, в том числе назад. Удары и отскоки считаются отдельно. «● в центр» — одна группа из всех щелей внешнего видимого кольца, с остановкой достигших центра и отдельным счётом. Здесь столкновения действуют всегда; режим 1 даёт постоянную базовую скорость — радиус за относительный оборот первых двух колец, без подгонки прихода к щелям. Наведение на заголовок «Грани» даёт итоговое описание выбранной комбинации. По последнему уточнению таблица оборотов стоит справа от оси, компактный текст статистики — слева, на той же высоте. В таблице последние 64 результата вылетов, общие счётчики — без ограничения. ⌖✕ сброс работает и при перекрытии конуса его рисунком.
Застрявшие шарики видны внутри площади своего бита и вращаются вместе с ним; при плотном накоплении показываются до 64 точек на бит и полный счёт. Сброс стирает точки, текст, таблицу и счёт у строк. Ссылки используют Solo с bg=0: рабочие кнопки и раскладка из экспорта 23:38; «Вид» и «Лазер» закреплены в верхней полосе, первые два кольца начинают по осям холста. Эти изменения раскладки применены только к ссылочным пресетам.
Проверено в браузере: входящая группа из двух щелей — один шарик дошёл до центра, второй застрял; с отскоком второй вышел обратно наружу. Таблица справа и текст слева имеют одинаковую верхнюю координату; после сброса оба пусты и скрыты, счёт у строк убран. Ширины кнопки скорости и счёта у строк не менялись во время движения. 16 проверок попаданий, отскоков, скорости, движения в центр и накопления после 64 событий; 20 проверок панелей; прежние проверки ожидания и сквозных проходов, 7128 прогонов автоподстройки — пройдены. Синтаксис двух изменённых JS и трёх встроенных скриптов HTML проверен.
По снимку пользователя оба входящих шарика промахнулись мимо щели первого кольца, однако один покраснел, а второй продолжил движение голубым. Причина: у К1 из одного бита маршрут через центр описывался полукругом; проверка столкновений принимала другую половину за открытый вырез, а противоположный радиус — за вторую щель. Теперь физическая стенка К1 — полный круг с одной настоящей щелью, отдельно от вспомогательного маршрута через центр. Правило одинаково для «насквозь», «назад» и «щель 180°»; настоящие открытые вырезы других режимов сохранены.
Застрявший шарик сохраняет точные угол и радиус контакта с дугой, без смещения внутрь бита и распределения повторных ударов. При движении внутрь это внешний край ударенного кольца; при вылете — внутренний. Он остаётся прикреплён к кольцу и вращается с точкой удара. В режиме отскока разворачивается по своей прежней грани. Добавлены проверки единственной щели К1, обеих сплошных половин, противоположного радиуса, точных координат контакта и отскока.
Проверено в браузере на том же входящем пресете: два промаха — два удара и два застрявших на окружности К1, в центре 0. При переключении на отскок — два отскока, два выхода обратно наружу, в центре 0. Ошибок консоли нет. Все 18 проверок попаданий и прежние проверки сквозного прохода и ожидания пройдены; синтаксис JS проверен.
Первый достигший центра шарик закрывает щель К1. Затем попадание в дугу закрытого К1 считается достижением центра и закрывает разрез К2; так закрытая центральная область растёт наружу. По уточнению пользователя закрытие сохраняет текущие биты 0/1: каждое закрытое кольцо получает только бирюзовую обводку внешней дуги, без принудительной заливки единицей. Следующий «В центр» сохраняет закрытые кольца и обнуляет статистику шариков; сброс открывает их снова. Когда закрыто внешнее видимое кольцо, новых стартов нет.
В начале нового опыта «В центр» К1 пустой — его биты 0. Удар в дугу снаружи записывает 1 в реальное место контакта, при застревании, отскоке и на закрытом центре. Кнопка «0 при отскоке» добавляет запись 0, когда отражённый шарик ударяет в дугу внешнего кольца изнутри. Щель и открытый вырез пропускают без записи. Закрытие само по себе не меняет значения битов; запись битов не отменяет уже закрытые кольца. Добавлен Solo-пресет с тремя видимыми кольцами и включённой записью 0; начальные оси К1/К2 в ссылках совпадают.
Одновременные контакты, достижения центра и выходы останавливают вращение точно в общем времени события. В статистике показаны номера шариков, кольца и время до микросекунд; ▶ продолжает опыт. Входящая группа обрабатывается по времени событий, а не по порядку шариков или длине кадра. Исправлен цикл анимации: остановка внутри расчёта больше не оставляет следующий кадр вращения в очереди.
Проверено в браузере: исходный К1 пустой; общий контакт двух шариков — неподвижная пауза, затем достижение центра закрывает К1; следующая группа закрывает К2. Обводки сохраняют значения битов, сброс убирает их и всю статистику. В отдельном опыте с фазовым сдвигом подтверждены 1 на К1 снаружи и две записи 0 на К3 изнутри. Ошибок консоли нет. Проверки JS и регрессионные тесты шариков пройдены.
Пользователь попросил режим «Луч», как шарики, только мгновенный: как только открывается прямая, луч проходит из центра наружу и ставит «1» у грани битам всех колец, через которые прошёл, — от последнего закрытого кольца (вначале кольца 1) до внешнего. Уточнено ответами: срабатывает только сквозная прямая — грани всех колец от первого открытого до кольца за чертой на одной прямой из центра (грани — как у магнита и «⟂ граней», с «▮ щель» — только щели). «1» получает бит, который кольцо своим вращением подвозит под луч сразу после грани (стоящее кольцо — бит по часовой). Кольцо за чертой тоже получает «1», заполненная строка уходит в поле. Прошедший луч сам закрывает своё стартовое кольцо — общим счётом с «● в центр» (window.zzBallCloseRing, бирюзовая обводка), следующий луч стартует со следующего кольца. Когда закрыты все кольца строк, лучей нет.
Кнопка «⚡ луч» в группе «Грани» (Z.coneRay). Момент прохода ищется точно, и между кадрами (coneRaySweep через zzEdgeMeet) — при ▶ крутить, с шариками и без, и на шагах |◀ ▶| без луч-часов. Пройденный луч вспыхивает светлой чертой от стартового кольца до края кольца за чертой и гаснет за 0,9 с. Запись битов — та же, что у шариков (zzBallBitWrite, zzBallFillMark).
Проверено в браузере на строках «1, 11, 101»: «все» — три луча, кольца закрываются 0 → 1 → 2 → 3, строка 3 «101» → «111», за чертой «..1.» → «.11.» → «111.»; «N щель» и T−1 с ◐ (со щелью и без) — по три луча с закрытием колец и «1» за чертой. Для ссылок заведены Solo-пресеты «Луч · все» и «Луч · T−1 с ◐» (строки 1, 11, 101, «По 1», 3 бит/с, ⚡ луч; запуск — ▶ крутить).
Пользователь спросил: в «● в центр» при «1 — авто» скорость должна найти для текущего внешнего кольца такую, при которой во внутреннее зайдёт наибольшее число шариков, — или от скорости это не зависит? Тогда хотя бы один. Зависит. Вся группа едет одной скоростью и приходит к стыку одновременно — через ширину кольца / скорость. Проходят те, у кого в этот миг щель внутреннего кольца (с допуском её ширины) или открытый вырез. Скорость задаёт миг прихода, а с ним — число совпадений. Не зависит только когда два кольца крутятся одинаково. Раньше «авто» для «В центр» ничего не подбирало: группа ехала с базовой скоростью (радиус внешнего кольца за T₀).
Теперь (inwardAutoSpeed в zz-ball.js) перебирается один период относительного поворота двух колец: точные моменты совпадения каждой внешней щели с каждой гранью внутреннего кольца и частая сетка (1440 точек), не быстрее 4× базовой. Выбирается наибольшее число прошедших, при равенстве — ближе к базовой. Ни при какой скорости не проходит никто — остаётся базовая. После запуска всплывает итог: «скорость ×… от базовой — в К… зайдут N из M» или «от скорости не зависит». Режимы 2 и 3 скорости не тронуты.
Проверено в браузере на пресете «Из всех внешних щелей в центр» (строка «0», «N щель»): за чертой 2 щели, у К1 одна — авто нашло ×0,51, 1 из 2. На настоящих кадрах один шарик вошёл в К1 и дошёл до центра, второй ударил в дугу.
Пользователь спросил: получается, мы заранее знаем, сколько шариков из внешнего кольца войдёт в смежное внутреннее при одновременном старте «В центр»? Да: группа едет одной постоянной скоростью и приходит к каждому стыку одновременно, кольца крутятся равномерно — случайности нет, весь опыт считается заранее. Выбрано «1» — показывать прогноз до запуска. В момент нажатия «● в центр» (inwardForecast в zz-ball.js, по фактической скорости группы в любом режиме 1/2/3) шаг за шагом считается, сколько войдёт в каждое кольцо, где ударятся и сколько дойдёт до центра. Правило на стыке то же, что у движка (lossPass: щель с допуском её ширины или открытый вырез). Уже закрытые кольца — центр, кольца закрываются после шага, как у одновременных событий. При отскоке удары помечены, дальше путь не прослеживается. Прогноз всплывает сообщением после запуска и стоит строкой «Прогноз: …» в статистике опыта рядом с фактом. Подпись режима «1 · база в центр» исправлена на «1 · авто в центр» (с v0.1059 скорость подбирается).
Проверено в браузере, прогноз против прокрутки кадров: строка «0», «N щель» — войдёт 1, застрянет 1, до центра 1; «1, 11, 101» в «все» и «N щель» — К3 войдёт 1 из 4, застрянут К3 3, К2 1; T−1 с ◐ — К3 1, К2 1, застрянут К3 1, К1 1; «все» при скорости «оборот К1» — все 4 на К3; T−1 при «½ оборота» — оба на К3. Во всех шести совпало до шарика. Попутно: пресет «Из всех внешних щелей в центр» хранит «◇ пред.», с которым шарики в T−1 не работают (в «N щель» не мешает).
Пользователь: «да убери» — про «◇ пред.» в пресете «Из всех внешних щелей в центр». Оказалось, «◇ блоком» (Z.cutPrev) стоял во всех пресетах шариков и луча (duga-*, luch-*, test-4-*, 14 штук) — пришёл из сохранённого состояния. «◇ пред.» действует только в «вырезах T−1» и заполняет вырез битами строки выше, а шарикам нужен пустой вырез: при нём снимок шариков пуст, и в T−1 «● в центр» не запускался вовсе (в том числе в пресете «Тест до 4 строк · T−1 с ◐»). Во всех 14 пресетах cutPrev теперь пустой; в «N щель» и «все» ничего не меняется. Проверено в браузере: «Тест до 4 строк · T−1 с ◐» и «Из всех внешних щелей в центр», переключённый на T−1, запускают шарики, прогноз считается; «Луч · T−1 с ◐» открывается с лучом. Код не менялся.
Пользователь спросил: как привести к старту «В центр», например, с 5-й строки? «● в центр» всегда стартует из щелей внешнего кольца: это кольцо за чертой, а без него — последняя строка. Значит, нужно четыре строки на конусе: «+» у строки за чертой в списке строк переносит её в строки (пустые ячейки — нулями), за чертой встаёт следующая, на бит длиннее. Три нажатия от строки «0» дают строки 0, 00, 000, 0000 и К5 за чертой. В режимах «N щель» и «все» значения бит путь шарика не меняют; в T−1 и 2T нули и единицы задают вырезы. Сделан пресет duga-v-centr-5 — копия «Из всех внешних щелей в центр» с этими строками. Проверено в браузере: 5 шариков во внешних щелях К5; после «● в центр» авто дало ×3,13 от базовой, в К4 зайдёт 1 из 5, прогноз — в статистике. Код не менялся.
Пользователь спросил, что за базовая скорость в «скорость ×3,13 от базовой». Была: радиус внешнего кольца за T₀, а T₀ — период повторения К1 и К2, мерка, не связанная с внешними кольцами. На предложение «базовая — одно кольцо за время, пока внешнее повернётся на бит» ответ «да». Теперь (inwardBase в zz-ball.js) базовая «В центр» — ширина кольца за время поворота внешнего на один бит; авто ищет «×» от неё (не быстрее 4×, как прежде). Внешнее не крутится — прежняя мерка. В сообщении авто и в строке скорости статистики — «×… от базовой (1 кольцо за бит К5 = … с)». Режимы 2 и 3 не тронуты.
Ещё вопросы: «тут работает закрытие колец? начиная с 1, потом 2, так? Как мне начать с 5 строки при закрытых 3 кольцах?» Да, по порядку: первый дошедший до центра закрывает К1, попадание в закрытый центр закрывает следующее. Закрытие раньше жило только в памяти страницы и пропадало при перезагрузке. Теперь оно в состоянии (Z.coneBallClosed — ключ строк и число), запоминается и входит в пресет. Новая кнопка «◉ закрыто» под «0 при отскоке»: щелчок — закрыть ещё одно кольцо, правая кнопка — открыть одно (по кругу); внешнее кольцо всегда открыто. Заранее закрытые кольца хранят свои биты (К1 не обнуляется). Пресет duga-v-centr-5-z3 — строки 0, 00, 000, 0000, К1–К3 закрыты, старт из К5.
По ходу: «0 при отскоке» — «прерименуй»: теперь «0 изнутри» (после отскока удар в дугу изнутри ставит 0). И исправлено: при загрузке страницы модуль шариков делал общий сброс и открывал все кольца — закрытие из пресета пропадало; теперь загрузка его сохраняет, а «↩ к старту» по-прежнему открывает щели.
Проверено в браузере: «◉» три раза — «закрыто К1–К3», кольца обведены; «● в центр» — 5 шариков из К5, базовая 0,21 кольца/с (бит К5 за 4,76 с), авто ×0,26, прогноз: в К4 войдёт 1, дойдёт до центра 1 и закроет К4.
Пользователь: «дай возможность крутить руками внешнее кольцо» и «запоминать положение колец для старта режимов шариков и вообще всех». Кольцо за чертой (внешнее у «● в центр») крутилось рукой только при ⌖ луч-часах (с v0.704), а шарики и ⚡ луч работают без них. Теперь — всегда: тянуть с Ctrl или правой кнопкой, как остальные кольца. Пока включены шарики или луч, 2 оборота рукой больше не переносят строку за чертой в строки — внешнее кольцо не меняется случайно; для новых колец есть «+».
Общее стартовое положение (Z.coneStartPose, coneStartMark / coneStartApply в zz-ui.js). Запоминается, когда ход начинается с положения, выставленного рукой: ▶ пуск, двойной щелчок, ⚡ луч, лазер, запуск шариков. Признак — положение отличается от того, где прошлый ход остановился (Z.coneRunStop). Продолжение после паузы старт не меняет. Новая кнопка «↩ старт» в «Кручении» возвращает кольца туда в любом режиме; шарики встают на свои старты, закрытые кольца остаются. Биты строк не трогаются. Шарики берут тот же снимок: прежний Z.coneBallPose читается, если общего ещё нет. Состояние запоминается и входит в «💾 Всё»; на странице пресета по ссылке память, как всегда, не пишется.
Проверено в браузере (пресет «В центр с 5-го кольца»): правой кнопкой кольцо за чертой повёрнуто на 3 ячейки, строк по-прежнему 4. «● в центр» запомнил старт. Пауза и продолжение старт не сменили. «↩ старт» вернул кольца с фазы 2,5 на 0, а кольцо за чертой — с 4,2 на 3. Новое положение рукой и ▶ пуск — новый старт.
Пользователь: «баг? в режиме N щель „В центр“ сразу несколько шариков не может идти — там одна щель в каждом кольце». Да, ошибка. В «N щель» у колец строк одна щель (с v0.1033), а у кольца за чертой щели стояли на каждой границе ячеек, как у лазера. «● в центр» стартует из внешнего кольца, а это как раз кольцо за чертой, поэтому выходило по шарику на ячейку (в пресете «В центр с 5-го кольца» — 5). Теперь для «В центр» в «N щель» у кольца за чертой тоже одна щель — между последней и первой ячейкой, как у колец строк (inwardOne в снимке шариков, zz-ball.js). Она нарисована зелёной полосой, как остальные (coneOneSlitDraw). Вылеты наружу и лазер не тронуты. Заодно подпись «1 шариков» — теперь «1 шарик во внешней щели», дальше «2–4 шарика», «5 шариков».
Проверено в браузере: пресет «В центр с 5-го кольца» — 1 шарик, щель К5 видна на одной прямой с остальными. Прогноз: войдёт в К4, застрянет на К3. Авто дало ×0,05 от базовой: одна щель К5 должна совпасть с одной щелью К4. При 0,2 бит/с ближайшее совпадение, до которого шарик успевает, — через ~95 с; весь путь — около 190 с.
Пользователь спросил: при текущей угловой скорости колец есть только одна максимальная скорость шарика? Нет. Шарик едет в щели внешнего кольца и проходит стык, если в миг прихода под ним щель внутреннего (с допуском). Годные скорости идут полосами. Быстрая — «успеть, пока щели не разошлись после старта»: любая выше порога, сверху без предела. Медленные — узкие окна у следующих совпадений, через полный относительный оборот. В пресете «В центр с 5-го кольца» (0,21 бит/с, все щели на одной прямой) порог для К5→К4 — 1,5 кольца/с (×7,3 от базовой), а до центра сразу — около 62 колец/с. Авто было ограничено ×4 и уходило в медленное окно через ~95 с (путь ~190 с). Выбран вариант 1 — снять предел ×4.
Теперь (inwardAutoSpeed) скорость до ×1000. Быстрые перебираются частой сеткой по логарифму, у каждого точного совпадения добавлены точки внутри окна. Годные времена собираются в отрезки; берётся точка внутри отрезка с запасом 15 % от краёв, ближайшая к базовой. Близость считается по отношению: ×8 и ×1/8 одинаково далеки. По секундам быстрые казались ближе, и в «Из всех внешних щелей в центр» авто выбирало ×85 вместо ×0,5. Если авто разогнало больше ×4, в сообщении добавлено «быстрее ×4 — успевают, пока щели не разошлись». Авто по-прежнему смотрит только на первый стык.
Проверено в браузере, прогноз против прогона по кадрам. «В центр с 5-го кольца»: ×8,71, шарик вошёл в К4 и ударился в К3 через 1,09 с — совпало. «Из всех внешних щелей в центр»: ×0,5, дошёл до центра за 18,95 с и закрыл К1 — совпало. «Тест до 4 строк · все» — без изменений (×1).
Пользователь протестировал «● в центр» со 2-го кольца (2 шарика): один попал на стык границ, «должен по границе идти в центр, но идёт спиралью». По кадрам шарик шёл по разрезу К1 (угол шарика совпадал с углом щели К1 на каждом шаге). Разрез поворачивается с кольцом, у К1 из одного бита при 3 бит/с — 3 оборота в секунду, поэтому путь на экране — спираль. Пользователь уточнил: «прямая двигается с угловой скоростью, а шарик по ней — линейно» — так движок и устроен, это остаётся. И правило: «шарик и щель — идеальные линия и точка без ширины, поэтому никаких допусков… никакой ширины! Всё идеально линия и точка, везде так».
В движке шариков был один допуск ширины — на стыке (lossPass: разрез ближе полуширины щели coneSlitHalf, как у лазера, считался попаданием). Теперь проходит только разрез, лежащий ровно на прямой шарика (ALIGN — 10⁻⁶ рад, машинная точность, а не ширина); вырез — открытая дуга. Это действует во всех режимах шариков: «● в центр», «✕ дуга», «1 за чертой», цепочка, прогноз и авто (у колец tol: 0). Остальные совпадения граней (подстройка по отрезкам, ожидание прямой) и так были точными. Годные скорости теперь — отдельные точные значения, а не окна; авто находит их расчётом момента совпадения. Зелёная щель в «N щель» нарисована тонкой линией со свечением (было 3–8 px). Пользователь: «запиши в правила, чтобы другие сессии не начинали плодить ширины и допуски» и «это во всех режимах» — запрет записан в CLAUDE.md и zazerkalius/AGENTS.md: никаких ширин и допусков у щелей, граней и шариков во всех режимах. Старый лазер ещё считает щель с шириной (coneSlitHalf) — его перевод на точные совпадения следующий.
Проверено в браузере, прогноз против прогона по кадрам. «Тест до 4 строк · все» (строка 1, 2 шарика): вошёл 1, ударился 1, до центра 1 — совпало. «В центр с 5-го кольца»: ×0,05, точное совпадение через ~95 с, вошёл в К4, удар в К3 — совпало. T−1, строка «0»: оба до центра — совпало; T−1, «1, 11, 101»: в К3 вошёл 1, удары К3 и К2 — совпало. Пресет «Шарики · дуга и цепочка» (вылеты, «✕ дуга», «1 за чертой») — 30 с без ошибок.
На вопрос, переводить ли старый лазер на точные совпадения (щель без ширины), пользователь ответил: «нет, но заметку сделай, что он с ширинами». Лазер (луч-часы, солнце, луна, затвор строки 1 «▮», «щель открыта», шаги «не шире самой узкой щели») по-прежнему считает щель полосой шириной coneSlitHalf. Заметка стоит у coneSlitHalf в zz-ui.js, в CLAUDE.md, zazerkalius/AGENTS.md и в словаре журнала (статья «Щель»): лазер без отдельной просьбы не переделывать, новых расчётов на coneSlitHalf не добавлять; всё новое — без ширин. Поведение не менялось.
Пользователь: «ещё если включён отскок, то в режиме „В центр“ при старте не ставить 0 в биты всех строк внутренних», «пустыми делать», «и К1 тоже». Прежде новый опыт «В центр» обнулял К1 (строку 1), остальные строки не трогал. Теперь при «удар: отскок» новый опыт делает пустыми все строки, К1 тоже. Биты ставят только удары: снаружи — 1, изнутри после отскока — 0 (если включено «0 изнутри»). Без отскока — как прежде.
Строки во всей программе — только из 0 и 1, поэтому пустота — пометка поверх них: Z.coneBallEmpty = {ключ строк, маска «1» — пусто}. Под пометкой стоят нули. На конусе пустая ячейка рисуется как пустая ячейка за чертой — фон, пунктирный контур, без цифры (drawEmpty в zz-ball.js). Удар шарика записывает бит и снимает пометку, даже если под ней то же значение (zzBallBitWrite). Пометка хранится в состоянии и входит в пресет; при другом наборе строк (длины) не действует. Смена отскока — новый опыт при следующем запуске (ключ инициализации включает отскок). Заранее закрытые кольца («◉ закрыто») биты хранят, как прежде. В поле строк справа пустые ячейки пока видны нулями.
Проверено в браузере: «В центр с 5-го кольца», строки 1, 11, 101, 1111, «все», отскок. После «● в центр» строки — нули под пометкой, на конусе все четыре кольца пустые. За 25 с по кадрам: К4 — четыре удара снаружи, все его ячейки стали «1»; К3 — один удар, средняя ячейка «1», две пустые; К1 и К2 пустые. Без отскока: обнулился только К1, пометки нет.
По снимку пользователя «0 поставил всё равно»: отскок и «0 изнутри» включены, шарик стоит на старте, а в кольцах — нули. В v0.1069 строки пустели только в момент запуска «● в центр» (так и проверено: после запуска пусто). До запуска показывалось прежнее — нули. Теперь стартовое состояние «В центр» показывается сразу (zzBallInwardPrime): при смене «удар: …» и по «↩ к старту» (новый опыт). С отскоком все строки пустые сразу, без отскока — К1 нулевой. Если кольца уже закрыты («◉ закрыто» или прошлым опытом), пустеют только незакрытые строки, закрытые хранят свои биты (прежде подготовка в этом случае пропускалась целиком). Зелёная щель «N щель» — геометрия кольца, а не бит: пустые ячейки её больше не закрывают, она рисуется поверх.
Проверено в браузере: «Из всех внешних щелей в центр», «+» дважды (строки 1, 10, 011), включён отскок. Сразу, без запуска, все три строки пустые, щель видна через все кольца. После прогона и «↩ к старту» — снова пустые. Отскок выключен — пометки нет, К1 нулевой.
По снимку пользователя «кольца поверх текста надо»: статистика опыта (слева от оси) и таблица «Обороты колец за путь шарика» (справа) были HTML-панелями поверх холста и закрывали кольца. Холст непрозрачный (фон рисуется на нём), поэтому убрать панель под него нельзя. Теперь их текст рисуется на самом холсте сразу после фона, до колец (coneRunPanelsPaint): кольца, щели и шарики — поверх. Статистика переносится по ширине панели, как прежде; таблица рисуется по местам своих ячеек, с их цветами и нижними линиями. Сами панели остались прозрачным слоем на том же месте (буквы — -webkit-text-fill-color: transparent): текст по-прежнему выделяется и копируется, прокрутка и подсказки работают.
Проверено в браузере: «В центр с 5-го кольца» в «все», 5 шариков, 3 с по кадрам — диск колец закрывает строки статистики и таблицу, текст вне колец читается.
Пользователь (по снимку кнопки «● в центр»): «и вылет — пусть это просто кнопки-галки, а запуск также через Кручение». Теперь «● вылет» и «● в центр» — галки (Z.coneBallArm = "out" / "in"): выбирают опыт, вторая гаснет. Запуск — «▶ пуск» в «Кручении» (и двойной щелчок по конусу), как у «⚡ луча». Шариков в пути нет — ▶ запускает выбранный опыт заново (в «В центр» закрытие колец продолжается); опыт на паузе — ▶ продолжает. Галка выбрана — шарики включены и стоят на стартах (для «В центр» сразу видно стартовое состояние, с отскоком — пустые строки); снята — шарики выключены, ▶ просто крутит кольца. Прогноз, авто и сообщения при запуске — прежние. Внутри запуск сам нажимал ▶, а браузер не повторяет клик по кнопке внутри её же клика — поэтому кручение после запуска включает сам ▶ (autoArmBusy). В пресетах шариков галка проставлена: duga-v-centr* — «в центр», duga-* с вылетом и test-4-* — «вылет».
И по снимку «у первого кольца не видно грани из центра»: пустая ячейка во весь круг (К1 из одного бита) рисовалась двумя окружностями без разреза. Теперь её грань — отдельная прямая из центра (drawEmpty).
Проверено в браузере: «В центр с 5-го кольца», галка «в центр», ▶ — 5 шариков, кольца крутятся; ⏸ / ▶ — пауза и продолжение без нового запуска; галка «вылет», ▶ — шарик из центра; галка снята, ▶ — только кольца. «Тест до 4 строк · все» открывается с галкой «вылет», ▶ запускает цепочку. Грань К1 на пустом кольце видна.
По снимку пользователя «баг: 2-й шарик должен был вылететь во 2-е кольцо» («● вылет», цепочка, «✕ дуга», отскок): шарик 2 ударился в стык К1→К2. Причина — следующий шарик цепочки стартовал из центра в конце кадра, а прежний выходил из кольца 1 посреди кадра. Опоздание — до 1/60 с; К1 из одного бита при 3 бит/с поворачивается за это время до 0,3 рад. Прежде это скрывал допуск ширины щели, без допусков (v0.1067) шарик бился. Теперь момент выхода прежнего из К1 (проход или удар) запоминается долей кадра (markK1, k1Frac, счётчик кадров spinFrame), и новый шарик стартует ровно тогда: остаток кадра он проезжает сразу (advance от промежуточного положения колец). Проверено по кадрам на «Тест до 4 строк · все с ✕ дуга»: за 10 с вылетел 31 шарик, в К2 вошли все 30 дошедших до стыка, ударов нет (до правки на похожем пресете — 5 ударов из 7).
И «не сворачивай, когда шарики выключены, просто затемняй» (по снимку панели «Шарики»): при выключенных шариках тело панели скрывалось (display: none). Теперь оно остаётся раскрытым и затемнено (прозрачность 0,45), кнопки жмутся. Проверено: галка снята — панель на месте, тусклая.
Пользователь по снимку («● в центр» в «Гранях» и «Старт Центр» в «Шариках»): «это дубль? убери». Да: с v0.1072 старт задают галки — «● вылет» (из центра) и «● в центр» (из всех внешних щелей, там выбор и так был заблокирован). Строка «Старт» в панели «Шарики» скрыта (CSS, label:has(#ballLabStart)); код выбора остался — отдельную точку старта можно выбрать щелчком по ⊙ точке на конусе. «Путь» оставлен: в нём есть «через центр», которого у галок нет. Проверено в браузере: строки «Старт» нет, остальные кнопки панели на месте.
По снимку пользователя «не видно границы у 1 строки» (строка «1», шарик в К1): у кольца из одного бита соседей нет, а у кольца строки 1 внутренний радиус 0, поэтому зазор между ячейками нулевой — единственная граница (разрез, по которому едет шарик) не рисовалась, кольцо было сплошным кругом. Теперь она рисуется тонкой линией цвета фона от внутреннего края до внешнего (у всех колец из одного бита без вырезов). Проверено в браузере: «Тест до 4 строк · все», шарик в К1 — граница видна, шарик на ней.
Пользователь: «в центр: когда строка закрылась и осталось только внешнее кольцо, то открыть следующее внешнее и пустить с него в центр». Теперь, когда в «В центр» закрыты все кольца, кроме внешнего (за чертой), и шариков в пути нет, опыт продолжается сам (zzBallInwardNext): кольцо за чертой уходит в строки (как «+», пустые ячейки — нулями), за чертой встаёт следующее, на бит длиннее; закрытие переносится на новый набор строк (ключ закрытия зависит от длин строк, поэтому его надо переносить явно); при отскоке пустые ячейки закрытых колец остаются пустыми, а бывшее внешнее кольцо — новое открытое — пустое. Затем запуск «В центр» из нового внешнего кольца — с авто, прогнозом и сообщением «Закрыты К1–Кn, открытым оставалось только внешнее — К… ушло в строки, за чертой К…: запуск из него в центр».
Проверено в браузере, прогон по кадрам на «Из всех внешних щелей в центр» (строка «0», «N щель»): К1 закрылся → К2 ушло в строки, запуск из К3; закрылся К2 → К3 в строки, запуск из К4; закрылся К3 → К4 в строки, запуск из К5. Строки: 0 → 0, 00 → 1, 00, 000 → 1, 01, 000, 0000.
По снимку пользователя «не открыл 3 кольцо» (строка «1», «все», закрыто К1–К2, «Пауза · всего 0»). Две причины. Последнее закрытие часто приходится на одновременные события нескольких шариков — опыт встаёт на паузу «Одновременно…», а продолжение (v0.1076) проверялось только без паузы; шариков в пути уже нет, а следующее кольцо не открывалось. И «▶ пуск» после этого пробовал обычный запуск в уже закрытые кольца — отказ. Теперь продолжение срабатывает и в кадре с паузой «Одновременно» (ждать нечего — шариков в пути нет), а «▶ пуск» при галке «● в центр», когда открыто только внешнее (или закрыты все), открывает следующее кольцо и запускает из него.
Пользователь: «дай ссылку с этими настройками» — пресет v-centr-rost «В центр · кольца растут»: строка 0, «все», «По 1», 3 бит/с, галка «● в центр»; запуск — ▶ пуск.
Проверено в браузере, по кадрам на «Тест до 4 строк · все» с галкой «в центр»: за 8 с открылось 9 колец (каждые полсекунды: закрытие → кольцо за чертой в строки → запуск), паузы «Одновременно» продолжению не мешают. «◉ закрыто» К1 и ▶ — К2 ушло в строки, запуск из К3. Пресет v-centr-rost: за 3 с строки 0 → 1, 11, 111, 0000.
Пользователь спросил, что делает «✕ дуга». Объяснено: это правило стыка для «● вылета» и цепочки. Без неё шарик на каждом отрезке подбирает свою скорость, чтобы прийти к стыку ровно при совпадении граней, а если совпадения нет — ждёт на месте; в дугу он не упирается никогда. С ней скорость подбирается один раз — на первый вылет первого шарика — и дальше постоянная для всех отрезков и шариков цепочки; на стыке шарик проходит, только если щель следующего кольца лежит ровно на его прямой или под ним открытый вырез, иначе — удар в дугу (застрять или отскочить — кнопка «удар»). На «● в центр» не влияет: там всегда так. Попутно исправлены подписи — сообщение кнопки и её подсказка ещё говорили «щель с допуском её ширины, как у лазера», а с v0.1067 допусков нет; поправлены и два старых комментария в zz-ball.js.
Пользователь (про паузы «Одновременно»): «надо кнопку отключения, по умолчанию откл.». В «● в центр», когда события нескольких шариков (вход в кольцо, удар, центр) приходились на один миг, опыт всегда вставал на паузу с их номерами. Теперь это галка «⏸ одновременно» в «Гранях», под «◉ закрыто» (Z.coneBallSimPause); по умолчанию выключена — опыт идёт без остановок, события обрабатываются в том же кадре, как прежде, только без паузы. Проверено в браузере, по кадрам на «В центр · кольца растут»: выключено — за 3 с ни одной паузы, колец 1 → 4; включено — паузы «Одновременно» снова есть.
На объяснение «✕ дуги» («без неё шарик на каждом отрезке подбирает свою скорость и ждёт у стыка; с ней едет с постоянной скоростью и проверяет, совпали ли щели») пользователь ответил: «только это оставь, не надо изменять скорость». Теперь «● вылет» и цепочка всегда идут по бывшему правилу «✕ дуги»: скорость подбирается один раз — на первый вылет первого шарика (К1 → К2), дальше постоянная для всех отрезков и всех шариков; на стыке — щель ровно на прямой или открытый вырез, иначе удар в дугу (застрять / отскок — кнопка «удар»). Подстройки скорости по отрезкам и ожидания у стыка у «● вылета» больше нет. Кнопка «✕ дуга» скрыта (не нужна); «● в центр» и так шёл по этому правилу. Подсказка группы переписана. Режимы панели «Шарики» (сквозной, ∞ по дугам, запуск из панели) не тронуты.
Проверено в браузере, по кадрам на «Тест до 4 строк · все» (в пресете «✕ дуга» была выключена): за 6 с 19 шариков, у всех на всех отрезках одна скорость 3,0 кольца/с, ожиданий у стыка нет, в К2 вошли 18, вылетели 17; кнопки «✕ дуга» не видно.
Уточнение пользователя: «постоянная для каждого шарика; когда я начал про шарики, я сразу сказал, что скорость константа» и «но возможны шарики с разными константными скоростями». Правило v0.1080 распространено на запуск из панели «Шарики», сквозные группы и «∞ по дугам». Авто выбирает скорость только перед первым движением; дальше она постоянна на прямых и дугах, после стыков, ударов и разворотов в центре. У разных шариков могут быть разные скорости. На стыке — точная щель на прямой шарика или открытый вырез, иначе удар в дугу: застрять / отскочить. Ожидание у стыка и подбор отдельной скорости на дуге удалены; чистый бесконечный цикл не гарантируется. Подсказки панели приведены к этому правилу.
Тесты обновлены под физическое правило: отклонение щели на ±0,02 рад — удар, открытая половина К1 — проход, закрытый внешний стык — удар ровно в момент прихода, в том числе в грубом кадре. Дополнительная проверка обнаружила и устранила повторный подбор скорости после разворота в центре К1 без противоположной грани. Все 111 тестов прошли. Сетка авто: 7128 прогонов, 2935 выходов, 4193 удара, без ожиданий и изменения скорости; проверяется также равенство пути произведению скорости и времени с первого отрезка.
Проверено в Chrome v0.1081 через реальные снимки геометрии и покадровые вызовы движка: 120 шагов по 0,05 с, то есть 6 с расчётного времени. Цепочка — 20 шариков со скоростью 3 кольца/с, 18 вышли; сквозная группа — три шарика со скоростями 2, 6 и 6/5 кольца/с, все вышли. Та же группа в «∞» прошла внешние дуги с прежними скоростями и затем застряла при несовпадении на стыках. Во всех трёх опытах нет ожиданий, смен скорости или расхождений пути и времени; консоль без ошибок. Проверки выполнены в отдельной вкладке пресета, сохранённые настройки пользователя не менялись.
По просьбе пользователя настройки начального положения «центр / лево / право / память» перенесены из «Щелей» в «Кольца», рядом с поворотом и выбором оси. Добавлен пятый вариант «⟂ чёт/неч», выбранный по умолчанию: нечётные кольца К1, К3, К5… симметричны вертикали, чётные К2, К4, К6… — горизонтали. К1 остаётся по вертикали. Чередование определяется номером кольца, независимо от длины строки; работает во всех четырёх видах вырезов. Явно сохранённые прежние положения и память остаются доступны. Выбор стартового положения больше не требует включённого солнца или лазера.
Все 112 тестов прошли, включая проверку настоящих осей симметрии при разной длине строк и довод К1. В Chrome проверены все пять переключателей, запись памяти и четыре вида вырезов на шести кольцах; для каждого кольца подтверждена требуемая ось. Кнопки находятся в «Кольцах», в «Щелях» их нет; ряд компактный, ошибок в консоли нет. Проверка выполнена в отдельной вкладке пресета без изменения сохранённых настроек пользователя.
После переноса стартовых настроек пользователь увидел блокировку «нужен вид колец с вырезами» на «⟂ чёт/неч». В v0.1082 сохранилось старое ограничение «Щелей», а расчёт стартового положения цельных колец его не учитывал. Теперь все варианты доступны и в «T · все», и в «N щель», независимо от света. У цельных колец новый старт добавлен в общую геометрию: чётные кольца повёрнуты на четверть оборота, нечётные сохраняют вертикальную ось; такое же чередование получает кольцо за чертой. Положение одинаково для рисунка, разрезов, магнита и шариков. В цельном кольце левый и правый край совпадают в шве между последним и первым битом.
Память положения расширена на цельные кольца, включая К1 и кольцо за чертой, отдельно для каждого вида колец. Запись сохраняет текущий поворот и фазу без скачка, ручной поворот в режиме памяти запоминается сразу. Сохранение при общем повороте конуса также сохраняет положение. Остановка кольца за чертой больше не прибавляет его стартовый сдвиг повторно.
По следующему снимку пользователя удалены строки «Кольцо 1 / Кольцо 2» и четыре ручные кнопки «−½ / +½» из панели «Шарики», вместе с обработчиками и стилями. Выбор пути, точек и запуск остаются в панели.
115 тестов прошли. В Chrome проверена доступность пяти вариантов без света, реальные оси шести колец и направление разрезов «N щель» после сброса, запись памяти без скачка при кручении и общем повороте; ручных полушагов в панели больше нет, ошибок в консоли нет. Проверка выполнена в отдельной вкладке пресета. Пользователь попросил далее ограничиваться минимальными проверками по месту и оставлять ему основное интерактивное тестирование.
По снимку пользователя: «тут внизу ползунок был просмотр истории кручения». Ползунок сохранился, но его показывало только сочетание солнца и вырезов T−1. Теперь он виден в плоском Solarius для любого вида колец, независимо от солнца; до записи движения неактивен. Пульт, сброс и подпись цикла подняты на высоту ползунка с отступом, чтобы история помещалась под ними. Когда история скрыта, в том числе на телефоне, этот отступ не добавляется.
Ручной шаг записывает также исходное положение, поэтому можно вернуться к самому началу. Правило продолжения после перемотки сохранено: дальнейшее кручение начинает новую ветку от выбранного момента. По просьбе пользователя проверки минимальны: синтаксис zz-ui.js и один опыт в Chrome — три ручных шага на обычных кольцах без солнца, возврат ползунком с фазы 3 к 0 и обратно к 3. Ползунок активен, пульт его не перекрывает, ошибок в консоли нет; сохранённые настройки пользователя не менялись.
Пользователь попросил оставлять отскочивший шарик видимым на внешнем краю, если следующего кольца ещё нет, и сохранять все шарики при появлении нового кольца, особенно в «В центр». Завершившие движение шарики сохраняются отдельно от текущего запуска. При росте колец движущимся шарикам обновляется геометрия без нового опыта: положение, номер, скорость и пройденное расстояние сохраняются. Автоматический следующий запуск «В центр» добавляет новую группу к прежним шарикам и сохраняет счёт опыта и закрытый центр.
Добавлена кнопка «ПоглотБит», по умолчанию выключена. При включении шарик исчезает ровно в момент фактической записи нового значения 1 или 0 в бит, в том числе в кольцо за чертой; если значение уже записано, поглощения нет. Поглощённые считаются отдельно от застрявших. Переключение кнопки не сбрасывает движение.
По снимку «в режиме шариков не могу включить эти» снята зависимость частей К1 и «щель 1» от включения света. В расчёте шариков разрешены все формы первого кольца, включая три сектора, целый бит и один разрез. Целый бит не получает искусственной щели по шву; «щель 1» для шариков остаётся линией без ширины. Щель и части переключаются взаимно. «1 часть» доступна также в «вырезах 2n»: явный выбор целого бита заменяет стандартное полукольцо; без такого выбора прежняя форма режима сохраняется.
По уточнению «надо чтобы все когда закрыты тогда только» кольцо в «В центр» больше не закрывается после первого шарика. Учитываются все разные физические щели (совпадающие концы битов — одна щель): шарик, дошедший до закрытого центра, закрывает только свою; целиком кольцо закрывается после последней. Повторы не прибавляют закрытие. Частичный прогресс хранится в состоянии и переживает следующий запуск и рост колец; сброс и ручной выбор полностью закрытых колец его очищают. Закрытые щели отмечаются золотыми линиями и больше не пропускают новые шарики. Кнопка «закрыто» показывает, например, «К2 1/2». Прогноз учитывает такое же правило, а одновременные события видят состояние щелей до события, независимо от порядка шариков.
До последнего указания пользователя выполнены четыре точечные проверки сохранения и поглощения, а в отдельной вкладке Chrome наблюдались рост колец и сохранение завершивших и движущихся шариков «В центр». Затем пользователь поручил: «тестировать я буду, вноси только правки». После этого тесты, проверки синтаксиса и браузерные проверки не запускались; последние правки формы К1 и закрытия всех щелей оставлены для его ручной проверки.
Пользователь показал настройки и уточнил: применять только к ссылкам «В центр». Обновлены пять файлов пресетов: duga-v-centr, duga-v-centr-0, duga-v-centr-5, duga-v-centr-5-z3 и v-centr-rost. В них включены «удар: отскок», «ПоглотБит», «В центр» и «0 изнутри», закрыто 0, «Одновременно» выключено, кручение 0,6 бит/с (coneAutoSp = 6 при режиме «По 1»). В старой ссылке с суффиксом -z3 также закрыто 0, её название и подпись обновлены; сам адрес сохранён. Подписи карточек приведены к новым настройкам.
По следующему снимку: «когда шарик попадает на дугу уже 1 или 0 бита снаружи, то тоже должен оттолкнуться». Снаружи записывается 1 только в пустую ячейку. Уже записанные 0 и 1 не переписываются этим ударом и не поглощают шарик через «ПоглотБит»: при режиме отскока он разворачивается по своей прямой. Это действует также у закрытого центра, где раньше удар завершал движение. Учёт закрытия своей щели сохранён, но отражённый шарик не останавливается принудительно при полном закрытии кольца и продолжает наружу с прежней скоростью. Запись 0 при ударе изнутри остаётся отдельным правилом.
По действующему указанию пользователя выполнены только правки; тесты, проверка синтаксиса и браузер не запускались.
Пользователь сообщил, что при открытии нового кольца или смене движения после отскока теряется согласованность скоростей. При переносе кольца за чертой в строку теперь сохраняется его точная физическая фаза: не округляется до бита или половины части. Положение каждого прежнего шарика переносится по снимку геометрии в момент добавления, а не по углу последней отрисовки. Скорость, пройденный путь и накопленное время сохраняются.
Шарик, остановившийся на прежнем внешнем краю, после добавления внешнего кольца снова продолжает движение с того же стыка и своей прежней скоростью. Прежний временный вылет снимается со счётчиков, затем проверяется щель или удар о новое кольцо. Завершившие путь в центре и поглощённые шарики не запускаются заново. Дробление кадра вокруг стыков и отскоков теперь сохраняет исходные фазы и массив вращения колец: учёт оборотов больше не переходит на другую систему углов внутри кадра.
По указанию пользователя выполнены только правки; тесты, проверка синтаксиса и браузер не запускались.
Пользователь указал: шарик №3 после отскока должен выйти к К4, и уточнил, что отсутствующее К4 нужно сразу создать и продолжить движение. В режиме «В центр» выход к внешнему краю теперь создаёт следующее кольцо в момент прихода; прежние шарики продолжают со своими скоростями, новая группа при таком расширении не запускается. Пустые ячейки перенесённого кольца сохраняют маску пустоты. На новом стыке действует обычное правило щели или удара.
Исправлен сдвиг запуска между поколениями: когда завершение группы разрешает открыть следующее кольцо, время и фазы берутся в момент последнего события, а не в конце кадра. Остаток кадра досчитывается уже после нового запуска. При создании кольца выходящим шариком остаток кадра также сохраняется. Явная пауза «Одновременно» остаётся паузой.
Вопрос пользователя: откуда погрешности при построении симметрий. Найдены алгоритмические приближения: сетка времени в авто и отступ 15 % внутри найденного интервала, а также запуск по концу кадра. Подбор скорости теперь проверяет аналитически вычисленные моменты совпадений границ и середины интервалов между ними, где набор открытых вырезов постоянен. Убраны временная сетка и отступы. Если базовая скорость даёт максимальное число входов, сохраняется именно она. Расчёт по-прежнему использует числа JavaScript; полный переход на точные дроби оборота здесь не выполнен. Тесты, проверка синтаксиса и браузер не запускались по указанию пользователя.
Пользователь потребовал заменить десятичные расчёты нормальными дробями, в том числе в выводе и источнике положения для рисунка. Уточнил: по дуге нужна угловая скорость как доля полного круга, а не длина окружности с π; движение первого кольца само является временем, всё остальное считается относительно его кручения. Один оборот К1 принят за единицу модели. Часы кадров задают только темп ведущего кольца. К1 не останавливается настройкой «2 последних» или прежней заморозкой; остальные кольца сохраняют выбранное правило движения.
Добавлена арифметика сокращаемых дробей на BigInt. Фазы, границы, скорости, положения, моменты переходов, прогноз и подбор скорости рассчитываются дробями оборота. Щель проверяется точным равенством по модулю полного круга, без допусков и подбора приблизительного знаменателя. На прямой скорость задаётся в кольцах за оборот К1, на дуге — в долях полного круга за оборот К1; радиус и π в расчёте движения по дуге не участвуют. Круговая геометрия для холста получает числовую проекцию той же дробной модели.
Одновременные переходы считаются общей группой в точный момент события; нулевой переход на самом стыке не добавляет фиктивного ожидания. При открытии нового кольца и развороте остаток движения сохраняется, скорость не пересчитывается. Продвижение черты сохраняет фазы всех прежних колец и шариков. Стартовые положения и история кручения сохраняют точные значения рядом с проекциями для холста. Обороты, скорость, период и время опыта выводятся сокращёнными дробями относительно К1; приблизительные «≈» и секунды в статистике шариков убраны. Ползунок в режиме шариков показывает множитель темпа К1 относительно прежнего значения 30.
По прямому указанию пользователя выполнены только изменения файлов. Тесты, проверка синтаксиса и браузер не запускались.
Пользователь спросил, запускает ли каждое появившееся внешнее кольцо шарики в центр сразу. Ранее при расширении после обратного вылета продолжали только прежние шарики, а новая группа ждала завершения опыта. Теперь в активном режиме «В центр» при появлении нового внешнего кольца из его щелей сразу добавляется новая группа. Прежние шарики, их скорости, фазы, пройденные пути и статистика сохраняются. Скорость выбирается отдельно для новой группы; одна группа на каждое новое внешнее кольцо, без повторного запуска при перерисовке или завершении прежней группы. Остаток кадра движет обе группы. Пауза «Одновременно» не отменяется при добавлении следующей группы.
На снимке пользователя дроби содержали длинные числители и знаменатели. Убран источник лишних разрядов при передаче времени кадров: показания часов сначала переводятся в дроби, затем вычитание и деление выполняются точно, вместо преобразования уже вычисленного десятичного интервала. Произвольная пауза и исходные показания часов по-прежнему могут давать большие знаменатели; округления дробей и допусков попадания не добавлено. Единицей модели остаётся оборот К1.
По указанию пользователя выполнены только правки файлов. Тесты, проверка синтаксиса и браузер не запускались.
По файлу пользователя zazerkalius-vse-20261010-0948.json созданы две короткие ссылки-пресета для рассчитанных запусков «В центр»: «По биту» и «Встреч Бит». В обе перенесены положения и размеры окон, панелей и таблиц. Сохранены параметры расчёта: Кn имеет n разрезов, чётные и нечётные кольца расположены перпендикулярно, удар — отскок, «ПоглотБит» и «0 изнутри» включены, закрыто 0, автоматическая скорость и начало из К2. Масштаб 1/2 выбран пользователем отдельно: прежний JSON масштаба не содержал.
Масштаб, сдвиг рисунка и делитель радиального шага теперь входят в сохранённое состояние и восстанавливаются при открытии файла или ссылки. Сдвиг хранится в CSS-пикселях для экранов с разной плотностью. Экспорт из открытого пресета также запоминает текущий вид.
По указанию пользователя тесты, проверка синтаксиса и браузер не запускались.
Пользователь предложил отдельный опыт: вначале кольца целые, лишь К1 имеет вырез; шарик прорезает внешние кольца, отражается от внешней границы и идёт обратно с той же скоростью. На уточнение пользователь выбрал линию, вращающуюся вместе с К1. Добавлены галка «✂ нарезка» рядом с лучом и отдельный маршрут в панели шариков. Запуск — общий «▶ пуск», пауза сохраняет следы, возврат к старту очищает их. Скорость задаётся положительной дробью в толщинах кольца за оборот К1 и остаётся постоянной после отскока.
Нарезка считается точными дробями по событиям пересечения границ колец и внешнего отскока. След — участок с точно заданными радиусами и углами в материале своего кольца, поэтому он вращается с этим кольцом и может изгибаться при разной угловой скорости. Оранжевый — проход наружу, бирюзовый — обратно. После завершения прохода каждого кольца показываются отдельные проверки зеркальности следов и совпадения при повороте на половину оборота. При выбранной линии К1 шарик на возвращении проходит в тот же вырез К1 и остаётся видимым в центре; искусственный отскок от К1 не добавлен.
Пресет narezka-k1: четыре кольца, скорость 2/3 толщины за оборот К1, вращение по биту, раскладка из файла пользователя, масштаб 1/2. Остальные режимы запуска сохранены. По указанию пользователя тесты, проверка синтаксиса и браузер не запускались.
Пользователь: «сделай теперь отдельную страницу чисто для соляриус, но назовём её синхрофазотрон — это вообще не в зазеркалиусе будет страница, просто скопируй текущий соляриус» и «удали всё лишнее оттуда». Новая папка sinhrofazotron/: Zerkalius-sinhrofazotron.html и свои копии zz-core.js, zz-ui.js, zz-ball.js, zz-mobile.js — снимок последнего коммита Zazerkalius v0.1091 (рабочая копия в тот момент содержала незаконченную работу другой сессии — её не брали). Страница всегда открывает окно конуса («◯ Solarius», как ?solo=cone) без параметров в адресе; своя память sinhrofazotron_v1 (при первом запуске берёт настройки Соляриуса из Zazerkalius — ключ zazerkalius_solo_cone); своя версия v0.001; в шапке и вкладке — «Синхрофазотрон» вместо «Zazerkalius ◯ Solarius», без ссылки на Zazerkalius; пресеты по ?preset= читаются из ../zazerkalius/presety/; ссылка «🔗» собирается на эту страницу. Из левого меню убраны разделы Zazerkalius, не относящиеся к Соляриусу: «Шаблоны», «Построения», «Треугольник из строки», «Нарезать треугольник», «Заготовки» (остались «Оформление» и «Страница целиком»). Код этих разделов пока в копии — скрыт (CSS .sfz-off), вычищать его из zz-ui.js — следующими шагами. Дальше страницы правятся независимо: правки Zazerkalius сюда сами не попадают. В хабе — кнопка «Синхрофазотрон» последней в Черновиках (хаб v0.090).
Проверено в браузере: страница открывается конусом во весь стол, в шапке «Синхрофазотрон v0.001», в меню два раздела, память — sinhrofazotron_v1; пресет ?bg=0&preset=v-centr-rost открылся (строка «0», галка «● в центр»); ошибок в консоли нет.
Пользователь уточнил: начать только с К1, затем добавлять К2, К3 и следующие прямо в момент достижения шариком внешней границы, продолжая движение наружу. Режим больше не рисует заранее четыре кольца или пунктирное кольцо за чертой. Новое целое кольцо создаётся точно на событии; остаток кадра продолжает движение, скорость шарика и фазы существующих колец сохраняются. Рост можно выключить в панели шариков: тогда текущая внешняя граница отражает шарик внутрь.
На замечание об одинаковых скоростях вращения добавлены точки-метки с номерами колец и дробные подписи реальных скоростей: К1 — 1, К2 — 1/2, К3 — 1/3 оборота за оборот К1 при вращении по биту. Целые окружности раньше скрывали различие скоростей. Скорость шарика остаётся постоянной 2/3 толщины за оборот К1.
Пользователь попросил прямой вырез и подтвердил новое правило: после перехода шарик создаёт прямой радиальный вырез и едет по нему вместе с этим кольцом. Изгибающиеся следы прежней линии К1 заменены прямыми вырезами, закреплёнными в материале кольца. При обратном входе создаётся вырез на текущей линии; у К1 проверяется попадание в его исходный вырез, иначе шарик отскакивает наружу. Панель показывает точные положения вырезов и наличие симметричной пары через половину оборота. Возврат к старту восстанавливает исходное число колец и масштаб. Пресет обновлён, раскладка и масштаб 1/2 сохранены.
По указанию пользователя тесты, проверка синтаксиса и браузер не запускались.
Пользователь: «в режиме центр сделай, чтобы кольцо закрывалось только тогда, когда в него одновременно закрывают все его щели» (выбрано — в Синхрофазотроне), «мы там всё переделали на счёт дробями относительно оборотов колец», «никаких толщин и приближений, всё точно». Прежде (с Zazerkalius v0.1085) закрытые щели копились: шарик, пришедший в закрытый центр, закрывал щель своего кольца, и на последней щели кольцо закрывалось. Теперь щели, закрытые в один миг, собираются в пакете событий группы (batchCover в advanceInwardGroup: один пакет — события с точно равным временем, в дробях оборота); кольцо закрывается, только если в одном пакете закрыты все его щели. Частичное закрытие не запоминается — щели остаются открытыми и снова служат стартом. Щель засчитывается, только если шарик пришёл ровно в её разрез (точное сравнение дробей, без допусков).
Проверено на странице (копия движка с доступом к внутренним функциям, кадры по 1/60 через coneMotionAdvance): строка «1», К1 закрыт, у К2 щели −1/4 и 1/4 оборота. Два шарика с одного радиуса — пришли в один миг, К2 закрыт. Второй шарик на 1/4 кольца ближе — пришли в разные мгновения, К2 открыт, обе щели снова доступны для старта (ничего не запомнено). Снова с одного радиуса — К2 закрыт.
Пользователь: «можно удалить весь лазер — он не на дробях, и его переделывать будем», «аниматрицу тоже», «звук». В Синхрофазотроне убраны группы «Лазер», «☀ · ☾», «За чертой», «Алгоритм», «Алг. · подск.» (лазер), «Аним.» (Аниматрица) и «Звук», строка состояния Аниматрицы «проход · волна», лазерные кнопки «Строки 1» (☾ крестом, ⟋ нить, ☀☾, ☀/☾ оборот) и «Вида» (✦ попадания, ☀ сплошной, ☀ доли, ✳ лучи). Оставлены «Строка 1» и «Щели»: они задают форму колец (◐ 2 части, ✚ 4 части, вырезы T−1), по которой ездят шарики. После загрузки памяти или пресета луч-часы, веер, солнце, луна, нить и автозвук выключаются (Object.assign(Z, …) после load()), так что лазер не работает и в фоне. Скрыто CSS-правилом с весом выше, чем у #w-cone .tools > .cgrp; сам код лазера, звука и Аниматрицы пока в копии zz-ui.js — вычищать его по частям. Окно «Текст конуса и лог лазера» пока оставлено: в нём и описание колец.
Проверено в браузере: групп лазера, звука и Аниматрицы нет; пресет «В центр · кольца растут» — ▶ пуск, 2 шарика пошли, луч-часы и солнце выключены; ошибок в консоли страницы нет.
Пользователь: «открывать следующее кольцо только когда закроется внутреннее последнее», «закрытие только по возвращению шарика, смотрим что он нарежет». Автоматическое добавление кольца на внешнем краю убрано: там всегда отскок и обратный проход. Завершённые обратные проходы и принятые закрытия учитываются отдельно от нарезанных вырезов; наружный проход не закрывает кольца. Следующее кольцо доступно только после закрытия всех уже существующих.
На уточнение критерия закрытия пользователь ответил «пока не знаю». Поэтому автоматический критерий не введён: после полного обратного прохода последнего кольца доступна ручная кнопка «закрыть Кn → Кn+1». Она принимает закрытие как отметку этапа и добавляет одно целое кольцо; имеющиеся вырезы сохраняются. Закрытие пока не заполняет вырезы материалом. Если шарик уже вернулся в центр, он продолжает наружу с прежней скоростью и фазой; иначе продолжает текущий путь. Панель показывает возвраты, закрытия и точные положения вырезов, закрытые этапы отмечены бирюзовой окружностью. Новый пресет narezka-vozvrat сохраняет старт с К1, расположение окон и масштаб 1/2.
По указанию пользователя тесты, проверка синтаксиса и браузерные проверки не запускались.
Пользователь прислал файл «💾 В файл» zazerkalius-vse-20261010-0948.json (Zazerkalius v0.1090) со словами «вот такие сделай по умолчанию». Его состояние стало начальным состоянием Синхрофазотрона (ZZ_FACTORY в копии zz-ui.js): строка «0», «N щель», галка «● в центр», удар: отскок, «0 изнутри», кручение «По 1», скорость 6 (0,6 бит/с), раскладка групп конуса пользователя. Из файла сняты снимок ⭐ (home), лог лазера, откат раскладки панелей и окна Zazerkalius. Начальное состояние действует при первом запуске (своей памяти ещё нет — прежде, с v0.001, первый запуск брал Соляриус из памяти Zazerkalius) и по «✖ Сброс»; раскладка групп при сбросе теперь не снимается (у Zazerkalius ?solo=cone она снималась как раскладка целой страницы). Лазер, звук и Аниматрица, если были включены в файле, гасятся, как с v0.003.
Проверено в браузере: память Синхрофазотрона стёрта — страница открылась строкой «0», «N щель», галка «● в центр» горит, «удар: отскок», скорость 6, группы на местах из файла. Строки и режимы изменены, «✖ Сброс» — снова то же начальное состояние, 11 групп на своих местах.
Пользователь поправил опыт: «шарик не вылетает за 1 кольцо, пусть вылетает но пока только до 2го третье не делаем». К2 теперь появляется сразу при первом достижении шариком внешней границы К1, без закрытия К1. Момент перехода берётся точной дробью оборота К1, остаток кадра продолжается с той же скоростью, существующие фазы не меняются. К2 изначально целое; шарик создаёт прямой вырез и едет по нему с угловой скоростью К2.
На внешней границе К2 — отскок и возврат; функция роста ограничена единственным переходом К1 → К2, К3 не добавляется. Временная ручная кнопка закрытия с добавлением следующего кольца убрана. Нарезанные вырезы и отметки обратных проходов сохраняются для наблюдения; критерий закрытия по-прежнему не назначен. Новый пресет narezka-k2 начинает с одного К1, сохраняет расположение окон и масштаб 1/2.
По указанию пользователя тесты, проверка синтаксиса и браузерные проверки не запускались.
Пользователь: «это не для режима N щель — так вообще всегда один шарик, не закроются строки; режим В центр — T · все». В начальном состоянии (ZZ_FACTORY) щели — «T · все» (coneSlits: "all") вместо «N щель»; остальное из файла v0.004 без изменений. Проверено в браузере, память стёрта: «T · все», галка «● в центр», строка «0»; ▶ пуск — 2 шарика, К1 закрылся, К2 ушло в строки, запуск из К3. Дальше в этом прогоне К2 не закрылся: шарики из К3 ударили в дуги К2 (строка «11»), в обе щели К2 в один миг никто не пришёл — по правилу v0.002 кольцо стоит открытым, опыт остановился.
Пользователь: «он вернулся в центр, но не нарезал 2 щели во 2 кольце, значит отталкивается и снова идёт, когда 2 нарежет тогда стоп». Центр больше не завершает опыт: шарик отражается и выходит обратно по той же линии К1 с неизменной скоростью. Счёт отражений в центре показан отдельно.
К2 хранит точные положения полностью пройденных вырезов. Повторный проход по тому же вырезу не увеличивает число щелей: сравнение идёт по сокращённым дробям долей оборота без допуска. После полного прохода второй отдельной щели движение шарика и вращение колец останавливаются ровно в момент достижения границы К2; остаток кадра не добавляется. Результат и вырезы остаются видимыми, продолжение завершённого опыта не запускает вращение. Новый запуск или возврат к старту очищает результат. К3 по-прежнему не создаётся. Новый пресет narezka-k2-dve сохраняет прежнюю раскладку и масштаб 1/2.
По указанию пользователя тесты, проверка синтаксиса и браузерные проверки не запускались.
Пользователь сообщил: «шарик в центре залип», кольца продолжали вращаться. Обработка центра вынесена в отдельное событие: точная координата 0, кольцо К1, направление наружу. Момент отражения сохраняется в общем счётчике К1, оставшаяся часть шага сразу продолжает движение после отражения с прежней скоростью. Дополнительная проверка на входе в шаг отражает шарик, если состояние осталось на координате 0 с направлением внутрь.
В «Нарезке» перед шагом активного вращения снимается внутренняя пауза шарика, если опыт ещё не завершён: шарик следует состоянию общего кручения. Конечный стоп после двух полностью пройденных разных щелей К2 сохраняется, К3 не создаётся. Новый адрес пресета narezka-k2-otrazhenie открывает опыт с К1 заново. Исходники опубликованной v0.1096 прочитаны: разворот центра в них присутствовал; точная причина наблюдаемого залипания без запуска опыта не подтверждена.
По указанию пользователя тесты, проверка синтаксиса и браузерные проверки не запускались.
Пользователь показал К2 с двумя ровными разрезами и попросил продолжить: «в момент нарезки на Т разрезов открывай сразу 3 строку». Стоп после двух щелей К2 заменён ростом: К2 после двух полностью пройденных разных щелей сразу открывает целое К3, К3 после трёх — К4, и далее Кn после n разрезов — Кn+1. Первое К2 по-прежнему появляется при выходе из К1. Повторный проход по уже существующей щели не увеличивает счёт.
Точные положения и полностью пройденные вырезы теперь хранятся отдельно для каждого кольца. Новое кольцо создаётся на точном событии завершения разреза; шарик сохраняет свою скорость и направление, фазы прежних колец не сбрасываются, остаток шага продолжается сразу. Если разрез завершён при движении наружу, шарик сразу входит в новое кольцо; при завершении внутрь сохраняет обратное движение до следующего разворота. До готовности кольца его внешняя граница отражает шарик, в центре остаётся отражение без ожидания. На пределе CONE_MAX опыт останавливается. Новый пресет narezka-po-chislu сохраняет начало с К1, прежнее расположение окон и масштаб 1/2.
По указанию пользователя тесты, проверка синтаксиса и браузерные проверки не запускались.
Пользователь: «пусть шарик вылетит сразу из первого кольца не из центра а с границы», «когда строка 3 открывается сразу из 2х щелей 2 шарика второй строки (то есть 1 добавим)». Первый шарик теперь начинает на внешней границе К1, в положении его исходного выреза. На запуске появляется целое К2; начальный путь от центра через толщину К1 убран, длительность опыта начинается с этой границы. Превью до запуска также показывает шарик на границе.
При завершении двух разных разрезов К2 и появлении К3 формируется пара: прежний шарик №1 и новый №2 одновременно стартуют на внешней границе К2 из его двух щелей наружу в К3. Скорость первого не меняется, у второго такая же постоянная скорость. В последующих кольцах оба сохраняются, новые шарики автоматически больше не добавляются. На рисунке показываются оба шарика, их линии и номера; в статусе — их общее количество.
Расчёт нарезки теперь хранит положение и направление каждого шарика отдельно. За один шаг все шарики проходят до ближайшего точного контакта; одновременные контакты сначала вместе учитывают завершённые разрезы, затем открывают кольцо, что исключает зависимость роста от порядка шариков. При открытии К3 оба проходят остаток шага от общего момента старта. У каждого шарика своя ссылка на последний отрезок следа, чтобы два движения не дробили историю на запись для каждого кадра. Правило роста по n разрезам Кn, отражение от центра и прежняя раскладка с масштабом 1/2 сохранены. Новый пресет narezka-dva-starta.
По указанию пользователя тесты, проверка синтаксиса и браузерные проверки не запускались.
Пользователь сообщил, что второй шарик не появился, хотя К3 уже было видно. В v0.1099 функция роста сначала отрисовывала новое кольцо, а пара создавалась отдельным условием после возврата из неё. Создание пары перенесено внутрь события роста: при появлении К3 прежний шарик ставится на выход своей щели К2, второй добавляется на выход другой щели, затем отрисовываются кольцо и оба шарика вместе.
Запуск берёт две точные позиции из нарезанных щелей К2 и отмечается отдельным флагом, чтобы повторный шаг не дублировал второго шарика. Прежний объект шарика сохраняется, новый добавляется в общий список; проверка не зависит от условия «в списке ровно один». Перед шагом добавлена проверка незавершённого запуска пары, если К3 уже существует и у К2 есть две щели. В статусе показано «из щелей К2: 2», общее число шариков и их номера на рисунке сохранены. Новый пресет narezka-para-k2.
Исходники опубликованной v0.1099 прочитаны: код создания и рисования пары в них присутствовал. Точная причина отсутствия второго шарика в опыте пользователя без запуска не подтверждена. По указанию пользователя тесты, проверка синтаксиса и браузерные проверки не запускались.
Пользователь (после «отключил поглощение битами — всё встало»: без поглощения шарики отскакивали без конца, опыт не кончался): «надо сделать так, чтобы из внешнего кольца шарики не одновременно, но с одинаковой скоростью влетали по очереди, но через разные щели, и в итоге оказывались в центре и пропадали там, ведя себе счёт». Выбрано: по одному из каждой внешней щели; закрытие и рост колец в этом режиме убраны; общая скорость — авто под все щели. Теперь «● в центр» в Синхрофазотроне — выпуск по очереди (zz-ball.js: seqWindows, seqPlanMake, seqLaunchDue). Всё точно, дробями, время — обороты К1. Для каждой внешней щели ищутся моменты выпуска, при которых шарик с общей скоростью проходит все стыки ровно по щелям до центра: на первом стыке с разной скоростью колец моменты совпадения считаются формулой (разность скоростей × время ≡ разность углов), каждый проверяется полным точным путём (seqReach: lossPass на каждом стыке, без допусков); перебор — один полный период картины (все кольца снова на местах). Скорость: от базовой ×1, ×2, ×½, ×3/2… — первая, при которой путь есть у всех щелей. Выпуск строго по очереди: следующий — в ближайшее своё окно позже предыдущего. Шарики ждут пустыми кружками в своих щелях, выпускаются точно в свой момент внутри кадра, в центре исчезают (счёт «дошли»), биты не пишут, кольца не закрываются и не растут. Сообщение при запуске — скорость и моменты выпуска.
Найдено при проверке: при строках 0, 00, 000 и кольце за чертой из 4 ячеек («T · все», «По 1») путь до центра невозможен ни при какой постоянной скорости и ни в какой момент. Скорости колец 1, ½, ⅓, ¼ оборота за оборот К1: стык К4→К3 открывается только в целые моменты, К3→К2 и К2→К1 — только в «целое + ½»; шаг между стыками (ширина / скорость) должен быть сразу «целое + ½» и целым. Тогда выпуска нет, сообщение так и говорит. «Грязное» время от обычного кручения (кадры по часам) выпуску не мешает: окна стоят на чистых абсолютных моментах, выпуск — «окно минус сейчас».
Проверено в браузере, по кадрам: пресет «Синхрофазотрон · В центр · T все» (строка 0, 2 кольца) — 2 шарика, ×1, выпуск через 1/2 и 3/2 оборота К1, оба в центре (5/2 и 7/2), застрявших и отскоков 0; строки 0, 00 (3 кольца) — 3 шарика, ×1/2, выпуск 1/2, 3/2, 5/2, в центре 13/2, 15/2, 17/2 — все трое, застрявших и отскоков 0.
Пользователь: «и вариант, когда, если можно так вообще, чтобы в 1-е кольцо заходил только 1 шарик и, пока он не дошёл в центр, нельзя заходить в него, и так же для 2-го и…». Можно, и при общей скорости условие простое: у всех шариков одно расписание, сдвинутое на момент выпуска, в каждом кольце шарик ровно «ширина / скорость»; два шарика окажутся в одном кольце, только если выпущены ближе, чем это время. Значит, «не больше одного в каждом кольце» = следующий выпуск не раньше, чем через время одного кольца после предыдущего (вход в миг выхода предыдущего — можно). Новая галка «1 в кольце» (Z.coneBallOnePerRing) в «Гранях»; при ней очередь (seqPlanMake) берёт для каждого следующего шарика ближайшее окно не раньше «предыдущий + время кольца». В сообщении запуска — этот промежуток. По умолчанию выключена.
Проверено в браузере, по кадрам (каждый кадр — число шариков в каждом кольце): строки 0, 00, скорость ×1/2 (кольцо за 2 оборота К1). Без галки — выпуск 1/2, 3/2, 5/2, в одном кольце бывает до 2 шариков. С галкой — выпуск 1/2, 5/2, 9/2, в каждом кольце не больше одного, все трое в центре (13/2, 17/2, 21/2), застрявших и отскоков 0.
По уточнению пользователя убран обязательный одновременный запуск пары при появлении К3: первый шарик сохраняет свой путь, вторые сами не добавляются. «Цепочка» теперь действует и в «Нарезке». Три взаимоисключающие кнопки: след: проход — последний выпущенный полностью прошёл следующее после своего стартового кольцо; след: открытие — появилось новое внешнее кольцо; след: край — последний выпущенный отскочил от внешнего края. Пользователь выбрал именно внешний край, не внутреннюю дугу К1 и не центр. По умолчанию выбран проход; без Цепочки выпуск следующих выключен.
Следующий стартует наружу с внешней границы последнего завершённого внутреннего кольца, из следующей его прорезанной щели по очереди (К1 — исходный вырез), с точно той же постоянной дробной скоростью. Старые шарики продолжают движение без перемещения на новый старт и без удаления. Выпуск обрабатывается в точном событии внутри кадра, остаток движения продолжается для всех; предел цепочки — 64. Настройка сохраняется, варианты скрыты вне Нарезки. Пресет narezka-sleduyushchiy сохраняет прежнее расположение окон и масштаб 1/2, стартует с одного шарика и выключенной Цепочкой. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
Пользователь уточнил: «следующий всегда из центра появляется должен». Во всех трёх вариантах Цепочки новый шарик создаётся точно в центре (радиус 0), на исходном вырезе К1, и движется наружу с той же постоянной дробной скоростью, что предыдущий. Выпуск с границы завершённого внутреннего кольца и перебор его щелей убраны. Первый шарик по-прежнему стартует с внешней границы К1; остальные сохраняют текущий путь и положение. События выпуска — проход следующего кольца, открытие нового кольца и отскок от внешнего края — сохранены; подсказки уточняют старт из центра. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
На снимке с отсутствующим вторым шариком «след: проход» подсвечена, но сама «Цепочка» выключена. Выбор события раньше только менял настройку, не разрешая выпуск: подсветка создавала впечатление работающего режима. Теперь любая из трёх кнопок «след» сразу включает Цепочку; при её выключении все три варианта гаснут. Подсказки прямо говорят о включении. У нового пресета narezka-cep-centr Цепочка уже включена и выбран проход кольца: следующие появляются в центре с прежней скоростью, первый — с границы К1. Расположение окон и масштаб 1/2 сохранены. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
Пользователь с четырьмя строками получил «Не удалось запустить» и спросил: «нет вариантов?». При нынешнем положении колец — нет, ни при какой скорости. Раскладка «T · все» по центру: момент прохода стыка задаёт сдвиг соседних колец друг относительно друга, а шаг между стыками у шарика один (ширина / скорость), поэтому моменты стыков должны идти через равные промежутки; у строк 0, 00, 000, 0000 + кольца за чертой стыки внешних колец открываются в целые обороты К1, внутренних — в «целое + ½», равного шага нет. Варианты появляются, если повернуть кольца на полбита (перебор): К2 на полбита — ×1/12, путь у всех 5 щелей; так же К4; К1, К2 и К3 — ×1/6. С тремя строками и К2 на полбита — ×1/6 (вручную: шаг должен делиться на 2 и на 3). Таких медленных скоростей в списке не было (он доходил до ×1/8).
Теперь перебор скоростей — все дроби p/d (p ≤ 8, d ≤ 60), от ближних к базовой; при переборе проверяется только «есть ли хоть один момент» у каждой щели, все моменты — для выбранной скорости; предел поиска — 2,5 с. Если пути нет у всех щелей, ищется подсказка (seqSuggest): какие одно, два или три кольца повернуть на полбита, чтобы путь был у всех, — до 4 с. Сообщение вместо «Не удалось запустить» называет причину, а затем подсказку: «Вариант есть: повернуть на полбита К2 (кнопками ◁ ▷ в «Кольцах» или рукой) — тогда путь до центра у всех щелей при скорости ×1/12».
Проверено в браузере: 4 строки без поворота — причина и подсказка «К2 ×1/12» (поиск 5,5 с); 4 строки, К2 на полбита — 5 шариков, ×1/12, выпуск 0, 12, 24, 36, 48 оборотов К1 (3,5 с); 2 строки — 3 шарика, ×1/2, «1 в кольце», 0,1 с. Долгий поиск при 4 строках страница переживает замиранием — его стоит ускорить.
По снимку с К1 и К2 и просьбе «надписи колец убери» отключён вывод К1, К2 и далее на самих кольцах в Нарезке. Метки положения и движение сохранены. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
По просьбе пользователя добавлена кнопка «от пройденных». Каждый шарик запоминает кольца, из которых действительно вышел наружу. При включённой кнопке возвращение через их внешнюю границу запрещено: шарик сразу отражается наружу по своей текущей прорези, даже при точном попадании в щель, грань или исходный вырез К1. Первый уже вышел из К1 при стартовой позиции на его внешней границе; следующие из центра отмечают К1 только после выхода. Сам отскок от крайней границы не считается переходом в ещё не открытое внешнее кольцо. Скорость и уже выпущенные шарики сохраняются, переключатель действует в текущем опыте и сохраняется в настройках. Пресет narezka-ot-proydennyh включает новую кнопку и Цепочку с выпуском после прохода кольца; масштаб 1/2 и расположение окон сохранены. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
На предложение «сделать, чтобы подсказанный поворот ставился сам» пользователь ответил «да». Теперь при «▶ пуск» с галкой «● в центр»: если пути до центра нет у всех внешних щелей, а подсказка есть (какие кольца повернуть на полбита, v0.008), эти кольца сами поворачиваются на полбита (coneSeqTurnHalf: кольца строк — coneRot, кольцо за чертой — Z.coneFillTurn) и запуск повторяется (coneBallInLaunchAuto). Сначала сдвиг в ту сторону, что в расчёте; не дал пути всем — кольца возвращаются, пробуется другая сторона; не вышло и так — кольца остаются как были, сообщение об этом. После поворота сообщение: «Повернул на полбита К2 — теперь путь до центра у всех 5 щелей, скорость ×1/12». Стартом опыта (↩ старт) становится уже повёрнутое положение.
Проверено в браузере: строки 0, 00, 000, 0000, кольца на местах, «1 в кольце»; ▶ — К2 повернулось на полбита, 5 шариков, ×1/12, выпуск через 0, 12, 24, 36, 48 оборотов К1; по кадрам все 5 дошли до центра (около 109 оборотов К1), застрявших и отскоков 0. Поиск с поворотом занимает около 5,5 с — страница на это время замирает.
После удаления надписей К1, К2 и далее пользователь показал оставшуюся тёмную точку. Теперь убраны и сами точки меток колец, вместе с вычислением их положения. Шарики и их номера, прорези и границы колец сохранены. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
По просьбе «первый пусть тоже из центра вылетает» первый шарик создаётся в центре, на исходном вырезе К1, с прежней постоянной скоростью. Предварительный показ шарика до запуска — тоже в центре. При старте с единственным К1 кольцо К2 появляется в точный момент выхода шарика из К1; прежний мгновенный перенос первого в К2 убран. К1 отмечается пройденным только при действительном выходе, как для остальных шариков, в том числе для кнопки «от пройденных». Подсказка режима обновлена. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
Пользователь: «внутренние кольца не меняем: если мы уже прошли из 3 в 1-е, то к 2→1 добавили 3→2, так?» Да: путь наращивается снаружи, каждое новое внешнее кольцо добавляет один стык спереди, и его надо поставить в тот же ритм (шаг s у шарика один). Прежде (v0.008–v0.009) подсказка могла повернуть внутреннее кольцо (К2). Теперь поворачивается только самое внешнее кольцо (seqSuggest: одно кольцо — внешнее); поворот кольца за чертой — дробный (Z.coneFillFree), и «+» переносит его в строку без округления до ячейки (прежде полбита округлялись в 0 и ломали стык). И «пусть сначала повернёт, чтоб посмотреть»: «▶» при недостающем пути только поворачивает внешнее кольцо на полбита и останавливается (без запуска и без кручения, "hold"), сообщение — что повёрнуто и какая будет скорость; следующий «▶» — запуск. Проверка без запуска — zzBallSeqCheck.
Ускорение: скорости перебираются сначала ×1, ×1/2 … ×1/60 (решения почти всегда такие), потом остальные дроби; общий предел поиска — 3 с плюс 3 с на подсказку, проверяется и внутри перебора моментов; при включении кручения движок больше не повторяет тот же поиск (было удвоение).
Проверено в браузере, наращивание «+» от строк 0, 00, кольца внутри не меняются: 2 строки — ×1/2; 3 — первое «▶» повернуло внешнее К4 на полбита, второе — 4 шарика ×1/6; 4 — К4 сохранило свои полбита, поворот не нужен, 5 шариков ×1/12; 5 — 6 шариков ×1/60; 6 — пути нет в пределах ×1/60 (поиск около 6 с). Шаг растёт быстро (1/2, 1/6, 1/12, 1/60 — как общий период колец), при 6 строках нужна ещё более медленная скорость.
Пользователь: «не понятно, как повернуть на полбита 3-ю строку? или только 4-ю? где кнопка». Объяснено: третью строку не поворачивают; при трёх строках внешнее — кольцо за чертой К4, и поворачивается только оно — «▶ пуск» делает это сам (первое нажатие — поворот «посмотреть», второе — запуск); при «+» К4 уходит в строки вместе с поворотом. Кнопки на полбита не было: «◁ ▷» в «Кольцах» поворачивают на целый бит (в подсказке v0.008 было ошибочно «кнопками ◁ ▷»). Новая кнопка «½ бита внешнего» в «Гранях» под «1 в кольце»: щелчок — внешнее кольцо (за чертой) на полбита вперёд, правая кнопка — назад; внутренние не меняются; сообщение — есть ли теперь путь до центра у всех щелей и при какой скорости (zzBallSeqCheck). Проверено в браузере: строки 0, 00, 000 — щелчок: «внешнее К4 повёрнуто вперёд — путь до центра у всех 4 щелей при ×1/6»; правая кнопка — назад, «путь у 0 из 4».
Пользователь уточнил: выход первого из К1 в К2 уже является краем; каждая толщина кольца даёт край для кнопки «след: край». Выпуск перенесён с отскока у крайнего внешнего кольца на достижение последним выпущенным шариком любой границы кольца с ненулевым радиусом. Теперь К1→К2 запускает второй из центра, следующий дошёл до края — запускается третий; проход через щель, открытие кольца или сам отскок не обязательны. Центр не считается краем очередной толщины. Другие два события и постоянная скорость сохранены. Подсказки обновлены, включая устаревшую подсказку самой Нарезки. Пресет narezka-kazhdyj-kraj включает Цепочку и вариант «край», сохраняет отскок от пройденных колец и прежний вид. Тесты, проверки синтаксиса и браузер не запускались по указанию пользователя.
Пользователь: «а у нас в 3-е кольцо попадают все три шарика через 1 проход из 2-х у второго; а если сделать постоянные проходы, то чередовались бы» — и на вопрос «кольца при этом стоят всегда?» ответ: нет, кольца всё время крутятся (в «По 1» каждое — на свой бит за оборот К1), поэтому всё и решают моменты. Проверено: при строках 0, 00 все три шарика входили в К2 через первую из двух его щелей — очередь брала самые ранние моменты. Выбрано: постоянный поток, чередование во всех кольцах по кругу.
Новая галка «⟳ поток по кругу» (Z.coneBallFlow) в «Гранях»: шарики вылетают без конца, внешние щели — по кругу; в каждое внутреннее кольцо шарики входят через его щели по кругу (К2 — через раз, К3 — по три и т. д.). Строгое «шарик n — щель n» во всех кольцах сразу часто невозможно (выбор щели в К3 и К2 связан с внешней щелью), поэтому у каждого кольца и у внешних щелей — свой начальный сдвиг и направление обхода (seqFlowOrders); берётся первое сочетание, при котором весь цикл (НОК числа щелей) достижим. Скорость общая — первая, при которой это возможно. Каждый шарик выпускается в ближайший свой момент (с «1 в кольце» — не раньше предыдущего + время кольца); путь каждого заранее известен точно (seqTuple: номера щелей входа). Дошедшие уходят из списка, счёт «дошли» — общий (run.reachedCenter). Убраны шарики-заготовки в щелях во время очереди (они путали подсчёт и рисунок; ждущие — пустые кружки).
Проверено в браузере, по кадрам, с «1 в кольце»: строки 0, 00 — ×1/2, цикл 6, внешние 1, 2, 3…, К2 чередуется, в каждом кольце не больше одного, 6 из 6 в центре; строки 0, 00, 000 (внешнее на полбита) — ×1/6, цикл 12, внешние 1…4, К3 по кругу трёх щелей, К2 через раз, не больше одного в кольце, 12 из 12 в центре; застрявших и отскоков 0. Без поворота внешнего при трёх строках поток невозможен — сообщение предлагает «½ бита внешнего». Пресет sinhro-potok.
Пользователь: «пусть, когда проходит, закрасит пройденный путь своим цветом, каждый шарик разный». В «● в центр» у шарика № n свой цвет (оттенок по золотому углу: 137,5° × n — соседние номера заметно разные), им же рисуется сам шарик. След — отрезки щелей, по которым шарик ехал: кольцо, грань в системе кольца, от радиуса входа до радиуса выхода (полный отрезок кольца, если прошёл насквозь; в К1 — до центра). След прикреплён к кольцу и крутится вместе с ним, поэтому видно, через какие щели какой шарик прошёл; при чередовании щелей разные цвета ложатся на разные щели. Следы хранятся до 3000 отрезков и сбрасываются с новым опытом (trailTrack, trails в zz-ball.js; рисуются под шариками).
Проверено в браузере: пресет «Синхрофазотрон · поток по кругу», 12 оборотов К1 по кадрам с отрисовкой — шарик 1 оставил зелёный след (К3 → К2 → К1), шарик 2 — фиолетовый, по другой щели К2; следы поворачиваются с кольцами.
Пользователь: «пусть шарик из середины бита идёт, и если в центр попадает, то откуда исходил — там 1, а если нет вариантов — 0; если нет вариантов всех в центр, ищется самый ближайший: 4 не получается — ищется 3 в этом кольце, потом 2… 1 точно всегда будет; хотя середина бита ничего не меняет, но так смотреть проще». Новая галка «из середины бита» (Z.coneBallFromBits) к «● в центр»: старты — середины бит внешнего кольца (cellStarts); скорость — общая, при которой до центра доходит больше всего бит (все; иначе наибольшее число); биты внешнего кольца получают 1 (путь есть) или 0 (нет) (zzBallOuterBits; кольцо за чертой — без автопереноса в строки); шарики из «единиц» вылетают по очереди и исчезают в центре в счёт. Поворот внешнего на полбита в этом режиме не делается — ищется наибольшее число.
Проверено в браузере: 2 строки — ×1, биты 111, 3 из 3 в центре; 3 строки (без поворота) — ×1/6, биты 1111, 4 из 4 в центре. Середина бита на деле меняет: старт из середины — то же, что старт из щели, повёрнутой на полбита, поэтому при 3 строках проход есть без поворота. Но «1 точно всегда будет» — не так: при 4 и 5 строках (внутренние кольца не повёрнуты) ни из одного бита пути нет ни при какой скорости — внутренние стыки уже не в ритме (К2→К1 и К3→К2 открываются в «целое + ½», К4→К3 — в целые), и путь рвётся внутри, откуда бы шарик ни шёл. Исправлено: и при «нет пути» в биты пишутся нули.
Пользователь попросил отличать левую и правую боковые грани каждого бита и записывать результат по порядку их прохождения, включая ручное вращение, для всех режимов колец. В группе «Грани» добавлены независимые кнопки «Л / П грани» и «Л→П 1 · П→Л 0». Левая грань со стороны против часовой — бирюзовая сплошная, правая по часовой — оранжевая пунктирная. На общей границе соседних битов цветные штрихи разнесены только на рисунке; расчётные углы совпадают. Отрисовка подключена к плоским кольцам и проекции объёма.
Новый модуль zz-faces.js хранит входную грань отдельно для каждого источника и физического бита. Полный проход слева направо записывает 1, справа налево — 0; первый контакт лишь запоминает вход, возврат через ту же грань ничего не записывает. Пересечения вычисляются сокращёнными дробями оборота и упорядочиваются по точной доле шага, без углового допуска. Одновременные противоречащие записи в один бит не выбираются по порядку обхода массива. Старое окрашивание по касанию при включённой новой записи отключено. Источники: лазер и веер, фронты солнца и прямой луны, нить, сквозной луч и движущиеся шарики. Сплошное освещение без движущейся границы порядка прохода не задаёт.
Учтены обычные ячейки, вырезы и части первой строки, ячейки предыдущей строки, прямые разрезы «Нарезки». Ручной поворот и шаг сохраняют физические грани бита вместо циклической перестановки строки. История кручения и откат сохраняют незавершённые проходы; просмотр истории не записывает новые биты. Добавлен пресет grani-poryadok: три кольца, солнце, обе кнопки включены, прежняя раскладка окон и масштаб ×1/2. По просьбе пользователя тесты и проверка в браузере не запускались.
Пользователь попросил включить «Блок» и «Через 1» в панели «Щели» для 2T. Снята блокировка этих кнопок в 2T. В этом виде кольцо из n исходных битов имеет 2n ячеек: «Блок» размещает инверсию бита j в ячейке j+n, ровно напротив исходного; «Через 1» размещает исходный бит в ячейке 2j, его инверсию — в 2j+1. Копии берутся из того же кольца и обновляются с исходной строкой. Для T−1 сохраняется прежнее заполнение из предыдущей строки.
Обновлены плоский рисунок, полукольца К1 с солнцем и без него, торы, границы ячеек, выбор исходного бита при щелчке по инверсии и новый режим записи по двум граням: проход инверсной ячейки записывает обратное значение в исходный бит своей строки. Пресеты 2t-inversiya-naprotiv и 2t-inversiya-cherez-1 сохраняют раскладку окон и масштаб ×1/2. Обычная трассировка света остаётся прежней, как у существующего вида заполнения; новая запись по граням учитывает инверсные ячейки. Тесты и браузерная проверка не запускались по просьбе пользователя.
Пользователь попросил считать балансы по всем кольцам в каждой четверти и пересчитывать их прямо при вращении строк; затем уточнил: отдельное включение, по умолчанию выключено. Под общей парой балансов у оси добавлены три такие же треугольные кнопки: ⚖ подсчёт, ◇ подсветка, ⟳ вращение осей. Все три независимы и изначально выключены; включённый режим включает видимые оси. Выбор и угол оси запоминаются.
⚖ показывает в четырёх четвертях сумму единиц и нулей и разность Δ = единицы − нули по всем строкам перед горизонтом. Ось делит пересечённый бит пропорционально его угловым долям: он не дублируется, сумма четвертей сохраняет число битов. Учитываются повороты колец и всего рисунка, вырезы, деление первого кольца и наклон осей. Кольцо-черновик за горизонтом в сумму не входит.
◇ сравнивает отдельно единицы и нули. Равные соседние четверти обведены золотом, противоположные крест-накрест — голубым; оба совпадения — зелёным. Во время ручного вращения текущего кольца и при автоматическом вращении для текущего кольца вместе со всеми внутренними сравниваются левая и правая, верхняя и нижняя половины: при неравенстве эта группа подсвечена красным. ⟳ позволяет тянуть пунктир оси вокруг центра; привязка использует включённые магниты границ, середин и симметрии битов, режим «границы» и отключение магнитов. Двойной щелчок по оси возвращает вертикаль. Балансы, подсветка и вращение оси работают в плоском виде.
Проверен синтаксис изменённого JavaScript и встроенных скриптов страницы, а также git diff --check. Браузерная проверка остаётся пользователю по правилу проекта.
Пользователь попросил сначала закончить балансы локально: «по кнопке ещё поворачивает все кольца так, чтобы балансы были равные в четвертях, если возможно», повороты только по магнитным осям симметрии; подписи отодвинуть от оси и сделать цифры ярче, особенно при равенстве четырёх сторон.
Четвёртый треугольник ≋ под общей парой балансов включает подсчёт, подсветку и оси, останавливает автокручение и ищет сочетание положений колец. Кандидаты берутся из того же набора осей рисунка coneRingSymAxes, что используют магниты симметрии, и совмещаются с текущим крестом. Биты не меняются; стоящее кольцо можно оставить на месте. Кольца без найденных осей остаются неподвижными. Сравниваются отдельно суммы 0 и 1 каждой четверти.
Сначала быстрый подбор, затем перебор с отсечением недостижимых сумм. Лимит — около 3,5 с или 120 тысяч узлов; поиск отдаёт управление интерфейсу. Решение применяется целиком только после нахождения и повторного расчёта фактических сумм. При неудаче кольца остаются на месте; полный перебор отличается в сообщении от исчерпания лимита. Изменение колец или оси во время поиска отменяет устаревший результат. Повороты сохраняются в точном состоянии движения.
Подписи четвертей отодвинуты от оси примерно на 25–30 px в обычном положении. Разность и суммы стали жирнее и ярче, нули не затемняются так сильно. Когда равны все четыре четверти, цифры и рамки светятся зелёным даже без отдельного включения подсветки. Изменения оставлены локально для проверки пользователем; разделение кода пока отложено.
Пользователь попросил убрать лишнее из файла и оставить лазер. Удалены 23 скрытых окна Zazerkalius: зеркало, указатели, спуск, цикл, GF(2), линейная сложность, лента, орбита, поправка, сложение, BWT, сигнал, проверка, лесенка, адрес, разложение, таблица лесенок и старые балансы, пирамида, октаэдр, развёртка, ромбоиды, общая справка. Вместе с ними удалены обработчики, отдельные рендереры, стили, неиспользуемые функции математического ядра и 47 старых настроек по умолчанию. Перерисовка вызывает только поле строк, его оформление и рабочий конус.
Сохранены кольца и их геометрия, точные дроби движения, магниты, новые балансы и автобаланс, шарики, 3D, запись, сохранение сессий, треугольный редактор панелей и весь код лазера. Прежнее начальное выключение лазера осталось. Статическая проверка зависимостей не выявила новых неопределённых имён; проверены синтаксис JavaScript и diff. Браузер проверяет пользователь. Правка и архив остаются локально.
По уточнениям пользователя подписи четвертей теперь — только текст: разность Δ и рядом суммы единиц и нулей, без префиксов «1:» и «0:», рамок, отдельных фонов и значков равенства со стрелками. Числа стоят в четырёх углах сразу за последним кольцом, следуют за центром, масштабом и поворотом осей. Нижний блок кручения и сброса опущен до края холста; история расположена над ним.
Цветом залиты все четыре четверти всего поля холста, а не только области возле чисел или кольца. Разным балансам соответствуют разные цвета; любые равные пары, соседние или крест-накрест, получают одинаковый цвет. При равенстве всех четырёх четвертей заливка и разность зелёные, заливка ярче. Сравнение ведётся отдельно по единицам и нулям. Цвет пересчитывается при вращении колец и осей; треугольные переключатели сохранены.
Добавлен выключенный по умолчанию треугольник ⏸: автокручение останавливается при равенстве всех четырёх четвертей по единицам и нулям. Для плавного движения ищется совпадение внутри кадра по пересечениям границ битов с осями, для шагов и магнитов проверяется достигнутое положение. Продолжение через ▶ пропускает текущее равенство и ждёт следующего.
≋ сначала ищет общий баланс; если решение не найдено, подбирает равную пару четвертей по циклу — четыре соседние пары и две противоположные. Следующее нажатие продолжает цикл. Кандидаты по-прежнему ограничены включёнными магнитами симметрии, биты не меняются. Найденный результат проверяется перед сохранением, при расхождении исходные повороты восстанавливаются. Перебор ограничен по времени и числу узлов.
Проверены синтаксис четырёх JavaScript-файлов и встроенных скриптов страницы, статические зависимости после удаления скрытых окон и git diff --check. Функциональные тесты и браузер не запускались по просьбе пользователя. Правки и архив локальные.
По снимку пользователя четыре подписи балансов немного отодвинуты наружу: отступ от последнего кольца увеличен с 6 до 24 px по радиусу. Сохраняются привязка к центру и масштабу рисунка, повороту осей и ограничение краями холста. Правка локальная, просмотр остаётся пользователю.
По просьбе пользователя каждая из четырёх полуосей отдельно сравнивает балансы прилегающих четвертей. Между одинаковыми заливками прозрачность пунктирной оси снижена с 0,7 до 0,12; между разными четвертями сохранена обычная яркость. При равенстве всех четырёх четвертей приглушён весь крест. При отключённой заливке оси рисуются с прежней яркостью; привязка к магнитам и перетаскивание сохранены.
По просьбе пользователя перенесены последние правки Соляриуса v0.1110: «Блок» в 2T размещает инверсию каждого своего бита напротив него, «Через 1» чередует исходный бит и его инверсию. Копии следуют исходной строке; щелчок по копии выбирает её источник. Для T−1 сохранено заполнение из предыдущей строки. Перенесены плоский рисунок, полукольцо К1 с солнцем и без него, торы и запись по двум граням из v0.1109. Новый модуль zz-faces.js: вход слева и выход справа дают 1, справа налево — 0; инверсная ячейка записывает противоположное значение в исходный бит. Состояние записи входит в историю. Оба режима граней изначально выключены.
Балансы, подсветка, пауза и автоподбор учитывают физические инверсные ячейки 2T. Автобаланс сохраняет биты и синхронизирует наблюдение граней после применения позы. В подсказке ≋ показаны оставшиеся типы пар до конца круга из шести, следующая пара, число сочетаний магнитных поворотов с разными балансами в последнем подборе и сколько ещё не проверено для общего равенства. Кандидаты явно отделены от числа решений; отсечённые недостижимые сочетания учтены.
«↩ старт» перемещён слева от нижнего пульта, темп — ползунком справа, чуть выше ромбов. История поднята под верхние кнопки: появляется при изменении поворота, исчезает через две секунды, остаётся видимой под курсором и во время перетаскивания. Записывается и ручной поворот; сама перемотка сохраняет записанное продолжение до следующего вращения. Нижние режимы «Всё / По 1 / Встр.стр / Встр.бит / 📍» всегда видны, в том числе при вращении: полоса-трапеция прижата к нижнему краю. На узком холсте пульт располагается над ней.
Выбор T / N / 2T−1 / 2T / меж / сим стал перетаскиваемым столбцом небольших ромбов без картинок: только сокращённые подписи, полные подсказки и подсветка обводки при наведении. Тяни любую кнопку; правый щелчок возвращает столбец на место. Чётность, центр, левый и правый край и память — треугольниками выше справа от балансов. Треугольники балансов, выравнивания, масштаба и сброса увеличены на 25%. В делении первого кольца убрана отдельная жёсткая чёрно-белая заливка: применяется общая палитра 0 и 1; геометрия затвора и свет не меняются.
Новый выключенный по умолчанию переключатель ⊙ строит по одному производному кольцу в центре каждой четверти из долей её битов всех строк. Пока выбран вариант «одно кольцо», о котором пользователь был уведомлён. Центры берутся по площади четвертей холста, в том числе при наклонённых осях. Разрезанный бит сохраняет свою долю, суммы совпадают с балансами. Вид колец наследует текущий выбор; заполнение инверсиями 2T также учитывается. Состав пересчитывается при вращении колец и оси. Рисунок вынесен в отдельный модуль zz-quarters.js; исходные строки не меняются.
Правка оставлена локально. Проверены синтаксис шести JS-файлов и встроенных скриптов, загрузка новых модулей, статические зависимости и git diff --check. Функциональные тесты и браузер не запускались по просьбе пользователя.
По снимкам и просьбам «сделай побольше», «бегунок ромбом», «подлиннее ползунок», «кнопку ниже», «раздвинь немного чтоб не наезжали» и «их также треугольниками»: ползунок темпа увеличен до 36 px по высоте и до 380 px по ширине, бегунок — золотой ромб 30 × 30. Число имеет постоянное место и ширину. «↩ старт» увеличен и опущен ниже темпа. Между ромбами шагов и пуска, а также между пуском и сбросом оставлены зазоры; полоска режимов отодвинута от пульта. На узком холсте темп и старт занимают отдельные ряды выше пульта, режимы — ряд снизу.
Кнопки «Всё / По 1 / Встр.стр / Встр.бит» и память положений — отдельные треугольники с промежутками, подписи у основания. Пуск — зелёный, шаги и старт — синие, сброс — красный, темп — золотой; внутренние заливки стали заметнее, выбранный режим выделен светлой бирюзой. Запуск и функциональные тесты оставлены пользователю; проверены только синтаксис изменённого JS и отсутствие ошибок в diff. Ранее сохранённая местная «лесенка» остаётся отдельной незакоммиченной правкой.
«Поправь кнопки, приведи в один вид с верхними треугольниками». Образец — ряд над конусом (баланс-инструменты и ч/н ▥ ◧ ◨): треугольники 60 × 30 вплотную, плоская заливка, знак у основания. Нижний пульт стал его зеркалом: ↩ старт · ◀ · ▶ · ▶ · ⌖✕ одним рядом остриём вверх на нижнем крае холста, ▶ «крутить» — на оси конуса. Серые, как ⏸ ↻ ≋; крутится — золото; режимы «Всё / По 1 / Встр.стр / Встр.бит / 📍» — зелёные, как ч/н. Ромбы, шестигранник старта и красная заливка сброса сняты (сброс краснеет только при наведении). Притухание соседей при наведении у пульта убрано — у верхнего ряда его нет. Если пульт попадает на свёрнутую группу у нижнего края («3D»), он встаёт над ней.
«Не работает и ширину в 2 раза больше»: у самого ползунка темпа была ширина 0. Коробки старта и темпа создавались с классом lpw, и общий проход lpTools сцеплял их треугольниками, задавая метке ширину 138 px с !important; стрелки и число съедали всё, дорожки не оставалось, щелчок ставил минимум. Класс снят, ширина — 600. Вид — по ползункам «Пирамиды» («тут ползунки хорошие»): дорожка — плоский ромб-контур золотом с вершинами у бегунка, стрелки — треугольники в её остриях, бегунок — ромб, число рядом.
Название страницы и кнопка в хабе — «примерно таким», по снимку строк Зазеркалиуса: биты букв ромбами ▼▲ на треугольной сетке, как вид «◇ бит» (так же устроен логотип Зазеркалиуса). В присланном наборе строк было «Синхофазатрон» — слово собрано заново из тех же букв: «р» взята из «трон», второе «а» заменено на «о». В хабе кнопка на две колонки («повыше, в длину бы»); подписи data-en / data-ru у неё сняты, иначе смена языка затёрла бы картинку текстом. Код соло-режима, писавший в заголовок текст, больше его не трогает.
Верхний ряд: «все эти жёлтые треугольники наверх прижми, а балансы опусти ниже; + и − сделай ромбами под треугольники; оси ромб побольше и между треугольников». Шесть треугольников (⚖ ◇ ⏸ ⟳ ≋ ⊙) стоят на верхнем крае холста, стык третьего и четвёртого — на оси конуса. Ромб осей стал 30 × 30 и вписан ровно в зазор между ними: вершина у края, бока лежат на сторонах соседей. Балансы 1 и 0 опущены под ряд, − и + масштаба — ромбы 30 × 30 по бокам от них (были треугольники «в замок»). Лента истории теперь встаёт ниже балансов.
Столбец T / N / 2T−1 / 2T / меж / сим — «привяжи к оси горизонта, и рамки надо, а то незаметно на фоне». Середина столбца стоит на горизонтальной оси конуса и ездит с ней при сдвиге и масштабе. Перетаскивание запоминает сдвиг от оси (новый ключ coneRingModesAx; прежнее абсолютное место coneRingModesXY больше не читается), правый щелчок возвращает на ось. У ромбов постоянная голубая обводка.
Нижний пульт — «цветами прозрачными отдели кнопки: плей зелёным, стрелки синим, сброс красным», «старт — зелёным». Заливки полупрозрачные. ▶ — «с обводкой, побольше, чтоб стала за счёт неё»: 72 × 36 с ярко-зелёной рамкой, значок зелёный («не белым — сливается со стрелками»). Кнопки разной высоты стоят на одном нижнем крае. Режимы — «уныло… буквы заглавные, сократи по максимуму, обводку и цвет — жёлтым, как ползунок»: золотые треугольники с обводкой, подписи ВСЁ · ПО1 · ВС · ВБ (полные — в подсказках).
Выделение строки в списке — «отмени выделение осветлением, наоборот сделай затемнением»: текущая и выбранная строки темнее фона (были с подмесом сиреневого и голубого). Балансы четвертей — «фон потемнее: цвет как сейчас, а фон вообще чёрный, попробуй как-то»: под цветами четвертей холст заливается чёрным, сами цвета чуть плотнее (0,17 / 0,24 вместо 0,13 / 0,19).
«+ − размером чуть меньше, чем ромбы из треугольников, и между треугольниками с отступами поместить». Ромбы масштаба стали 46 × 46 (ромб из двух треугольников ряда был бы 60 × 60) и встали в крайние зазоры верхнего ряда — между ⚖ и ◇, между ≋ и ⊙; средний зазор занят ромбом осей. Их стороны параллельны сторонам соседних треугольников, отступ ровный, около 4 px; низ ромба выходит под ряд. Крайние зазоры выбраны, чтобы не наезжать на балансы под осью. Без верхнего ряда − и + по-прежнему стоят по бокам от балансов.
«+ и − выдели цветом синим и оранжевым»: + — синий, − — оранжевый, полупрозрачной заливкой.
«Проверь мобильную версию, чтобы все кнопки норм были и масштаб работал» — проверено в эмуляции телефона 390 × 844 с касаниями. Найдено и исправлено три вещи. (1) Старт и темп — коробки .tools, а на телефоне все .tools тела окна прячутся (пока меню свёрнуты) или становятся static; с v0.022 темпа на телефоне не было совсем. Теперь они видны и стоят на холсте над пультом. (2) Ряд ч/н ▥ ◧ ◨ 💾 не помещался справа от треугольников, вставал на верхний край и сталкивал их вниз: ромб оси выпадал из зазора, балансы закрывались. Теперь на узком холсте он уходит под треугольники, балансы и ромбы, к правому краю; на широком — как был, справа на том же крае. (3) Щипка не было вовсе: холст глушит щипок браузера (touch-action: none), а своего не было, масштаб на телефоне — только кнопками − +. Добавлен щипок двумя пальцами — масштаб вокруг середины между пальцами, как колесо вокруг курсора. Второй палец отменяет начатое первым (поворот кольца или сдвиг) через pointercancel. Проверено: − и + касанием (1 → 1,25 → 1), щипок (×3 и обратно), темп пальцем.
«В телефоне какие-то кнопки непонятные» → «да, всё делай». Полоса под холстом (zz-mobile.js, осталась от мобильного Соляриуса): «▶ крутить» снята — то же, что ▶ на холсте; «2 кольца» снята — одним касанием заменяла все строки на 1 и 11 и перезагружала страницу. Остались «↻ направление» (стрелка показывает текущее) и «● шарики на старт» — прежде «↻ вправо» и «● ↩».
Подсказка по долгому нажатию пальцем: наведения на телефоне нет, и значки ⚖ ◇ ⏸ ⟳ ≋ ⊙, ч/н ▥ ◧ ◨, T N 2T…, ВСЁ ПО1 ВС ВБ было не понять. Держишь кнопку окна ~0,45 с — над ней всплывает её подсказка (первый абзац title); отпустил — кнопка не срабатывает, системное меню удержания подавлено. Кнопки, у которых удержание — само действие (− + масштаба, стрелки ползунков), не участвуют.
«Надо скрывать как-то все кнопки, оставлять только управление: плеер, плей, стрелки, масштаб»: ◐ в правом верхнем углу холста включает режим «только управление» (Z.sfzClean, запоминается). На холсте остаются старт, ◀ ▶ ▶, сброс, темп и − +; верхний ряд, балансы, ромб осей, столбец видов колец, режимы кручения, группы кнопок окна и пульт 3D прячутся. Ещё раз ◐ — всё обратно.
«Чтобы можно было загрузить, если стёрлись строки — по умолчанию, в список», «строки хранить из последовательности». В списке заготовок «📋…» (под чертой поля строк) первым пунктом стоит «★ По умолчанию — последовательность (71 стр.)»: поле строк заменяется начальными строками страницы целиком, ↩ вернёт прежние. Способ достройки под чертой не меняется. Строки берутся из общего _js/initial-rows.js (заведён в этот же день отдельной правкой: одна последовательность для Синхрофазотрона, Зазеркалиуса и фона хаба).
«Запиши также эту последовательность в дневник». Начальная последовательность — файл _pzl.txt пользователя, 71 строка (номер и строка):
1 1 2 1 3 11 4 111 5 1000 6 10101 7 110001 8 1001100 9 11100000 10 111010011 11 1000000010 12 10010000011 13 101001111011 14 1010001100000 15 10100100110000 16 110100011110011 17 1100100100110110 18 10111011001001111 19 110000100000001101 20 1010111010010011111 21 11010010110001010101 22 110111010010100110100 23 1011011110010000001111 24 10101010110111001010010 25 110111000010101000000100 26 1111110100101111011100101 27 11010000000011001001101110 28 110101011000011100001110101 29 1101100100010110110011101000 30 10111111000100101010100011110 31 111101100101001100110101100100 32 1111101010011111110011101000111 33 10111000011000101010011000101110 34 110101001011011001010100011011000 35 1101001010011001011001000100011101 36 10010101110110100100001000101110000 37 100111011110100000100000101001111100 38 1011101010111011101010110101010010011 39 10001000111000001011111010110011010000 40 100101101011111100000110000001111101001 41 1110100110101110010010010011001111010110 42 10101001110000110100110101100110001011011 43 101010001000100001110001011000110110001111 44 1101011110100111011001001111100010110010001 45 11100000001010110011010110100011010110001111 46 100100010111111001010000101000011110000000101 47 1011101100000110000011100010001101010101000100 48 11011001101011000010000101101010011110010111010 49 101011011110011011010111110011100011101110011011 50 1011101000001011101101011000000010101111101001101 51 10001010111101010000111100001011101001001101010100 52 111010100000111000010100001101000000000100111010100 53 1110111110101110000101100100110010111001111000111100 54 11000000001111000100011100100011111100011001001101100 55 100011011011111011011011010101101011010001111101000011 56 1101010101111100001111110011011011001111110000100010100 57 10011101000110001011011000111010110001001111111111011111 58 111101011001001011100100100000111100101011101011000011100 59 1011000110011101011011100001010010000110001001101000100001 60 11101001001011011001011101110000111110010101011010001001111 61 111111000000011110100001100000100101001101100111101110111110 62 1001111001001011010100011011101000010111101100100100100000110 63 11011000111101010101000001111010110110000100011010101111101110 64 111110011001110010111101111110110101100110011110110100000001000 65 1111011100000101000111110010011110110000100100010001001011010100 66 11010100000111000101100010011010100000101101100100110100001100111 67 101000001100101110110101110100111100101011010111100011010111101110 68 1110011000011111100001000110101110000011001010000101100000110101110 69 10111110101110110011100101000000110011010000111111000001010010010001 70 100000001110110000011001001110101111110110010101111000111111000001100 71 1101001001101110000100101101100100001100011010011011000100111011110001
«В строках уберём эти возможности смотреть на квадраты и ромбы, только текст», «и по умолчанию». Список вида бит в полосе поля строк (01 цифры / ■ квадраты / ◆ ромбы / ◇ сетка) снят из разметки. Z.bitView при каждом открытии ставится в «txt», поэтому и старая память, и пресеты, сохранённые с квадратами или ромбами, открываются цифрами. Код отрисовки других видов в zz-ui.js остался, но до него больше не дойти.
«Тут при первой загрузке этот код». Когда в браузере у Треугольника ещё ничего не запомнено, он ставит начальную последовательность 1, 1, 11, 111, 1000, 10101… — 71 строку из общего _js/initial-rows.js (ту же, что у Синхрофазотрона, Зазеркалиуса и фона хаба; целиком она записана выше, в Синхрофазотроне v0.030). Строки разной длины рисуются по центру, как у Паскаля. Прежде первый запуск строил Серпинского: правило 90, сид 1, 50 строк; так и остаётся запасным путём, если файл последовательности не загрузился. Запомненное состояние и открытие по ссылке из «Битмультфильмов» не меняются.
«Да, добавь кнопку по умолчанию». В панели «Формы», под «Создать Фигуру», — «★ По умолчанию». Она заменяет строки начальной последовательностью (71 строка, та же, что при первом открытии) целиком; галочка «Вживить фигуру в центр матрицы» на неё не действует. Строки сразу ложатся в память страницы.
«/fold-layers/Zerkalius-layers.html — сюда» (то же, что Треугольнику v0.045–v0.046). Первый запуск (память пуста или в ней нет вкладок) ставит начальную последовательность из общего _js/initial-rows.js — 71 строку 1, 1, 11, 111, 1000…; прежде — Серпинского на 128 строк, он и остаётся запасным путём без файла. В «Фигурах», под «🔺 Серпинский», — кнопка «★ По умолчанию»: последовательность ставится тем же путём, что фигуры (applyGeneratedRows) — по выбранному режиму постройки, ↶ отменит. На набранной цепочке в режиме «стереть» она, как и любая фигура, перезаписывает только свои 71 строку.
«/Zerkalius-grid-module.html» (то же, что Треугольнику и Слоям). Памяти у модуля нет, при каждом открытии он строил демо-пирамиду 1, 10, 101… на 60 строк. Теперь открывается начальная последовательность из общего _js/initial-rows.js — 71 строка, строки по центру друг друга, как на остальных страницах; без файла остаётся демо-пирамида. В шапке, рядом с «🔴 Живой», — «★ По умолчанию»: ставит последовательность снова и возвращает живой режим (из «✏️ Редакт.» тоже).
«/Zerkalius-gpu.html» (то же, что Треугольнику, Слоям и Модулю сетки). Первый запуск (памяти «Запомнить всё» нет) и «🧹 Заводские настройки» ставят начальную последовательность из общего _js/initial-rows.js — 71 строку по центру; прежде генератор строил фигуру на 250 строк (он и остаётся запасным путём без файла). В «Генераторе», под «Создать Фигуру», — «★ По умолчанию»: последовательность ставится заново и заменяет прежнюю фигуру целиком. Генератор, в отличие от неё, по-прежнему кладёт фигуру поверх прежней. Номер версии выровнен: в заголовке окна стояло v0.194, в шапке — v0.191; теперь оба — v0.195.
«Почему-то сбивается при Автоплей» (по снимку: вместо пирамиды — серый прямоугольник и зелёный треугольник). Сид-наложение считало длину строки до последней непустой клетки от левого края. Строки начальной последовательности (v12) стоят по центру, слева от них пустые клетки, и они входили в длину: строки становились почти одной длины. Теперь длина считается от первой непустой клетки до последней. А раз последовательность стоит по центру, при её загрузке (открытие и «★ По умолчанию») выравнивание наложения ставится «по центру ◀▶» — иначе пирамида после Шага / Автоплея уезжала бы влево лесенкой. Проверено: 7 шагов — все 71 строка той же длины и на том же месте.
«/Zerkalius-code.html — сюда вместо текста». При первом открытии (в браузере ничего не запомнено) страница по-прежнему ставит сцену «0. Код Матрицы (Исходник)» ради её вида (тема, неон), но строки сразу заменяются начальной последовательностью из общего _js/initial-rows.js — 71 строка вместо первых 350 строк собственного кода страницы. Так же — при восстановлении снимка без текста. Сцена «Код Матрицы», выбранная вручную, по-прежнему показывает код. В «Формах», под «Создать Фигуру», — «★ По умолчанию» (как у Треугольника): заменяет строки последовательностью целиком, «Вживить» на неё не действует.
«Там сброс не восстанавливает». «Сброс» в полосе сид-наложения только обнулял строки (все цифры — в 0, число и длина сохранялись), и последовательность пропадала. Теперь перед первым шагом наложения (Шаг или Автоплей) страница запоминает строки, какими они были, вместе с режимом. «Сброс» останавливает Автоплей и возвращает их точно: живой режим — живым, правленные клетки — как были. Если наложение начиналось с пустой сетки (запоминать нечего), «Сброс» работает по-прежнему. «★ По умолчанию» запомненное сбрасывает. Проверено: Автоплей → Сброс и Шаг → Сброс возвращают последовательность до клетки.
«Zerkalius-kubits.html» (то же, что Треугольнику, Слоям, Модулю сетки, GPU и Code). В «Данных» по умолчанию были вписаны первые 10 строк той же последовательности, причём без второй «1». Теперь, когда в памяти ничего нет, «Данные» — вся начальная последовательность из общего _js/initial-rows.js, 71 строка. В модель, как и у генератора Серпинского, идут первые 10 строк; границу можно сдвинуть. Рядом с «🔺 Серпинский» — «★» (По умолчанию): заменяет «Данные» последовательностью, откат — «⏹ Сброс». Подпись сокращена до звезды, чтобы не обрезать «Серпинский».
«Эти кнопки — на передний план» (по снимку: кольца конуса рисуются поверх ◀ ▶ ▶ ⌖✕). У кнопок пульта оставался z-index 600–602 со времён ромбов, а слой колец поверх текста (#coneTopArt, v0.1071 Зазеркалиуса) — 2147483600; старт, темп и режимы уже стояли выше (2147483630), поэтому их было видно. Теперь ◀ ▶ — 2147483631, ▶ крутить и ⌖✕ — 2147483632: весь нижний пульт над кольцами.
«Здесь надо 3 поля-холста таких же, одновременно, друг к другу окна примыкают (блоки): в первой числа-биты, во второй их аналог в диагоналях и третья в скобках». Холст делится на три окна вплотную (стыки — жёлтой чертой): «10 Цифры», «╲ Диагонали», «( ) Скобки». Скобки — как у 4-го слота Генезиса: 1 = «)», 0 = «(». Данные, масштаб, сдвиг и выделение у окон общие — щелчок, протяжка, колесо и пан в любом окне действуют на все три; у каждого окна свои номера строк и столбцов. При открытии, при «★ По умолчанию» и при переключении масштаб подбирается так, чтобы фигура целиком вошла в окно под панелью управления, по центру. Кнопка «▥ 3 поля» в шапке переключает к одному окну («▢ 1 поле»), его вид — прежней кнопкой «╲ Диагонали / 10 Цифры / <> Символы».
По снимку «Δ +13787004000000433/18000000000000000»: «баланс надо дробный, из нормальных дробей, без нулей в знаменателе» → «пусть по магнитам только считает» → «при плавном Авто вообще неактивно пусть», «а появляться только когда вращение остановлено, и показывать только части магнитные». Откуда такие знаменатели: при плавном Авто положение колец растёт от времени кадра обычным десятичным числом (~15 знаков), и его точная дробь — со знаменателем 10¹⁵. Теперь балансы четвертей (числа у четвертей, числа в кольцах четвертей, цветная подложка) показываются, только когда кручение стоит и положение магнитное. Магнитное — дроби из размеров колец, в знаменателе нет больших степеней 2 и 5 (не больше 2¹⁰ и 5⁴); у положения после плавного Авто там 2¹⁵·5¹⁵. Пока крутится (и плавно, и по магнитам) — балансов нет. Пауза при равенстве и автобаланс считают по-прежнему. Проверено: ровно — Δ +67/2, на 90° — Δ +31/2; на 123,456789123° и во время кручения — скрыты.
«Убери этот доп. разноцветный треугольник с фона, а на единицах треугольника на некоторых поставь по 2 цветные ячейки для каждой ноты», «а в ромбы поставь цифры». Кнопка «все 7 нот» (перевёрнутая «дырка» с 28 цветными битами, v0.083–v0.087) жила в первой дырке Серпинского; с v0.092 фон — последовательность из _pzl.txt, дырки там нет, и цветной треугольник висел лишним слоем. Теперь его нет: ноты — 14 ячеек, по две на ноту, на строках N·(t+1)/8 (при 71 строке — строки 10, 19, 28, 37, 45, 54, 63 по счёту от вершины; До сверху … Си снизу) — крайняя левая и крайняя правая единица строки. Ячейка горит цветом ноты; щелчок — нота звучит и стартует прямо из этого бита, ещё раз — выключается; пока звучит — мигает. В ромбах фонового треугольника — цифры: «1» в ромбе единицы, бледный «0» на месте нуля (когда ромб не мельче 7 px).
«Сюда также по умолчанию» (по снимку панели «Свои биты»). В ряду «⇩ Текущие · ◇ Одинаково» — «★» (По умолчанию): вписывает в поле начальную последовательность из общего _js/initial-rows.js (71 строка, 2486 бит) и сразу кладёт её на грани, как обычный ввод. На 13 рядах грани вмещают 273 бита (по 91), остальное «не влезет»; на большей плотности ляжет больше. Подпись — одна звезда, полное название в подсказке: третья кнопка со словами в ряд не помещалась.
«Давай попробуем и сделаем» — по разговору о трёх полях: «диагонали — это лабиринт», «скобки — это баланс, ставший видимым». 🧩 Комнаты (поле «Диагонали»): каждая клетка разрезана своей диагональю на два треугольника («1» — «\», «0» — «/»); треугольники соседних клеток через общую сторону срастаются в области. Область, не выходящая к пустым клеткам и краю данных, — комната, своим цветом (крупные — первыми); область, касающаяся и верха первой строки, и низа последней, — проход сверху вниз, золотом. На начальной последовательности: комнат 219, самая большая — 34 клетки, проходов сверху вниз нет. 🌈 Скобки (поле «Скобки»): «(» и «)» парятся по строке, как в коде; цвет — глубина вложенности (как радужные скобки в редакторах), непарные — серые; у выделенных строк (до 40) — дуги над строкой от скобки к её паре; строка, где все скобки закрылись, — зелёным номером. Ни одна из 71 строки последовательности целиком не закрывается — ни при «1» = «)», ни при «1» = «(» (проверено отдельно): каждая начинается с «1». Сводка — справа в строке формул. Обе кнопки — в шапке, повторное нажатие выключает.
«Этот тоже», «в список, ну это серп вроде» — файл серп.txt из pzl добавлен на страницу Гранидуса по прежнему адресу Октаэдра. В «Картине» появился список «Последовательности»: «★ По умолчанию» берёт общие 71 строку, «△ Серп» — точную копию файла oktaedr/serp.txt (1025 строк, включая две первые «1»). Проверка содержимого: после первой служебной строки все 1024 ряда совпадают с треугольником Паскаля по модулю 2. Выбор раскрывает «Свои биты», заполняет поле и сразу накладывает последовательность на грани тем же способом, что ручной ввод. Кнопка «△ Серпинский» остаётся отдельным геометрическим рисунком на каждой грани. Если загрузка файла не удалась, прежняя картина сохраняется.
По скриншоту шапки Синхрофазотрона: «битая ссылка». Общий модуль _js/hub-link.js выбирал путь по списку известных папок, в котором не было sinhrofazotron. Поэтому значок и клавиша H вели в отсутствующий sinhrofazotron/index.html (воспроизведён 404). Теперь корень определяется от адреса самого модуля в _js: значок, клавиша H и favicon получают правильный путь независимо от расположения страницы. Синхрофазотрон подключает исправленный модуль с новым ключом кэша. Проверено переходом по значку в локальном браузере: открывается настоящий хаб /index.html.
«1 1 11 111 — семь нот», «вниз по 1ам и вверх по 0ям», «только так ходить», «ноты падать по очереди»: До–Си стоят на семи битах первых четырёх строк. Включённые ноты ходят по очереди в порядке До–Си, один ход за такт. Только соседняя строка: вниз на единицу, вверх на ноль; без разрешённого соседа нота остаётся на месте. При нескольких вариантах выбирается случайный сосед, возврат на предыдущую ячейку — если других вариантов нет. Свой лёгкий звуковой движок хаба hub-rhomb-music.js заменяет прежние обходы строк, столбцов и случайные прыжки; пауза, переключение нот и звук видеозаписи сохранены. Нули тоже обозначены бледными ромбами. По словам «треугольник поднять до верха почти» вершина теперь в 8 px от верха; большую надпись заменяет маленькая цветная кнопка «Зеркалиус» с прежней радугой и волной, ведущая к меню.
Продолжение разговора о связях строк: «начинаем с начала с1», «потом продолжи это». В третьем поле включён режим «↘ Поток»: 0 = (, 1 = ), стек переносится между строками с первой строки; кнопка возвращает прежние пары внутри каждой строки. Общая глубина задаёт цвет. Выделенные строки показывают дуги как внутри строки, так и к скобкам других строк; адрес пары и глубина — в строке формул. Зелёный пунктир после строки и номер отмечают пустой стек, а не отсутствие ошибок во всём потоке. Непарные скобки серые. На текущих 71 строках: 934 пары внутри строк, 270 между строками, максимальная глубина 25, пустой стек после 1, 2, 3, 4, 32 и 57; отдельно непарные — 60 закрывающих и 18 открывающих. Поэтому прежнее описание «поток полностью закрывается» уточнено: пустой стек не делает лишние закрывающие скобки парными. Сводка пересчитывается и при редактировании; выбор режима входит в файл настроек.
По снимку вершины хаба: «чтобы вверх шли цветные 7 нот», «вниз вправо, а 0 вверх вправо», «сами не поворачивают», уточнение про встреченную единицу: «сдвигает наоборот ниже, и так по кругу». В v0.094 выбирался случайный сосед нужного знака, поэтому нота могла уйти влево, развернуться или застрять. Теперь цветная нота сохраняет свой бит и идёт только вверх-вправо, по очереди До–Си. На верхнем краю диагонали следующий ход возвращает её в нижнюю ячейку той же линии. Встреченная обычная 1 выталкивается вниз-вправо на следующую строку; цепочка единиц сдвигается до свободного 0, а при выходе за нижний край занимает место, освобождённое нотой. Число единиц сохраняется при каждом обмене. Другую цветную ноту вниз не выталкиваем — ждём её хода. Нули освобождённых клеток видны сразу, кнопки и цветные ромбы идут вместе с головками. Повторный щелчок гасит ноту на новом месте; правый щелчок по фону возвращает исходные строки и запускает семь нот заново.
«Найди Excel-файл со скриптом Xoroorius… его надо в Зеркалиус» → «в Модуль сетки», «без сравнения с эталоном» («это для аниматрицы»), каскад — «конус». Скрипт — макросы _xlsm\Xoroorius.xlsm: XORR_1 (2224 строки), InterleavingCore, Umnozhenie; на листах — та же последовательность, у каждой строки-опыта эталон, длина, сид, число шагов и итог. Ядро XORR_1 (ProcessBits: шаг / шаг назад / сброс) — это сид-наложение, оно в Модуле сетки уже было; формула шага сверена с Excel: сид 10101 за 77 шагов на строках длиной 6–10 даёт ровно записанные на листе «1» итоги 101010, 1111111, 11111011, 011100101, 1010100000. Добавлено: 🎨 Направления — цифра красится по направлению последнего прохода сида по клетке (вперёд — синий, назад — красный, как в Excel); строка «все 0» — тёмно-жёлтым фоном, «все 1» — фиолетовыми цифрами. Σ Мульти (MultiXorStep) — пока включено, каждый Шаг кладёт в строку копию своего сида И сидов всех строк выше; смена режима начинает наложение заново (как в Excel, режимы не смешиваются). Не перенесено намеренно: сравнение итога с эталоном (подсветка, номер шага совпадения) — для Аниматрицы; каскад (поток сида уходит в следующую строку, когда текущая «закрылась» — нашла эталон) без эталона теряет смысл и пойдёт в конус. Двоичное умножение (Umnozhenie) и InterleavingCore пока не трогались.
Пункт 2 из списка «что просится наружу» (вслед за Модулем сетки v16–v17, те же правила). Кнопка «🌈 ( )» над полем строк: строки рабочего поля — один поток скобок с первой строки, 0 = «(», 1 = «)». Цифра — цветом глубины своей пары (шесть цветов по кругу, как в Модуле сетки), непарная — серая. Глава — строка, на конце которой стек пуст: под ней зелёная черта, номер зелёный. На начальной последовательности: пар 1204 (из них через строки 270), глубина до 25, глав 6 — после строк 1, 2, 3, 4, 32, 57, непарных 78. Главы 1–4 — «пустые» (в этих строках закрывать нечего), как и в Модуле сетки; правило «глава — только если перед ней закрылась хотя бы одна пара» ждёт решения пользователя.
То же, что Синхрофазотрону v0.035: кнопка «🌈 ( )» над полем строк — поток скобок с первой строки (0 = «(», 1 = «)»), цифра цветом глубины своей пары, непарная — серая, глава (стек пуст на конце строки) — зелёной чертой и зелёным номером. В Зазеркалиусе действует в виде «01 цифры»; квадраты, ромбы и сетка рисуют биты фигурами и остаются как были. «Скобки под строкой» Зазеркалиуса — про другое (куски-палиндромы) и не меняются.
Пункт 3 из списка «что просится наружу». При «🌈 ( )» в плоском конусе каждая пара скобок потока (0 = «(», 1 = «)», с первой строки) — линия между серединами её двух бит: пара в одной строке — хорда внутри своего кольца, пара через строки — нить от кольца к кольцу. Цвет — глубина пары (те же шесть цветов, что у цифр поля), полупрозрачно. Угол бита считается по той же формуле, что у балансов четвертей (поворот кольца, вырезы, кручение), поэтому нити крутятся вместе с кольцами; у многоугольных колец конец нити — на стороне многоугольника. Строка 1 из одного бита не участвует (у неё своя геометрия — половины, части). На начальной последовательности — 1204 линии, из них 270 нитей между кольцами. Рисунок колец лежит поверх (слой «кольца поверх текста»), нити видны в просветах.
«Да» на «ставить рубеж только там, где перед ним реально закрылась хотя бы одна пара». В потоке скобок (0 = «(», 1 = «)») стек пуст и после строк 1–4 начальной последовательности, но в них закрывать нечего: «1», «1», «11», «111» — одни непарные «)». Теперь глава (рубеж) ставится, только если со старта или с прошлой главы закрылась хотя бы одна пара. Одинаково в Модуле сетки (зелёный рубеж) и в поле строк Синхрофазотрона и Зазеркалиуса (зелёная черта и номер). На начальной последовательности глав две — после строк 32 и 57.
«Гранидус» → «Бирамида»: так теперь зовётся страница oktaedr/Zerkalius-oktaedr.html (заголовок, методичка) и её кнопка в Черновиках хаба. Файл и адрес прежние; названия тел (Одногранидус, Зеркалидус…) не менялись. И «да» на «ставить последовательность и при первом открытии, как на других страницах»: когда в памяти браузера ничего нет, на грани ложится начальная последовательность из общего _js/initial-rows.js, в поле «Свои биты» — она же строками, в списке последовательностей (v0.072) выбрано «★ По умолчанию».
«Да» на «кнопку ★ По умолчанию и в Генезис» (последовательность при первом открытии здесь уже ставит v0.428). Под «пирамидой из сида» в генераторе — «★ По умолчанию»: загружает начальную последовательность из общего _js/initial-rows.js (71 строка) тем же путём, что генератор свою фигуру; Ctrl+Z / ↶ вернёт прежнее. Проверено: Серпинский на 20 строк → «★» → снова 71 строка 1, 1, 11, 111…
Каскад из макроса Xoroorius (модуль XORR_1: SimulateCascadeRound, RunCascadeRound, CascadeXorStep) перенесён в конус, по решениям пользователя: эталон кольца — строка выше, сид — один на все кольца, путь — зигзаг от разреза. Кольцо i — запись: длина — длина строки i, эталон — строка i−1 (у кольца 1 эталона нет). Раунд R: у каждого кольца свой поток — R копий сида XOR-ом в результат кольца, от разреза вперёд (синим), у края — отскок назад (красным). Как только в результате кольца появилась строка выше (подстрокой), кольцо закрывается, а остаток потока тем же цветом и направлением уходит в следующее открытое кольцо (вперёд — с начала, назад — с конца). Проход мимо закрытого кольца стоит столько бит, сколько ушло на его закрытие. Потоки — с последнего кольца к первому, чтобы свой сид ложился в кольцо первым; закрывшееся кольцо запирается вместе со своей ценой, открытые каждый раунд считаются заново — всё как в макросе.
Управление — в полосе над строками: «⛓ каскад», поле «сид», «− раунд +», «▶» автопрогон (до закрытия всех колец, не больше 5000 раундов), «⟲» — раунд 0. На конусе (плоский вид) — биты результата внутри колец: синие — положены ходом вперёд, красные — назад, тускло — ячейки, где XOR дал 0; закрытое кольцо — зелёной обводкой. Раунд R стоит O(R·колец), поэтому состояние запоминается через каждые 25 раундов (назад — от ближайшей отметки), а при открытии страницы раунд начинается с нуля. На начальной последовательности с сидом «1»: раунд 1 — закрыто 3 кольца, раунд 20 — 10 (кольца 2–11), с раунда 50 — 12, дальше каскад упирается в кольцо 14, и всё лишнее переливается мимо.
«Звук и ноты пусть двигаются, не изменяя треугольник: на 1 — вниз-вправо следующий ход, на 0 — вверх-вправо; когда уходит за треугольник — просто пропадает; всегда можно запускать единицы». Модуль _js/hub-rhomb-music.js v0.003: поле больше не меняется (в v0.095 встреченные единицы сдвигались). Нота смотрит на бит под собой: 1 — шаг вниз-вправо, 0 — вверх-вправо. Колонка в соседнем ряду считается по геометрии (ряды по центру, разной длины): на полклетки правее; попала ровно между двумя (соседние ряды одной длины, как первые две «1») — правая, а нет правой — левая. Шаг за любой край — нота пропадает, её звук выключается, ячейка возвращается на старт, и ноту можно запустить снова. На начальной последовательности ноты стартуют на правом краю вершины, поэтому живут недолго: «До» — 4 шага, «Си» — один.
«Тут кнопку — сброс строк до старта» (по снимку плеера): «⟲» рядом с «⤒» возвращает текст к проходу 0 Аниматрицы (исходный текст из её истории), счёт циклов, отпечатки и найденный цикл — заново. Проверено: после двух проходов «⟲» даёт ровно начальную последовательность.
«Здесь сделать как бы двойное зеркало по граням треугольника, и вниз — тройное, разложить тем же размером, инверс реверс» → «треугольник из 4»: «◭ ×4 зеркала» строит из текущих n строк треугольник вдвое выше. Сверху — текущий как есть; ниже n строк полосы из трёх того же размера: в середине — он же вверх ногами с инверсией 0↔1 (строка k = инверсия строки n−1−k, зеркало по нижней грани), слева — реверс с инверсией строки k (зеркало середины по левой грани), справа — инверсия строки k (зеркало левого через середину). Пробелы остаются пробелами; Аниматрица идёт по нему целиком, счёт — заново. На начальной последовательности: 71 → 142 строки.
«Нота, падая на крайний 0, поднимается на левую 1 выше её строки — и так по кругу»: шаг вверх-вправо за край треугольника больше не убирает ноту — она встаёт на самую левую 1 строкой выше (занята другой — ждёт ход); за нижний край нота по-прежнему пропадает. «Цветными сделай галстук: по вертикали 4 отдельные единицы и ещё одна справа от них, и ещё там найди для 5 и 6»: старты (строки — по счёту от вершины): До, Ре, Ми, Фа — средняя вертикаль на строках 2, 4, 6, 8 (через строку, отдельно), Соль — справа на строке 8, Ля — острие на строке 10, Си — справа выше, на строке 6. «Зажжённые биты — немного с рамкой, чтоб больше были обычных ромбов; цвет потемнее, к фону ближе, но цветной»: ромб ноты в 1,18 раза больше обычного, рамка и цифра — яркий цвет ноты, заливка — её цвет пополам с фоном. Модуль _js/hub-rhomb-music.js v0.004.
«Пусть первая 1 будет, а вторая удали; первую оставь на месте; при нажатии на неё она падает вниз на 11 между ними и все смежные единицы вниз толкает (вернее окраску — биты на месте) с разными скоростями» → «вершина вместо нот», «переключатель». В треугольнике хаба нет второй «1» (строки 2 начальной последовательности) — 1, 11, 111…, 70 строк; на других страницах последовательность прежняя. Семи нот («галстука») больше нет: кнопка — сама вершина, рядом — скорость 1 / 2 / 4 / 8 строк в секунду. Щелчок по вершине — окраска стекает: шаг — следующая строка, горят все её единицы, соседние с горевшими строкой выше (вниз-влево и вниз-вправо, ряды по центру), прежняя гаснет; каждая строка звучит нотой по кругу До…Си и окрашена её цветом. Единиц ниже нет или низ — конец; ещё щелчок по вершине — стоп. Биты не меняются. На начальной последовательности окраска идёт до самого низа (левый край — сплошь единицы), в строке горит от 1 до 10 ячеек. Модуль _js/hub-rhomb-music.js v0.005.
По снимку полосы под чертой (🗑 · 🔺90 · 30 · м · 01 · ⌖ · ⤒ · 📋… · стр · сид): «эти кнопки от строк открепи в отдельное меню-группу в окне, которое строк будет». Кнопки достройки и заготовок больше не встраиваются по бокам строки под чертой — они в меню «Достройка» в шапке окна строк, сразу под строкой ввода; в узком поле кнопки переносятся по ширине. Щелчок по заголовку «Достройка» сворачивает меню до заголовка и разворачивает обратно (запоминается). Свои шаблоны строк остались под чертой. Сначала меню было сделано подвижной группой среди групп конуса, но на этой странице (окно конуса во весь экран) поле строк не принимает группы, и группа ложилась поверх конуса — поэтому меню стоит прямо в окне строк.
По снимку двух треугольников «28 | 28» у верхнего края конуса: «эти ромбом сделай: если равны — соедини в ромб, если нет — немного отступая, в середине между оси расположи». Число единиц — левая половина ромба (остриё влево), нулей — правая (остриё вправо), прямые стороны обращены к вертикальной оси. Поровну — половины сомкнуты в один ромб на оси и светятся, как раньше; не поровну — между ними зазор 6 px, ось ровно посередине. Половина — 60 × 40 px (на телефоне 44 × 28), число — у прямой стороны.
По снимку четырёх балансов «Δ +1»: «баланс: если у верхних одинаковый, то нижние; если разные — показать стрелкой, куда вертимся от центра», затем «и наоборот». Δ четверти (единиц − нулей) считается её весом. Верхняя пара поровну — решает нижняя, нижняя поровну — верхняя; разные обе — общий перевес: сумма Δ правых четвертей против суммы левых. Из центра конуса выходит оранжевая стрелка: вверх по оси балансов и загиб в сторону вращения — правая сторона тяжелее, по часовой; левая — против часовой. Всё поровну — стрелки нет. Стрелка видна вместе с балансами четвертей (только в магнитном положении и когда конус стоит) и поворачивается вместе с осью балансов; подсказка при наведении называет, какая пара решила и сколько справа и слева.
«Не могу подсказки включить, где она»: на этой странице «?» была спрятана вместе со служебными кнопками окон (правило страницы с одним окном, v0.141), а подсказки по умолчанию выключены — включить их было нечем. «?» вернулась в шапку, перед «слева | строки | справа | только строки» (справа у края её закрывал ромб-ручка). Горит — подсказки при наведении есть, щелчок выключает. На телефоне её по-прежнему нет: наведения там нет.
По снимку списка сцен («📍 Карта Сокровищ», 0. Код Матрицы … 888. Cyber-Wormhole): «сюда последовательность 1-11-111-», затем по снимку кнопок 🎯 📌 🔃 🔳 (у 🔃 и 🔳 обводки — включены) «рамку удалить, 2 кнопки там вообще отключи» и по снимку галки «3D Вращение (Орбита Радара)» — «просто сделай неактивным». Первой в списке стоит сцена «★ 1-11-111… Начальная последовательность»: строки — общая начальная последовательность (_js/initial-rows.js, 71 строка), рамка прицела, 🔃 реверс и 3D-вращение выключены, тема matrix. Сами кнопки и галка остались — их можно включить руками. На обеих страницах одинаково (список сцен у них общий).
По оставшейся просьбе: число темпа перенесено над ползунком. Ромб-бегунок увеличен в 1,5 раза: с 21 × 30 до 31,5 × 45 px. Щелчок по ромбу запускает и останавливает существующее кручение; перетаскивание меняет только темп и сохраняет его при отпускании. Сдвиг от 4 px отделяет перетаскивание от щелчка; отмена касания не запускает пуск. Пуск доступен также с клавиатуры, символ ▶ / ⏸ и цвет ромба следуют состоянию кручения.
Стрелки шага ◀ / ▶ перемещены на края ползунка и выполняют прежний шаг колец; маленькие стрелки изменения темпа убраны с этого ползунка. Отдельный пуск и шаги из нижнего ряда убраны: там остаются возврат на старт, сброс и выбор режима. Высота размещения темпа учитывает число сверху и увеличенный ромб. Сцены Треугольника и Code не менялись. Проверены только синтаксис изменённого JS и встроенных скриптов страницы и git diff --check; запуск и функциональные тесты оставлены пользователю.
По просьбе вернуть включение подсказок вправо наверх и рядом добавить включение закреплённого текста у оси: «?» вынесена из шапки в отдельную закреплённую пару кнопок в правом верхнем углу. Её больше не перекрывает ручка перетаскивания, она доступна и при свёрнутой мобильной шапке. Слева от неё — «Т│»: включает и выключает закреплённую статистику текущего запуска и таблицу оборотов у оси. Текст выключен по умолчанию и после полного сброса; выбранное пользователем состояние сохраняется. Выключение убирает рисование текста и его прозрачные области выделения у оси, статистика продолжает считаться. Состояние подсказок и отдельное окно справки сохранены. Проверены только синтаксис изменённого JS и встроенных скриптов страницы и git diff --check; запуск и тесты оставлены пользователю.
По снимку и просьбе «это убери — дубль»: скрыт ряд «|◀ / ▶ пуск / ▶|» в группе кручения. Пользователь управляет пуском через ромб ползунка, а шагами — стрелками по его краям. Исходные кнопки оставлены скрытыми как обработчики существующего управления и мобильных кнопок; новый ряд не теряет прежнюю логику. Проверены только синтаксис встроенных скриптов страницы и git diff --check; запуск и тесты оставлены пользователю.
По снимкам: текст темпа возвращён внутрь дорожки, рядом с ромбом с той стороны, где помещается, и не перекрывает бегунок. Весь нижний ряд «старт / сброс / режимы / память» центрируется как одна группа по ширине холста. Ползунок расположен над ним с зазором 2 px; пустая высота прежней надписи сверху снята. При нехватке ширины режимы остаются отдельным центральным рядом ниже старта и сброса. Панорамирование конуса больше не сдвигает нижний пульт от центра холста.
«🧲 оба / внутр. / наруж. / нет» и «🧲 гран. / всё» перемещены из группы кручения на горизонтальную ось конуса — двумя треугольниками 68 × 34, основание на оси и остриё вниз. Они следуют центру при перемещении вида; прежние состояния, подсказки и действия сохранены. Кольца не перехватывают нажатия на эти кнопки. Дублирующий ряд режимов в группе кручения скрыт: режимы выбираются нижними треугольниками. Проверены только синтаксис изменённого JS и встроенных скриптов страницы и git diff --check; запуск и тесты оставлены пользователю.
Магнитные треугольники подняты к верхнему концу оси: под верхними кнопками и числами баланса, с зазором 4 px. «Грани» и «Шарики» со всеми переключаемыми опытами выключены в начальном состоянии и после полного сброса. При первом открытии этой версии прежние включения этих опытов снимаются один раз; последующие ручные включения сохраняются. Строки и расстановка панелей этим не меняются.
Отключены притяжение панелей друг к другу, сцепки после отпускания, автоматическое сцепление лазерных групп и автоматическое отодвигание перекрывающихся панелей. Сохранённые сцепки больше не двигают соседние окна. Последняя выбранная панель выходит вперёд при нажатии на заголовок, любую её кнопку или при фокусе с клавиатуры; единый порядок включает отдельные таблицы. Привязки к оси и краям окна сохраняются.
Семь кнопок формы «Стр. 1» стали ромбами 48 × 48 с постоянным контуром: 1, 2, 2 сим, по последней строке, 3, 4, щель. Краткие подписи помещаются в ромбах, полные названия и ограничения остаются в подсказках; обработчики и состояния прежние. В правом верхнем углу вместо двух ромбов — один «?Т», совместно включающий подсказки и закреплённый текст у оси. По умолчанию оба выключены.
На ромбе «Плей» курсор — рука. По сообщению о баге положения нижнего пульта: его горизонтальный центр берётся от видимого тела окна, без зависимости от ширины и сдвига холста. Каждый элемент размещается относительно собственного содержащего блока. Пульт остаётся у видимого нижнего края с отступом 4 px, ползунок — на 2 px выше кнопок; свёрнутые панели больше не заставляют его прыгать вверх. На узком окне режимы остаются вторым рядом. Проверены только синтаксис изменённых JS и встроенных скриптов страницы и git diff --check. Запуск и функциональные тесты оставлены пользователю.
По снимкам настроек строк и переключателей расположения: исходные элементы объединены в три раскрывающихся столбца «Вид», «Строки», «Достройка» в верхнем меню. Перенесены сами элементы, с прежними значениями и обработчиками, без дублей. Щелчок по другому меню, вне меню или Escape закрывает раскрытый столбец; пустая полоса над полем убрана.
Формы К1 — шесть одинаковых ромбов 48 × 48 вертикально, без заголовка, фона и растянутой рамки. Старая геометрия w2/w4 и сохранённая ширина не растягивают кнопки. Устранён конфликт с прежними стилями панели: заголовок и рамка скрыты, фон прозрачен, ромбы не обрезаются. «Щель 1», угол щели, настройки света и довод перенесены в «Лазер».
Ползунок темпа уменьшен с 600 до 480 px, высота — с 48 до 36 px, ромб — с 31,5 × 45 до 24 × 34. Нижний ряд и ползунок привязаны к оси конуса, как верхние балансы. Внутри ползунка — стрелки шага и плей между ними: при воспроизведении стрелки расходятся и на ромбе появляется пауза. Плей стоит на оси; перетаскивание ромба меняет темп. Подсветка текущей и выделенных строк продолжается по всей ширине поля, включая свободную колонку справа. Фон конуса и стола совпадает с фоном строк; цветная подложка четвертей снята, цвета чисел баланса сохранены.
По сообщению «кнопки прыгают»: семь постоянных верхних вкладок получают одинаковую ширину 88 px, высоту 22 px и шрифт 10 px. Выбор вкладки не меняет её ширину; обновление состояния сохраняет существующие кнопки. На узкой шапке вкладки прокручиваются в одну строку. Проверены только синтаксис изменённых JS и встроенных скриптов страниц и git diff --check; запуск, браузер и функциональные тесты — на пользователе.
По снимку пульта: стрелки шага удлинены с 22 до 44 px, высота остаётся 28 px. Стрелки прилегают к ромбу плея и не расходятся при воспроизведении. При наведении или фокусе с клавиатуры обе стрелки и плей / пауза выделяются золотом. Во время игры символ паузы плавно мигает; сам ромб остаётся видимым и доступным для нажатия и перетаскивания темпа. Проверены только синтаксис JS и встроенных скриптов страницы и git diff --check. Запуск и тесты оставлены пользователю.
По снимку: «нет / блок / через 1» перенесены из прежней панели во второй вертикальный столбец рядом с видами колец. Перенесены исходные кнопки выбора заполнения, без дублей и изменения логики инверсии; они стали ромбами той же величины, что и первый столбец. Перетаскивание за ромбы видов колец перемещает оба столбца вместе, сохранённый сдвиг от оси остаётся.
Подсказки обоих столбцов появляются справа рядом с кнопками, с ограничением размеров по экрану. По этой просьбе подсказки данных кнопок доступны даже при общем выключении подсказок; остальной интерфейс сохраняет прежний переключатель. Плей / пауза увеличен в 1,5 раза вокруг прежнего центра, без изменения положения стрелок, текста, ползунка и нижнего ряда. Проверены только синтаксис JS и встроенных скриптов страницы и git diff --check; запуск и тесты — на пользователе.
По снимку длинной подписи: сведения о цикле сокращены до «цикл: 1 · целиком», «цикл: N · шаг K» или «цикл: ∞ · повтор X°». Подпись перенесена от нижнего пульта к видимому левому краю холста, на 4 px ниже горизонтальной оси, и следует её перемещению. Шрифт уменьшен с 11 до 9 px, цвет приглушён; фона и рамки нет. Проверены только синтаксис JS и встроенных скриптов страницы и git diff --check, без запуска и тестов.
«Вид» разобран на исходные кнопки-ромбы в два ряда над верхними балансами, без повторов и с прежними обработчиками. Кнопки остальных плавающих групп выстроены одним столбцом; сохранённые размеры и рисунки не удаляются. История появляется справа на горизонтальной оси: ширина до 220 px, уменьшается при увеличении масштаба, бегунок и стрелки уменьшены. Плей поднят перед слоем оси без изменения координат. Подпись цикла получила небольшой отступ и шрифт 11 px. У номеров строк уменьшены промежутки, ширина номера зависит от шрифта, пустой счётчик накрутки больше не занимает колонку. Столбцы T / N / 2T−1 / 2T / меж / сим и нет / блок / через 1 сближены почти до касания; добавлены ✥ для перемещения и × для скрытия, вернуть можно через верхнее меню «Вид → Ромбы колец». Проверены только синтаксис JS и чистота diff; браузер и тесты не запускались по просьбе пользователя.
По снимку «авторасширение — баг, едет ширина»: для групп с кнопками в одном столбце отключена прежняя подгонка по измеренной ширине их же растянутых элементов. Ширина берётся из заданного пользователем размера, а в автоматическом режиме — 180 px; повторные пересчёты не прибавляют пиксели. Исходные сохранённые размеры не переписываются. Кнопки оформляются по ширине тела группы, без растяжки до следующего ряда; у ползунков ширина больше не используется как вертикальный flex-basis. Высота элементов ограничена 25 px, поэтому ползунок щели не превращается в высокий блок. Проверены синтаксис JS и diff; браузер и тесты не запускались по просьбе пользователя.
По образцу T / N с соседним столбцом «нет / блок / через 1»: раскрытые группы меню стали вертикальными гроздями ромбов 48 × 48, второй столбец сдвинут на 26 px вправо и на полромба вниз. Общая подложка и заголовок убраны; сверху остались ✥ для перемещения и × для сворачивания к исходному заголовку. Исходные кнопки и их обработчики сохранены. Ползунки и числовые поля получают отдельные широкие ромбы 120 × 48. Добавлены встроенные SVG-значки и описания справа при наведении. «Вид» тоже стал отдельной вертикальной гроздью рядом с верхними балансами: можно перетаскивать и скрывать, вернуть через верхнее меню «Вид». Геометрия зависит от списка элементов, а не от измеренной ширины предыдущего кадра. По снимкам баланса «7 / 0»: общий счётчик теперь использует те же ячейки, что четверти; в T−1 учитываются инверсии предыдущей строки, в 2T — своей, в «блок» и «через 1», пустые ячейки не считаются. Общий баланс обновляется также после изменений при отрисовке. Стрелки отодвинуты от увеличенного плея: одинаковый зазор 8 px, сам плей остался на месте. Верхний блок прижат к краю холста: кнопки балансов, осей, выравнивания, магнитов и масштаба приведены к ромбам 48 × 48 с зазором 6 px; в узком поле верхний ряд перестраивается в два ряда. Ромбы масштаба больше не накладываются на соседние кнопки. Боковая полоса значков тоже получает ромбы 48 × 48 и ширину 56 px. Когда строки не помещаются по ширине, горизонтальное центрирование берёт первую целиком вмещающуюся строку в видимой части поля (при отсутствии — первую подходящую во всём поле), с учётом ширины столбца номеров; пересчитывается также при изменении размера поля. Проверены только синтаксис JS и diff; браузер, взаимодействия меню и численный пересчёт балансов в среде выполнения не проверялись по просьбе пользователя не запускать страницу и тесты.
По снимкам вытянутых полей и разорванных подписей: обычные кнопки остаются ромбами 48 × 48, поля и ползунки становятся ромбами 96 × 96. Длинные названия сокращаются целыми словами, полный текст виден на увеличенной карточке и в подсказке справа; исходные подписи и обработчики остаются в DOM. Убран повторный значок поверх уже имеющегося. Явно скрытые элементы и декоративные слои старой раскладки больше не образуют пустые фигуры. По идее «тарелок / ромбокниг»: у группы широкий ромб-заголовок 120 × 48, внутри — гроздь, снизу — крышка для сворачивания; сжатая книга показывает заголовок. Однократная вертикальная сборка сохраняет прежнюю раскладку в резерве для кнопки возврата. Следующая книга следует за высотой раскрытой; при нехватке места переходит в соседний столбец. При наведении или фокусе ромб приближается с наклоном в 3D, не меняя размеров раскладки. Перекрытые плавающие грозди чередуют слои ромб через ромб; наведённая кнопка выходит вперёд. Боковые группы значков — карусели: один действующий ромб на минигруппу, при наведении меняются по кругу, колесо и ↑ / ↓ переключают вручную; нажатие и фокус останавливают автоматическую смену. Пара − / + закреплена вертикально у правого края поля, независимо от масштаба конуса и ширины чисел баланса. Нижний дубль переключателя осей из грозди «Вид» убран. Проверены синтаксис основного JS и трёх встроенных скриптов, а также diff; отображение, анимации, перекрытия, карусели и сохранение раскладки в браузере не проверялись по просьбе не запускать страницу и тесты.
По сообщению «пропадает при перемещении»: правило чередования ромбов сбрасывало слой всей книги в auto, включая фиксированную группу .cdrag. Для перетаскивания задан отдельный верхний слой книги, полосы и содержащего окна; после отпускания возвращается обычное чередование. Наклон ромба при наведении усилен в сторону зрителя, без изменения размеров раскладки; во время переноса заголовок не наклоняется. На верхней вершине заголовка — прищепка: закрепляет ромб у верхнего края, гроздь остаётся раскрытой или складывается прежней кнопкой между крышками. Первая кнопка грозди касается нижней вершины заголовка, включая крупное поле 96 × 96. При реальном перетаскивании прежняя верхняя прищепка снимается, при простом нажатии остаётся. Сохранённые расположения других групп не сбрасываются. Проверены только синтаксис JS и встроенных скриптов, маркеры версий и diff; перенос, наклон, прищепки и сворачивание в браузере не проверялись по просьбе не запускать страницу и тесты.
По предложению поставить тарелку снизу: рядом с + / − у ромбокниги появилась стрелка ↓, меняющая направление отдельно у каждой группы. Заголовок становится нижней тарелкой, кнопки растут вверх от его вершины; тексты и значки не переворачиваются. Сворачивание идёт к нижней опоре, координата её основания сохраняется при изменении высоты грозди. Прищепка в этом режиме закрепляет тарелку у нижнего края поля, а ↑ возвращает прежнюю верхнюю опору. Направление и нижняя координата входят в сохранение и резерв раскладки; другие группы автоматически не переставляются. Перенос записывает новую нижнюю координату, чтобы сворачивание не возвращало группу на прежнее место. Проверены синтаксис основного JS, встроенных скриптов и diff; нижнее закрепление, перенос и сворачивание в браузере не проверялись по просьбе не запускать страницу и тесты.
По снимку наложенных гроздей: слои назначаются по настоящим пересечениям ромбов, с учётом сдвига и нижней опоры, а не по чётности номера группы. В паре гроздей пересекающиеся карточки чередуются сверху вниз: одна перед второй гроздью, следующая позади неё. Общий фиксированный слой или пересечение трёх и более гроздей разрешается разнесением до свободного места, с сохранением прежних координат в sfzWeaveUndo; прищепки сохраняются. Геометрия проверяет сами ромбы, без ложных пересечений пустых углов прямоугольников. Наведение и закреплённое увеличение остаются поверх обычного плетения. Правый щелчок по ромбу сохраняет увеличение и полный текст после ухода мыши, повторный снимает увеличение; размер запоминается в памяти страницы, действие левой кнопки остаётся прежним. В режиме редактирования сохраняются прежние контекстные действия. Проверены только синтаксис JS, встроенных скриптов и diff; перекрытия, разнесение и сохранённое увеличение в браузере не проверялись по просьбе не запускать страницу и тесты.
По просьбе «тут 2клик очень ненужен» снято включение Дзена двойным щелчком по холсту: оно неожиданно прятало панели и сбрасывало положение картинки при повторном нажатии. Дзен остаётся по щелчку колёсиком, обычный щелчок по холсту — пауза / продолжить. Подсказка и начальный статус обновлены. Проверен синтаксис встроенных скриптов; интерактивная проверка в браузере не выполнялась.
По просьбе освободить весь вид треугольника меню вынесено вправо, в отдельную прокручиваемую лесенку. Размер и центр треугольника рассчитываются по оставшейся области, без захода под кнопки. На ширине до 1100 px меню начинается под первым экраном с рисунком, независимо от типа указателя. Все названия ссылок рисуются ромбическими битами тем же шрифтом, что логотип «Зеркалиус», с цветовой полосой; обычное название остаётся в подсказке и доступном имени. Ссылки и музыкальные ячейки сохраняются. Проверены синтаксис и diff; внешний вид, прокрутка и нажатия в браузере не проверялись по просьбе не запускать страницу.
По просьбе «все кнопки влево» боковая лесенка перенесена к левому краю. После уточнения «вдоль грани» и «не обяз все» две главные кнопки стоят снаружи левой грани треугольника, следуя её наклону; остальные разделы остаются компактной лесенкой слева. Треугольник вместе с музыкальными ячейками рассчитывается в свободной области справа от меню. На узком экране ссылки остаются под рисунком и выровнены влево. Проверены синтаксис и diff; страница в браузере не запускалась.
По предложению сделать инструмент прямо в хабе: одна передвижная линия отражает весь треугольник целиком, включая живую окраску нот. Линия и ромбическая ручка перетаскиваются мышью или пальцем; маленькая ручка поворачивает зеркало на произвольный угол, колесо над ней — шагом 5°. Щелчок по ромбу поворачивает ось на 15°, правый щелчок включает / выключает отражение; стрелки двигают ось, с Shift — крупнее. В левом меню — включение зеркала и отдельные ползунки наклона ромбов 0 и 1 от −60° до +60°, со сбросом к 0°. Положение, наклон, включение и углы битов запоминаются. Отражение строится из чистого исходного кадра, без накопления предыдущих отражений; данные битов и единственный звуковой движок не меняются. Зеркальные вершина и переключатель скорости управляют тем же источником. Рисунок ограничен свободной областью, меню слева. Проверены только синтаксис и diff; перетаскивание, touch, запись и вид отражений в браузере не проверялись по просьбе не запускать страницу.
По рисунку с диагональными дорожками и уточнению «только световой след» добавлена галка «↓ След единиц» в настройках хаба. Две световые дорожки проходят вниз-вправо через любые 0 и 1, оставляя короткий затухающий хвост; биты исходного поля и звук не меняются. След отражается тем же передвижным зеркалом. Он выключен по умолчанию, включение сохраняется; анимация останавливается при выключении и за пределами первого экрана. Проверены синтаксис и diff; движение, вид и управление в браузере не проверялись по просьбе не запускать страницу.
По просьбе «можно серп глянуть» в настройках хаба появился выбор узора «Исходный / Серпинский». Серпинский строится как треугольник Паскаля по модулю 2 из вершины 1: соседние биты строки выше складываются XOR, за краями — 0. Количество строк такое же, как у исходного рисунка, для сравнения в том же масштабе. Первоначальный выбор новой настройки — Серпинский; выбранный узор запоминается. Переключение сохраняет положение зеркала, наклоны битов и световой след; текущая музыкальная окраска останавливается, последующее нажатие вершины идёт уже по выбранным битам. Возврат исходного узора доступен в том же списке. Проверены синтаксис и diff; вид Серпинского, смена узора и звук в браузере не проверялись по просьбе не запускать страницу.
«Для индекс чтобы можно картинку скачивать чёткую и свои загружать». В настройках зеркала слева — загрузка локальной картинки вместо треугольника, возврат к выбранному узору и скачивание PNG 2K / 4K / 8K. Своя картинка вписывается целиком с сохранением пропорций и отражается той же передвижной наклонной линией. Выбор узора возвращает треугольник; загрузка останавливает окраску и скрывает её кнопки. Файлы остаются в браузере, на сервер не отправляются. PNG содержит рисунок, отражение и текущий свет, без меню и ручек: ромбы и цифры рисуются заново в разрешении экспорта, а не растягиваются со скриншота. Сохраняется свободная область поля на чёрном фоне; длинная сторона выбирается пользователем, временные холсты ограничены 32 миллионами пикселей и фактический размер показан после скачивания. Маленькое исходное фото при увеличении новых деталей не получает. Проверен только синтаксис изменённых скриптов; загрузка, сохранение и отображение в браузере не проверялись.
«Между кнопок зацеп чтоб перетаскивание». Между соседними ромбами грозди — маленькие ручки ⠿ в свободных выемках, слева и справа по очереди. Зацеп переносит всю группу через существующий механизм перетаскивания, сцепления и сохранения положения; нажатие без переноса не включает кнопку и не сворачивает книгу. Ручки отражаются вместе с раскладкой при тарелке снизу, исчезают при сворачивании и не ставятся поверх редакторов, ползунков и скрытых кнопок. Область захвата 24 px, курсор показывает хват. Проверен синтаксис; перетаскивание мышью и касанием в браузере не проверялось.
«Вверху верёвку, чтобы двигать сразу все грозди или не двигать, двигая другие». Прикреплённые сверху группы висят на общей синей верёвке: хват ✥ переносит их вместе, 🔓 / 🔒 закрепляет саму верёвку. Правый щелчок по прищепке группы закрепляет только её на месте; остальные продолжают двигаться с верёвкой. Повторный правый щелчок разрешает движение, обычный снимает прищепку. Закреплённые группы не тянутся соседними сцепками; положение и фиксация сохраняются. При отпускании на нижнюю полосу гроздь остаётся раскрытой в прежнем направлении, без принудительного сворачивания. Ползунки уменьшены с 52 до 26 px, их название и значение — в обновляемой подсказке. Отдельная гроздь «Вид», оторвавшаяся от заголовка, соединена с собственной ромбокнигой; её кнопки синие. Снят старый дубль видов колец «T−1 / между / симм. / 2n / все», отдельный столбец видов сохранён. Видимая полоса прокрутки поля строк убрана, прокрутка сохранена. Меню «Вид / Строки / Достройка» перенесены в левую полосу: маленькие кнопки и компактные списки шириной 172 px. Проверен только синтаксис; общий перенос, фиксация, нижний магнит и новая раскладка в браузере не проверялись.
Отдельные зацепы между ромбами убраны: за любую кнопку грозди можно потянуть всю группу. Перенос начинается после сдвига на 6 px; короткое нажатие сохраняет действие кнопки. Действия кнопок на pointerdown откладываются до отпускания, чтобы перенос не включал и не скрывал инструмент. Синтаксис проверен; поведение в браузере не проверялось.
По снимку «вот так перемести кнопки»: «внутр.» и «грань» стоят на полромба ниже верхнего ряда, по сторонам центральной оси, а числа баланса — сразу под ними. В узкой раскладке дополнительные ромбы автобаланса и колец четвертей смещены к внешним краям второго ряда, чтобы оставить место магнитам. Застрявшая кнопка с подсказкой «Дзен» больше не накладывается на верхнюю полосу после отмены: она целиком в левом меню под «Вид / Строки / Достройка». Меню уже в левой панели в исходной разметке. Проверен синтаксис изменённого JS и встроенных скриптов; расположение в браузере не проверялось.
Пользователь показал грозди без шапок и уточнил, что заголовки пропали, а после стрелки у «Щелей» исчезает «Вид». У свёрнутой грозди снят прежний предел высоты 24 px: заголовок занимает свои 48 px и остаётся внутри поля над нижней полосой. Закреплённые группы подняты над холстом и нижними кнопками. «Строка 1» включена в общий механизм шапки и сворачивания, у столбцов T / N появилась шапка «Вид колец». Стрелки и прищепки остаются доступны в 3D. Ползунки сжаты до 96 × 34 px, возвращены название и число; списки остаются 120 × 36 px. Во время перетаскивания фоновое размещение не перехватывает группу, после отпускания свободная гроздь не округляется к старой сетке 24 px. В пределах 16 px от пола гроздь притягивается к нижнему краю и сохраняет нижнюю прищепку; столбцы T / N тоже запоминают магнит к полу. Пересчёт размеров удерживает шапки и нижний край после сворачивания. Проверено в браузере: перенос за кнопку, сохранение нижней прищепки после обновления, изменение числа ползунка, раскрытие «Вида» и сохранение его после стрелки «Щелей».
По серии снимков и уточнений: шапки и ножки групп примагничиваются к верхней полосе, горизонтальной оси и нижнему краю; при масштабе и переносе следуют за осью. Двойное нажатие меняет направление раскрытия и сразу закрепляет группу сверху или снизу. «Кольца» удерживаются за нижнюю ножку. «Грани» разложены в три столбца, «Щели» стали фиолетовыми. Кольца рисунка перекрывают группы. В дзене скрыты «Кольца» и «Строка 1», кнопка дзена перенесена вниз левого меню и позволяет выйти из режима. Почти дублирующая серая кнопка удалена. Свёрнутый пульт 3D возвращается над кнопкой масштаба; его ромбы — стандартные 48 × 48 px.
Верхние ромбы выровнены: первые три стоят над номерами строк, «Вид», «01» и «+» — правее. Размер 48 × 48 px, выступы снизу обрезаны по полосе. Номера без жирности; черточки замков тоньше и перенесены влево без смещения номеров. Значки между ромбами левого меню сняты. Ромбы записи привязаны к промежуткам верхних треугольников и пересчитываются с ними в каждом кадре. Два магнита помещены в треугольные вырезы. Серо-белая кнопка оси стоит вверху на вертикальной оси; отмена и повтор — по её сторонам. Отметка привязки проходит через середину шапки и прикрыта надписью. Хаб расположен по центру сжатой полосы меню (28 px), заголовок начинается за её границей (56 px); версия сразу после названия.
Вертикальные ползунки тонкие, полупрозрачные и собраны слева; число следует за бегунком. В нижнем темпе восстановлена связь бегунка с величиной, стрелки увеличены внутри тонкого контура. Мобильные «Направление», «Шарики на старт» и «Настройки» стали тремя ромбами 48 × 48 px со значками и доступными названиями; поясняющий абзац снят. Подсказка долгого нажатия появляется ниже и правее пальца.
Проверено в браузере: раскрытие и направление шапок, привязка ножки к оси и нижнему краю, сохранение после обновления, дзен и выход из него, размер и обрезка ромбов, центр хаба и граница заголовка. При масштабе смещение ромбов записи от середины промежутков — 0 px. В Chrome с эмуляцией касаний при 390 × 844 проверены темп, настройки и вертикальная высота (3,5 → 3,1); горизонтальный экран 844 × 390 также проверен без переполнения. Синтаксис изменённых JS и встроенных скриптов проверен.
По новым снимкам: отмена и повтор подняты на верхний край, высота 32 px почти занимает полосу 34 px; цвет — спокойный серый. Между ними оставлен зазор для полного ромба оси 32 × 32 px с прозрачным крестиком. Балансы стали прямоугольными треугольниками под кнопкой оси: горизонтальные катеты прижаты к нижней линии меню, вертикальные обращены к оси и разделены зазором 4 px. Вся группа следует за настоящей осью и в 3D. Магниты пересчитываются после верхних треугольников, ромбы записи — следом, в том же кадре; прежняя задержка магнитов снята. Жёлтый верхних кнопок приглушён, обводка треугольников уменьшена примерно до 1 px. Контур темпа единый и тонкий, охватывает обе стрелки и центральную часть. Масштаб кнопками − / +, пультом и соответствующими клавишами меняет размер рисунка без смещения центра осей: прежнее умножение сдвига на масштаб снято.
Три левых ромба поля строк получили приглушённый фиолетовый цвет. Ряд начинается вплотную у левой границы поля и следует за ней; минимум 300 px и ограничение размещения по ширине ряда кнопок сняты. При сжатии лишние ромбы скрываются за правым краем экрана. Восстановлен захват зубчатого края для изменения ширины; меню следует также за выдвижной панелью.
Проверено в браузере: мышью ширина поля изменена 112 → 74 → 422 px; при 74 px лишние ромбы находятся за экраном, горизонтальной прокрутки нет, начало ряда совпадает с границей поля. Кнопка оси включается и выключается через прозрачный крестик. Настольные стрелки занимают 32 px, полный ромб — 32 px; в мобильной эмуляции 390 × 844 стрелки и ось находятся на одной высоте, балансы — под ними с зазором 4 px между катетами. При увеличении центр осей остался 537 × 437 px. При изменении ширины панели положение магнитов и ромбов записи относительно своих промежутков не изменилось (отклонение 0 px), зазор между рядами кнопок — 6 px. Ошибок в консоли настольного и мобильного браузера нет. Проверены синтаксис и встроенные скрипты.
По просьбе пользователя главные ссылки «Треугольник» и «Зазеркалиус» перенесены с края рисунка наверх левого меню хаба; их положение больше не пересчитывается по геометрии треугольника. В Зазеркалиусе появилась постоянная вкладка «Зеркалиус» с ромбовым построением хаба и тремя независимыми зеркалами. Ромб с номером переносит линию зеркала, ручка ↻ поворачивает её; точный угол задаётся ползунком или стрелками. У каждого зеркала свой цвет, включение и автоматическое вращение с отдельной скоростью и направлением. Отражения применяются последовательно 1 → 2 → 3; цвет можно добавлять и к самим отражениям. Наклоны нулей и единиц, след единиц и экспорт PNG вынесены в зубчатую плашку общей системы SOL_PLATES с переносом и сворачиванием. Настройки зеркал и собственные строки сохраняются вместе с состоянием приложения.
После уточнения «строки тоже можно… брать из строк и… загружать в свои» добавлены источники «Серпинский», «Исходный из хаба», «Строки поля» и «Свои строки». «Строки поля» следят за текущим рабочим полем; «Поле → свои» делает независимую копию. Свои строки вставляются текстом или читаются из TXT / JSON: массив строк либо объект с массивом rows. Проверка принимает только 0 и 1, от 1 до 2048 строк и не более миллиона бит; ошибочный набор не заменяет прежний. «В поле» переносит исходные строки выбранного узора с общей отменой и соблюдением замка строк. Прямая ссылка с #zerkalius открывает вкладку.
В Chrome проверены собственный набор, отказ ошибочного текста, перенос в поле и отмена, копирование текущего поля, изменение цвета и угла, автоматическое вращение, сохранение после обновления и возврат начальных зеркал. На ширине 390 px исправлена высота холста и проверено отсутствие горизонтального переполнения. На главной кнопки стоят внутри левого меню. Отдельно проверены разбор TXT / JSON, ограничения входных данных и математика отражений: неподвижные точки линии, сохранение расстояния, два одинаковых отражения и обратный порядок трёх зеркал. Проверен синтаксис изменённых JS и встроенных скриптов. Автопроверка выбора локального файла в браузере ограничена разрешением расширения на file URLs; сам разбор файлов проверен на TXT и JSON.
Исправлено исчезновение закреплённых групп: позднее правило z-index:auto перекрывало их слой, и фиксированные группы оказывались под основным холстом. Для закреплённых групп восстановлен слой выше холста; сохранённые положения не сбрасываются. Верхняя полоса на настольном экране теперь высотой 30 px, как существующий треугольник с обводкой. На всю длину проведена тонкая серая сетка 60 × 30 px. Верхние треугольники, магниты и ромбы записи стоят с шагом 60 px; ромбы обрезаны полосой. Кнопки поля строк продолжают сетку после записи, лишние уходят за экран при узком поле. Отмена и повтор — зеркальные трапеции: общая нижняя сторона 180 px, верхняя 120 px, высота 30 px. Ось в рамке с прозрачным крестиком. При перемещении рисунка верхние группы и отмена/повтор остаются на месте, за настоящей осью следует только её кнопка.
«Вид», «01» и «+» раскрывают настройки под чертой после последней строки. Исходные элементы и обработчики перенесены в сетку стандартных ромбов 48 × 48 px: два столбца на узком поле и три начиная с ширины 168 px, между ромбами 2 px. Пять кнопок вкладки «01» занимают два ряда при трёх столбцах. Настройки остаются на месте после перерисовки строк; при раскрытии прокручивается только список строк. «?Т» перенесён в «Вид», включённая корзина горит красным. Строка кольца за чертой и виртуальные пустые строки не показываются в поле до переноса в него. Правый щелчок по внешнему биту меняет только этот бит 0 ↔ 1, сохраняя остальные ячейки и отметки лазера; просвет и перетаскивание правой кнопкой битов не меняют.
Нижний пульт получил тёмные синие, фиолетовые и зелёные цвета. Сброс красный, «старт» справа от пяти режимов. Все семь нижних кнопок одного размера 60 × 30 px и на одной высоте; третий из пяти режимов строго на вертикали оси. Стрелки темпа, центральная кнопка, число и контур также перекрашены.
Проверено в браузере: после исправления слоя группы снова видны в пользовательской вкладке; высота верхней полосы 30 px, ромбы обрезаны. В тестовой вкладке сдвиг конуса на 40 px переместил кнопку оси на 40 px, а отмену/повтор, верхние треугольники, магниты, достройку и балансы — на 0 px. Правый щелчок по внешней ячейке дал 1, второй — 0; три пробные строки остались прежними, отдельная строка под чертой не появилась. Проверены открытие трёх вкладок, ромбы 48 px и сохранность действий после перерисовки; пять кнопок «01» стоят 3 + 2. Центр третьего нижнего режима совпал с осью, все семь кнопок имеют одинаковый нижний край. Новые семь тестов редактирования внешнего кольца прошли. Вместе с прежними тестами баланса: 20 из 21; старый тест вырезов падает в своей VM-обвязке из-за отсутствующего cutPrevSource, сам файл теста баланса не изменён. Синтаксис основного и встроенных скриптов проверен.
Пользователь попросил масштаб колесом, ромбовые − / + как в Синхрофазотроне, затем уточнил «только прозрачнее» и показал большую плашку: «это всё минимизировать в такие ромбы». Вместо общей плашки — пять компактных групп: «Строки», три зеркала и «Вид». Каждый элемент — ромб 48 × 48 px с полупрозрачной заливкой и цветным контуром, ромбы идут зигзагом с шагом 24 px. Группы сохраняют свои положения и сворачивание; перенос за шапку использует общие привязки SOL_PLATES. Узор, свои строки, угол, скорость и наклоны открывают только нужный редактор; цвет, включение, вращение, копирование строк, перенос в поле и PNG остаются доступны из ромбов. Настройки и обработчики прежних элементов сохранены.
Колесо над рисунком плавно меняет масштаб от 20% до 600%, удерживая точку под курсором. Правые ромбы − / + меняют его шагами; между ними число процентов, двойной щелчок по нему возвращает исходный вид. Масштаб применяется ко всему построению и линиям зеркал, перенос и поворот ручек учитывают координаты увеличенного вида. Над ручкой поворота колесо по-прежнему меняет угол; над редакторами и гроздями масштаб не срабатывает. Масштаб и смещение сохраняются в состоянии приложения. Заливка ромбов масштаба — 22%, остальных — 12%.
В Chrome проверены колесо, кнопки масштаба, возврат 100%, сохранение масштаба после обновления, редакторы своих строк и угла, запуск вращения из ромба, сворачивание с шапкой 32 px и сохранение переноса группы. При ширине 390 px пять групп помещаются в поле без горизонтального переполнения. Исправлен временный прыжок при переносе: общая плашка в pdrag использует экранные координаты, а здешние группы остаются в координатах своего поля. Отдельно проверены удержание точки под курсором, обратимость шага масштаба, границы 20–600%, прежний разбор строк и математика отражений; синтаксис изменённых JS и встроенных скриптов проверен.
Здесь без формул. Каждое слово — с привязкой к месту, где оно в проекте встречается.
1011101. В цепочке
это места, которые разворот НЕ трогает — значений всего два, и если бит совпал со своим
зеркальным, разворот ничего не изменит. Именно они проступают красным в «памяти».0011 —
антипалиндром: первый против последнего, второй против третьего. Всегда чётной длины (у нечётной
средний бит должен был бы отличаться сам от себя). Это и есть зеркало «инв-разв».0 → 01 → 0110 → 01101001. Никогда не становится периодичной. Из четырёх зеркал такой
фокус выходит только у инверсии — остальные быстро вырождаются в повтор.skewY — наклон в CSS), поэтому
выглядят лежащими НА грани, а не наклеенными поверх.
По снимку гроздей 3D, «Грани», «Шарики», «Щели» и «Кольца»: «кнопки бы поправить все чтоб не прыгали не уезжали не дёргались и шрифт побольше и значки может какие». Убраны увеличение, перспектива и наклоны при наведении и фокусе — у ромбов групп, вида конуса, таблицы колец, балансов, магнитов, осей, масштаба, заголовков и крышек. Надпись и значок при наведении остаются теми же; состояние показывает заливка. Правый щелчок больше не включает постоянное увеличение ромба и не перехватывает штатные правые щелчки действий.
Пересечения гроздей меняют только порядок слоёв: автоматическое раздвигание, которое само меняло сохранённые места, прищепки и сцепки, убрано. Показанный хотя бы однажды элемент сохраняет свой слот при временном скрытии режимом, новые элементы занимают следующий слот. Размеры ромбов (48 px, для редакторов 96 px) и сохранённые координаты оставлены прежними. Короткие подписи — 10,5 px вместо 8 px, одиночные символы — 16 px, таблица колец, значения ползунков и заголовки групп — 12 px. Для текстовых действий добавлены SVG-значки; длинные названия сокращены по смыслу, полные описания остаются в подсказках и доступных именах.
После неподвижных кнопок пользователь показал два ползунка 3D внутри больших пустых ромбов: «теперь моменты кнопки ползунки и списки как быть?». Редакторы в гроздях получили вытянутую шестигранную форму шириной 120 px: ползунок — высотой 52 px, список и короткое поле — 36 px, многострочное поле — 72 px. Кнопки действий остаются ромбами 48 px. Редактор занимает отдельную строку с зазором 8 px; его центр совпадает с осью первого ромба и заголовка группы. При раскрытии вверх учитывается собственная высота каждого элемента.
Подпись ползунка — сверху слева («Высота», «Толщина», «Щель», «Темп», «Громкость», «Масштаб»), число — сверху справа в постоянном поле 36 px; внизу — стрелки и дорожка с небольшим ромбом-бегунком. Число больше не движется за бегунком. Списки показывают выбранный режим шрифтом 12 px и постоянную стрелку раскрытия; штатные option, клавиатура и обработчики выбора сохранены. Действия и сохранённые координаты групп не изменены.
Проверка в Chrome на локальном сервере: Home / End ползунка высоты дают 0 / 4, стрелка вправо от 0 даёт 0,1 и на максимуме остаётся 4. Слот, размер 120 × 52 и положение числа (72, 7) относительно панели одинаковы на обоих краях. Список зеркала меняет режимы «вручную» и «180°», размер 120 × 36 сохраняется; ошибок JavaScript в консоли нет. Синтаксис zz-ui.js и встроенных скриптов проверен node --check.
Третья попытка контура по нарисованному образцу: две тонкие треугольные рамки идут от внутренних граней стрелок к центру ромба темпа. Вершина следует бегунку, поэтому при перетаскивании рамки остаются соединёнными под ним. Ромб полный, 48 × 48 px, с тонкой фиолетовой рамкой; при пуске зелёный. Стрелки и внешний шестигранный контур сохранены. Линия оси скрыта под всей дорожкой и нижними кнопками.
Верхняя и нижняя полосы притягивают группы к осям симметрии треугольной сетки с шагом 30 px. Внизу добавлена та же серая сетка 60 × 30 px. Новая привязка хранит целый номер места в сетке: сдвиг и масштаб рисунка не уводят закреплённую группу, при изменении размера окна она следует сетке. В нижней полосе группа раскрывается вверх, в верхней — вниз. Существующие сохранённые положения не сбрасываются; дискретное место выбирается при новом переносе или закреплении.
Любой клик по кнопке оси (левый, правый или колесом) возвращает ось в центр экрана, сохраняя масштаб. При смещении кнопка опускается на 15 px: центр ромба находится на нижней границе верхней полосы меню, половина ромба ниже неё. После возврата она снова целиком внутри верхней полосы. Если ось ушла за экран, кнопка остаётся у видимого края.
В браузере проверены привязки сверху и снизу, целые номера мест 16 и 19, сохранение нижней привязки после обновления, неподвижность при переносе и масштабе сцены, три вида клика по оси. После уточнения верхней полосы проверено: смещённый ромб имеет top 15 px и центр на границе 30 px; клик возвращает top 0. Ползунок проверен на обоих краях, в середине и при перетаскивании (50 → 65), пуск/пауза и оба шага работают. Рабочая страница пользователя обновлена, ошибок JavaScript нет. Синтаксис zz-ui.js и встроенных скриптов проверен.
По уточнениям пользователя: кнопки меню должны стоять в центре экрана, двойной щелчок — складывать группу один раз, а перенос в верхнюю или нижнюю полосу — переворачивать её ещё до отпускания. Центр сетки, назад/вперёд и балансов теперь совпадает с центром экрана: прежняя привязка к центру холста давала сдвиг 22,5 px при открытом поле строк. Кнопка оси продолжает следовать самой оси и возвращать её в центр по щелчку.
Первый щелчок сразу складывает или раскрывает группу; второй щелчок двойного нажатия не переворачивает и не закрепляет её. При изменении размера свободной группы сохраняется место видимого заголовка, а ограничение у края экрана учитывает заголовок, поэтому раскрытие не уводит группу. Пока указатель удерживается в верхней полосе, группа раскрывается вниз, в нижней — вверх; после изменения направления сохраняется место хвата под указателем. Ширина поля строк на компьютере меняется дискретно по сетке с шагом 60 px; призрачная граница и итоговая ширина совпадают. Первая кнопка подтянута к левой границе вместо следующего пустого треугольника.
Проверено в браузере: двойной щелчок переключает группу один раз без смещения заголовка; при удерживаемой мыши перенос вниз и затем вверх меняет направление до отпускания; два соседних положения границы отличаются на 60 px. Рабочая страница пользователя обновлена, ошибок JavaScript нет. Синтаксис zz-ui.js и трёх встроенных скриптов проверен.
Все 21 ссылки левого меню имеют одну левую границу и ширину. Добавлена отдельная ссылка «Зеркалиус · 3 зеркала» на действующее окно в Зазеркалиусе (#zerkalius). Проверено открытие окна: холст и 13 кнопок управления на месте. Настройки узора, зеркала, следа, двух наклонов, сброса, картинки и размера PNG собраны в ромбы 48 × 48 px по три в ряд; панель занимает 156 × 172 px. Наклон открывает компактный ползунок. Кнопка снимка PNG находится рядом с имеющейся видеозаписью.
Проверка на ширине 390 px: ссылки помещаются в экран, ромбы доступны, наклон меняется и сбрасывается, PNG скачан настоящим файлом 946 × 2048. Мобильная проверка выполнена кликами при размере окна 390 × 844; отдельная проверка касания на устройстве не выполнена. На компьютере также проверены выравнивание меню и соседние кнопки PNG/видео.
На вопрос пользователя о тормозах проведены замеры хаба без музыки и с заполнением 1 и 8 строк в секунду. Каждый музыкальный шаг менял ключ фонового холста и заново рисовал весь треугольник вместе с отражением; на плотном фронте этот путь занимал до 24,6 мс. Теперь фон сохраняется, а музыкальный шаг обновляет слой звучащих битов. Для этого пути 95-й процентиль времени вызова снизился с 20,8 до 0,2 мс; это измерение отдельной отрисовки, не ускорение всей страницы во столько же раз. Отдельные кадры дольше 50 мс остаются в замерах. PNG по-прежнему включает текущий музыкальный фронт. Исправлено также перекрытие верхней музыкальной кнопки линией зеркала. Локальные повторные замеры доступны при index.html?perf=1; данные не передаются наружу. Проверены синтаксис модулей и встроенных скриптов, ошибок JavaScript в браузере нет.
По уточнениям пользователя: два разных треугольника вместо одного; начальная схема «квадро» с двумя перпендикулярными направлениями или три равносторонних направления под 60°. Ромб «оси» выбирает схему и кратность 1 / 2 / 3. Пользователь подтвердил: кратность — число повёрнутых копий каждого набора вокруг центра. На каждом направлении можно выбрать общий узор, строки поля, Серпинского или свои TXT/JSON, задать цвет, скопировать строки из поля и перенести набор обратно с отменой. Скрытые наборы сохраняются при смене схемы. Отдельная команда выставляет зеркала по начальным осям; ручки разведены вдоль линий, чтобы совпавшие центры не закрывали друг друга.
Угол и скорость изменяются прямо в ромбе: при наведении видны две половины со стрелками, шаг 1° или 1°/с. Ползунок только скорости постоянно находится в удлинённой шапке группы. Перенос и сворачивание шапки игнорируют элементы управления, размеры кнопок при наведении не меняются. ∞ каждого зеркала задаёт круг, эллипс, восьмёрку, маятник или замкнутую кривую по формулам x(t), y(t), a(t), период, фазу, размах и поворот. Формулы разбираются ограниченной математической грамматикой без выполнения JavaScript; проверяются конечность и замыкание. Общие циклы запускают три разные кривые и синхронизируют периоды. Ручной угол или перенос останавливает соответствующую кривую; пауза сохраняет фазу. Время скрытой вкладки не догоняется.
Затем пользователь попросил каждому зеркалу четыре варианта: прямой, инверсия, реверс, инверсия + реверс. В группе каждого зеркала добавлен ромб режима с половинками-стрелками. Режим меняет строки именно отражённой ветви: инверсия 0 ↔ 1, реверс битов внутри каждой строки, либо оба. В последовательных отражениях флаги складываются по XOR: повторная инверсия или повторный реверс возвращает прежние биты. Исходные строки поля не переписываются; отрезки, цвета и PNG используют выбранные преобразования. Проверены все четыре варианта и все 16 пар их последовательного применения, в браузере — переключение и сохранение.
По снимку обрезанного рисунка: прежний код отражал уже обрезанную картинку экрана, а затем ещё раз обрезал её перед масштабом. Теперь сначала складываются преобразования всех исходников и отражений в координатах сцены, и только итог рисуется на выходном холсте. Ромб PNG открывает размер (1024 / 2048 / 4096 или свой), прозрачность и кадр «всё построение» / «видимый холст». Полный кадр считает границы всех копий, в том числе за экраном. Проверочный PNG 1024 × 1024 сохранён, RGBA и прозрачный угол подтверждены, изображение осмотрено.
После вопроса «а это откуда и для чего» пользователь уточнил режим «след»: нужны короткие отрезки, у 1 наклон ╲, у 0 наклон ╱. Длинные лучи заменены локальными штрихами внутри каждой ячейки; в этом режиме они заменяют цифры и отражаются вместе с рисунком. Кнопка подписана «╲ 1 / ╱ 0».
Проверены синтаксис JS и встроенных скриптов, разбор TXT/JSON и ограничения наборов, композиция отражений с выходом за экран и возвращением, границы сцены, масштаб вокруг курсора, замкнутые кривые и ошибочные формулы. В Chrome проверены обе схемы, кратность, отдельные строки, сохранение после обновления, встроенные шаги и ползунки, три движущихся кривые, остановка, редактор PNG и загрузка файла; мобильный холст 348 × 591 и панель PNG 220 px. Ошибок JavaScript нет.
При проверке четырёх режимов на опубликованной странице с сохранённой пользователем тесной раскладкой обнаружено: центр правой стрелки «Режим зеркала 1» попадал в пустой div тела второй группы. Прозрачные прямоугольники гроздей перехватывали нажатия на соседей. Теперь общий контейнер и пустое тело не принимают указатель; шапка и сами ромбы принимают. Положения, сцепки и сворачивание групп сохранены. Проверено на группах с расстоянием 52 px: elementFromPoint попадает в нужную стрелку первой группы, щелчок переключает «инв + реверс» в «прямой»; перенос шапки работает.
По просьбе пользователя включённые кнопки теперь имеют заливку 62% вместо общей с наведением 26%, белый контур толщиной 2 px, жирную светлую надпись и галочку. Выбранный режим каждого зеркала выделяется во всех четырёх вариантах. Размер 48 × 48 px и сохранённые положения групп не меняются; выключенные ромбы сохраняют прозрачность 12%. Проверены включение/выключение зеркала, вращения и полный круг режимов стрелками.
В «Вид» добавлен ромб «Аа · подп.» — включает названия «Зеркало 1–3» возле ручек поворота и «Холст» либо «Холст 1–3» возле исходных наборов. Подписи сохраняются, следуют за масштабом, сдвигом и движением зеркал, остаются горизонтальными и пропускают указатель к холсту. Названия близких холстов разводятся по высоте; выключенное зеркало подписано приглушённо. Подписи относятся к интерфейсу, как направляющие, и не добавляются в выходной PNG.
По просьбе пользователя в «Вид» добавлен ромб «🧲 магн.», включённый по умолчанию; выбранное выключение сохраняется. Пользователь уточнил, что половины — середина видимого отрезка зеркала и середины его половин, а не половины ячеек рисунка. При перемещении центр зеркала привязывается к центру холста, центрам других включённых зеркал, концам, серединам и четвертям их видимых линий, пересечениям и самим линиям. Точки имеют приоритет перед проекцией на линию. Допуск указателя — 10 экранных пикселей при любом масштабе, итоговая позиция — точно на цели. Недоступные за границами перемещения цели исключаются.
При ручном повороте магнит ловит углы 0°, 30°, 45°, 60°, 90°, 120°, 135°, 150°, а также параллельность и перпендикулярность другим включённым зеркалам; допуск указателя 4°, итоговый угол точный. Белая линия и сообщение внизу показывают прилипание, после отпускания возвращается обычный вид. Alt временно отключает магнит. Стрелки точной настройки, автоматическое вращение и траектории сохраняют свободное движение. Настройка не переставляет зеркала при загрузке страницы.
Проверены вычисления середины/половин, пересечений, диагональных и вертикальных линий, границы допусков, переход угла через 180°, 30/45/60/90°, параллельность, перпендикулярность и обратный перевод координат при масштабе 20–600%. В браузере ручной поворот дал ровно 60°, перетаскивание совместило центры зеркал точно, с выключенным магнитом близкий сдвиг остался свободным; выключение сохраняется после перезагрузки. Проверки отражений и циклических формул также проходят.
Проверка v0.1121 на опубликованной странице с сохранённой пользователем раскладкой показала, что добавленный нижний ромб «Магнит» задел шапку «Строки». Новый ромб поставлен справа от «Подписей» в том же нижнем ряду. Высота группы возвращена к v0.1120, а ширина тела увеличена до 96 px. На узком экране группа учитывает ширину 104 px и остаётся внутри холста. Положения остальных кнопок и сохранённые координаты групп не меняются; пустые промежутки по-прежнему пропускают нажатия. Высота вычисляется по заданной позиции кнопки, поэтому корректна и при первоначально скрытой вкладке.
По снимку пользователя первая группа зеркала исчезала на чёрном фоне: рамки, подписи и ползунок брали выбранный чёрный цвет зеркала. Для элементов управления тёмный цвет теперь осветляется до читаемой яркости; собственный цвет зеркала и рисунка не подменяется. Размеры и сохранённые координаты групп прежние. В каждую группу добавлен ромб «↔ ось»: включает ограничение ручного переноса и движения стрелками вдоль текущей линии зеркала. При таком переносе вращение останавливается; магнит не уводит точку с выбранной оси. Кнопка стоит рядом с «кривой», не удлиняя группу.
В настройке холста — выбор «Оси и треугольники / Развёртка». Развёртки используют те же шесть деревьев склейки, что вкладка «Развёртка», для 6 граней треугольной бипирамиды или 8 граней октаэдра. Источник строк общий, из ромба «узор»: Серпинский, исходные из хаба, поле или свои TXT/JSON. Первые 160 рядов ложатся треугольными рядами; недостающие биты добиваются нулями. Верхние грани U получают исходные биты, нижние D — инверсию. Цвета U/D настраиваются раздельно. Каждое зеркало отражает всю развёртку, со своими инверсией, реверсом и цветом; отражения считаются в мировых координатах, PNG сохраняет всю сцену.
Кнопка «◆ В Бирамиду» передаёт исходную развёртку или выбранное отражение (включая составные) на соответствующее тело: основание 3 или 4, рисунки U/D и цвета. При переносе учитывается перестановка вершин, задающая внешнюю нормаль объёмной грани, поэтому бит остаётся у своего ребра. Строки поля не изменяются. Выбор сохраняется, при повторном открытии Бирамиды импорт восстанавливается; кнопка «⇄ строки → грани» возвращает связь с полем. Простая приостановка этой связи не подменяет рисунок старым импортом.
По просьбе «вид — просто биты» добавлен ромб «01 биты» в группе «Вид» и тот же переключатель в настройке холста: цифры 0/1 без ячеек, заливки и рамок граней. Шрифты — тот же список поля плюс локальные шрифты ASCII-студии (JetBrains Mono, Fira Code, Source Code Pro, IBM Plex Mono, Space Mono, VT323, Share Tech Mono, Press Start 2P, Major Mono Display, Orbitron). Работают и без интернета. Пять цветовых заготовок меняют цвета зеркал, наборов и развёртки: классическая, лёд, пламя, зелень, светлые/серые. Ручной выбор цвета переводит заготовку в «Свои цвета»; настройки переживают обновление.
На хабе по снимку пользователя кнопка прежней страницы Zerkalius-code.html теперь называется «Код» (Code), а ссылка на три зеркала — «Зеркалиус» (Zerkalius). Адреса страниц сохранены. Проверены 12 схем, ориентация граней, инверсия, пределы движения по оси, читаемость чёрного зеркала, собственные строки, перенос на 6/8 граней и сохранность поля.
По просьбе «убирает из видимости всё неналоженное» и уточнению «пересечения фигур» в группе «Вид» добавлен ромб «⋂ перес.». Включённый оставляет только области, занятые хотя бы двумя отдельными фигурами или отражениями. Для треугольных наборов используется непрерывный внешний контур, для развёрток — объединение треугольных граней одной копии. Соседние грани одной развёртки сами себя не считают наложением. Клип применяется отдельно к каждой копии: её собственный контур пересекается с объединением всех остальных. Отражённые контуры приводятся к одному обходу, поэтому составные отражения не образуют ложных дыр. Нет совпадения — фигура скрывается целиком; выключил ромб — весь рисунок вернулся. Состояние сохраняется и действует в PNG и видео.
Пустой холст тянется левой кнопкой либо зажатым колесом: сдвигается камера со всей сценой. Группы остаются на своих местах. У линии каждого зеркала — узкая полоса захвата: можно переносить зеркало за саму ось, не только за номер. Это тот же перенос, с магнитом, Alt и ограничением «↔ ось» вдоль линии. Поворот по-прежнему за отдельную ручку ↻. Щелчок колесом без движения входит в дзен Зеркалиуса и выходит из него; прокрутка колеса остаётся масштабом.
Прежний общий дзен показывал только конус и скрывал Зеркалиус. Теперь кнопка активного Зеркалиуса и его ромб «◎ дзен» разворачивают именно этот холст, без групп и строк. Масштаб, направляющие и ручки остаются; меню вернётся при выходе. Выход — колесо, Esc или ромб в правом верхнем углу. В дзене стрелки сдвигают Зеркалиус, +/− меняют его масштаб; клавиши больше не сдвигают спрятанный конус. Пульт записи помещается в видимое окно; выбранный видеохолст явно называется «Зеркалиус», имя файла — zerkalius. Перехват кликов рисунком конуса ограничен собственными кнопками конуса и не блокирует видеопульт или другое окно.
«ПДФ» пользователь уточнил как PNG-картинку. Проверены реальные загрузки: PNG 2048×2048 RGBA с прозрачным фоном, пустая прозрачная картинка при одной фигуре без пересечений и непустые области при включённых зеркалах; WebM VP9/Opus 1920×1080, MP4 H.264/AAC 1920×1080. Файлы декодированы ffmpeg, длительность читается; WebM — 18 секунд, MP4 — 17 секунд. Проверены пауза/возобновление, запись в дзене и без него, перетаскивание пустого холста и перенос за ось с ограничением вдоль неё. Размеры и сохранённые позиции групп не сброшены.
Квадратные и ромбовые ручки переноса убраны с осей. Любое место линии переносит зеркало; круглая точка ↻ остаётся для поворота. Захват за настоящий пиксель бита выбирает все попавшие под курсор исходные наборы и отражения: прозрачные промежутки ничего не выбирают. При общем переносе каждое зеркало соблюдает собственный режим «↔ ось»; ограниченные зеркала перемещаются проекцией движения вдоль своей линии. Перенос пустого холста по-прежнему двигает камеру.
Общая отмена ↩ / повтор ↪ теперь сохраняет ручные позиции и углы зеркал, смещения наборов строк, масштаб, перенос и поворот камеры. Одно перетаскивание нескольких фигур — один шаг истории. Поворот холста в «Виде» проходит полный круг: половины ромба ±1°, колесо ±5°, Shift со стрелками ±15°, Home / правый щелчок — 0°.
Шапки групп магнитятся к верхней строке окна при перетаскивании, отдельной кнопки закрепления нет. Перенос обратно на холст открепляет группу; прежнее положение сохраняется. На телефоне три заголовка стоят рядом. Номера зеркал увеличены до 17 px; стандартное третье зеркало коралловое, собственные цвета сохраняются. В режиме пересечений остальные биты видны с яркостью 6%, без пунктирных контуров.
Проверено в Chrome: перенос за бит сдвигает зеркало, ↩ возвращает точное прежнее положение; ручные углы тоже отменяются и повторяются. Заголовок закрепляется и открепляется перетаскиванием. Проверены значения поворота 0° и 359° и мобильная ширина 390 px. Отдельная проверка выбора битов покрывает несколько наложенных зеркал, прозрачные промежутки, точки вне рисунка и повёрнутые фигуры. Проверки математики отражений и синтаксиса проходят.
Прямоугольная рамка настроек рисунка снята. Навигация хаба — одинаковые трапеции с общей шириной, высотой 46 px и промежутками 8 px; настройки остаются ромбами. Ромб замка разрешает колесо масштаба, перенос пустого холста и захват треугольника / отражения за биты. Под курсором могут одновременно двигаться исходный рисунок и зеркало. Прозрачные − / + стоят справа; двойной щелчок по процентам возвращает масштаб 100%.
Добавлен поворот поля 0–360°, видимый угол, ползунок и сброс в 0°. Поворот, масштаб и смещения учитываются рисунком, зонами захвата, отражением и PNG. Квадратный ромб на оси скрыт; линия переносит зеркало, круглая точка вращает. Проверено в браузере: масштаб 115% кнопкой и 90% колесом, повороты 15° и 359°, перенос за биты. На телефоне 390 px все 21 пункта меню имеют одинаковые ширину 351 px и высоту 46 px; ошибок JavaScript нет.
При увеличении Зеркалиус прежде растягивал небольшой готовый растр: цифры и края ромбов размывались. Когда масштаб выходит за разрешение этого растра, биты теперь рисуются непосредственно на выходном холсте: текст выбранным шрифтом, ромбы и отрезки — путями Canvas. Такой же способ работает для цифр и точек развёртки. Повороты, отражения, выбранные цвета и затемнение вне пересечений сохраняются. При уменьшении остаётся быстрый кэш; в увеличенном виде пропускаются биты за экраном, без создания огромных промежуточных картинок.
Сравнение в Chrome при одном и том же масштабе 266% подтверждает чёткие цифры вместо растянутых размытых. Проверены поворот 45°, цветное отражение и развёртка, ошибок JavaScript нет. Проверка отрисовки покрывает векторный режим 600%, уменьшенный кэш, оттенки отражений, яркость 6% вне пересечений и отбор видимых битов после поворота. Синтаксис и прежние проверки отражений / выбора битов проходят.
Настройки перенесены из левого меню в компактную полосу ромбов над холстом. Полоса прокрутки меню скрыта, прокрутка сохранена. Ромб 3D запускает переворот вокруг линии зеркала; колесо на нём меняет угол, двойной щелчок возвращает 0°. Линия оси получила приоритет над захватом битов, отдельный режим вращает ось за линию. Магнит включён по умолчанию: центр поля и центры исходных битов, при вращении — близкие углы с шагом 15°. Двойной щелчок по полю приостанавливает движение и звук и затем возобновляет то, что работало. Проверены матрица переворота, неподвижность точек оси и обратное преобразование, включая положение ребром.
Группы закрепляются перетаскиванием к верхней или нижней полосе на месте броска; координаты сохраняются отдельно, при сужении окна пропорционально укладываются в полосу. Крупная жирная цифра по центру заголовка включает ось и раскрывает её настройки; выключение сворачивает группу. Дублирующий ромб включения и отдельные кнопки Play убраны. Общий ромбический бегунок внизу запускает все включённые оси; его перетаскивание меняет общую скорость от 0 до 200%. Двойной щелчок по полю приостанавливает и возобновляет прежние вращения и кривые. Оси переносятся за линию, могут магнититься к центру и центрам битов; отдельный режим вращает ось за линию.
Зазор у ромбов исходного треугольника убран. Развёртка вместо точек рисует прилегающие ромбы, последний ряд грани — треугольники. В каждой ячейке показывается 0 или 1; кнопка «01 цифры» включает и выключает цифры, сохраняя заливку. При увеличении геометрия и текст рисуются непосредственно в разрешении холста. Проверены выключение и раскрытие оси из заголовка, общий бегунок, закрепление и сохранение позиций, переключение цифр и плотное покрытие грани для 1, 2, 3, 8, 64 и 71 строки.
Магнит при переносе оси теперь выбирает ближайшую подходящую цель: более дальний бит не вытесняет центр холста. При ограничении движения вдоль оси сначала исключаются недоступные точки, затем выбирается ближайший бит. Порог остаётся 10 экранных пикселей при любом масштабе. В развёртке кнопка «01 цифры» выключает цифры также в режиме «только 0/1».
В браузере проверены перенос к центру, ограничение вдоль оси, отмена ручного перемещения, запуск только включённых зеркал и остановка / восстановление двойным щелчком. Добавлены 6 проверок магнита, полного покрытия грани ромбами и крайними треугольниками, выключения цифр. Все проходят. Исправлено окружение существующих тестов Solarius: глобальный window теперь определён в VM; все 43 проверки геометрии проходят. Обычный опубликованный index.html проверен: хаб v0.110, пульт над полем и переворот вокруг зеркала присутствуют.
Ползунок рядом с ромбом 3D управлял поворотом поля, но при закрытом замке возвращался назад. Теперь подпись «Поворот поля» с текущим углом показывает его назначение; ползунок, шаги угла и сброс работают независимо от блокировки переноса и масштаба. Край 360° не перескакивает к началу, сохраняется после обновления страницы. Ромб 3D по-прежнему запускает / останавливает переворот вокруг линии зеркала.
Каждый кадр переворота прежде заново строил все ромбы и цифры фонового треугольника. Теперь готовый рисунок с отражением сохраняется в кэш и преобразуется целиком. Изменение зеркала, исходника, смещения исходника или размера окна пересобирает рисунок; PNG и видео рисуются в своём разрешении. В пробном замере Chrome время sierDraw уменьшилось примерно с 18 до 0,15 мс. Проверены перетаскивание ползунка при закрытом замке, полный круг и сброс, переворот, узкий экран 390 px и непустой PNG 2048×1162. Ошибок JavaScript нет. В старых записях Layers восстановлены номера версий, которые затронул прежний общий бамп журнала.
Пользователь: «нужно маятника на 512 строк в зеркалиус проект куда нибудь, выбери где не будет тормозить строки, там генерировать». Маятник — макросы модуля ТРЕУГСЖАТИЯ из _pzl.xlsm (листы «Лист19 (3…6)», кнопки «Вниз», «вправо», «лево-право», «Анимация»). Каждая вершина пускает вниз конус правила 90: клетка = старое ⊕ левый ⊕ правый родитель, вершины идут якорь, −1, +1, −2, +2…; перекрытия «мерцают» синим (стал 1) и красным (стал 0).
Место выбрано отдельное — mayatnik/Zerkalius-mayatnik.html, а не окно в большой странице: поле 1534 × 512 клеток живёт в типизированных массивах и рисуется одним ImageData, пиксель = бит, без DOM-клеток. Полное построение 512 вершин — около секунды, и идёт порциями по кадрам, так что страница не замирает. Есть ходы «лево-право», «вправо», «влево», «одна вершина», поле пустое / все 1 / все 0, строки в .txt и PNG.
Сверено с Excel: в Хорр.xlsm на листе «Маятник» (копия ТРЕУГСЖАТИЯ) девять нажатий «лево-право» с конусами по 128 строк — 35 968 значений и 2 440 цветов совпали с ядром страницы клетка в клетку. Кнопку в «Черновиках» хаба поставить, когда другая сессия закоммитит хаб v0.112 (сейчас он у неё в работе).
Пользователь запустил 2024 строки × 2024 вершины (поле 6070 × 2024): шло около 4 вершин в секунду — почти всё время съедала перерисовка 12 млн пикселей на каждом кадре. Теперь пиксель пишется одним 32-битным числом, а при «Построить» большое поле перерисовывается раз в секунду; считается при этом каждая вершина, и 2024 вершины идут около 80 секунд. На вопрос «так мы кадры потеряем?» — нет: «▶ Анимация» по-прежнему показывает каждый кадр, а пропускается только показ промежуточных картинок при быстром построении.
«А потом все кадры сможем видеть?» — ползунок «кадр» и клавиши ← →: любое состояние после N вершин, вперёд и назад. Хранить все кадры нельзя (2024 × 24 МБ), поэтому страница держит опорные кадры не больше чем на 200 МБ и досчитывает нужный от ближайшего: на 512 строках — сразу, на 2024 — до нескольких секунд.
Масштаб: колесо — к точке под курсором, мышь или палец — сдвиг, два пальца — масштаб, двойной щелчок или 0 — по ширине, кнопки − / +. Проверено в Chrome: бит под курсором при приближении остаётся на месте, перетаскивание сдвигает поле.
ПОЧЕМУ ЦВЕТА МЕЛЬКАЮТ
Цвет в Excel — чётность числа конусов, накрывших клетку: нечётное — чёрный (здесь белый / серый), чётное — синий (1) или красный (0). Глубоко внизу клетку накрывают все n вершин, поэтому при n, кратном 4, низ весь цветной, при n = 4m+2 — весь белый, при нечётном n — пополам; вверху строку r накрывают r+1 конусов, отсюда полосы через строку. Проверено моделью на n = 40…45.
Хаб v0.113: кнопка «Маятник» — последней в Черновиках.
Пользователь: «закинь кадры в Битфильм и ссылку на страницу с отрисовкой, и в Лабораторию». Новый раздел «Маятник — XOR из Excel»: mayatnik-256.gif — 256 строк, все 256 кадров (3,8 МБ); mayatnik-512.gif — 512 строк, каждый 8-й кадр (3,6 МБ); mayatnik-2024.webp — последний кадр 2024 строк (0,7 МБ). Кадры посчитаны ядром MAYATNIK самой страницы, то есть тем, что сверено с Excel; в разделе — кнопка «▶ открыть Маятник». «Лаборатория» — прежнее имя панели «Черновики» хаба: кнопка «Маятник» там уже стоит с хаба v0.113.
ПОЧЕМУ 512 — КАЖДЫЙ 8-Й КАДР
Все 512 кадров 512 строк — около 30 МБ GIF: пёстрое поле почти не сжимается. Каждый 8-й (кратный 4) — 3,6 МБ, вровень с остальными GIF страницы, и все кадры в одной фазе мигания: низ всегда цветной, и видно рост самого узора, а не мелькание. Мигание целиком показывает GIF на 256 строк, где кадр — каждая вершина.
Отдельный ромб ↻ запускает и останавливает вращение самой линии зеркала вокруг её центра в плоскости поля. Центр остаётся на месте; ручное кручение приостанавливает автоматическое. Рядом всегда виден ползунок «Зеркало» с множителем ×0.1…×1000. У переворота 3D — свой такой же ползунок. Двойной щелчок по значению возвращает ×1; скорости сохраняются. Двойной щелчок по пустому полю останавливает оба ранее запущенных вращения и затем возобновляет их.
Общий бегунок трёх осей Зеркалиуса теперь задаёт ×0…×1000 вместо прежних 0…200%. Шкала логарифмическая: малые скорости удобно выбирать рядом с большими. Ромб общего пуска можно тащить по полосе; число над ней сбрасывается двойным щелчком к ×1. Сохранённые прежние множители остаются прежними. Бегунок поднят над закреплёнными нижними группами, которые перекрывали его значение.
Для вращения зеркала кэшируется исходный рисунок до отражения: при смене угла пересчитывается отражение готовой картинки. Исходные кнопки нот не пересоздаются на каждом кадре, отражённые передвигаются. Пробный замер вращения ×1000 в Chrome: среднее время sierDraw около 1.8 мс, 95-й процентиль 2.9 мс. Проверены пуск/пауза обоих вращений, общий двойной щелчок, концы диапазонов, перетаскивание общего ромба, сброс и сохранение скорости после обновления, экран 390 px. Семь проверок управления Зеркалиусом проходят; ошибок JavaScript в проверенных страницах нет.
По просьбе пользователя опубликована последняя скачанная запись хаба Zerkalius-hub-20261011-233758.mp4 под окончательным названием «Прилёт Зеркалиуса». Ролик 1920×1080, 1 минута 56 секунд, около 4,6 МБ. В начале «Битмультфильмов» — встроенный плеер с паузой, перемоткой и полноэкранным просмотром, обложка из кадра записи и ссылка на скачивание MP4. Видео перенесено без перекодирования; индекс MP4 вынесен в начало файла для начала просмотра до полной загрузки. Файлы лежат рядом со страницей в rezultaty/.
По просьбе «закинь в проект рисунки» присланный PNG сохранён как rezultaty/zerkalius-tri-zerkala.png. В галерее появился раздел «Рисунки Зеркалиуса»: карточка «Три зеркала», просмотр оригинала по щелчку и скачивание PNG. Изображение сохранено без изменения.
При разборе жалобы на тормоза найдены 16 живых карточек конуса и две пирамиды, которые загружали целые приложения в iframe. Браузерная отложенная загрузка могла запустить несколько таких страниц ещё до появления карточек на экране. Теперь приложение создаётся только по ▶; работает один предпросмотр, следующий удаляет предыдущий. Выход карточки за пределы экрана, скрытие вкладки и уход со страницы удаляют активный iframe. Ссылки на полноценные страницы сохраняются.
Проверено в Chrome: после загрузки 18 карточек и ноль запущенных приложений, пуск — одно, переключение — по-прежнему одно, прокрутка — ноль. PNG открывается в просмотрщике, изображение помещается на экране 390 px; ошибок JavaScript нет. Две проверки предотвращают одновременный запуск, утечки при скрытии и возврат автоматической загрузки.
«Границу сделай обводкой этого треугольника» — переключатель «обводка»: жёлтая ступенчатая линия по краю зоны, где биты перестают быть одинаковыми. Край не прямой — он зависит от самих битов (на 200 вершинах 512 строк, например, ноль впервые появляется на −4, −13, −30, −76 от якоря в строках 5, 20, 50, 80), поэтому линия считается по данным: в каждой строке — крайний левый и правый бит, отличный от фона полос, ступеньки соединены по строке. Толщина задана в битах и растёт при отдалении, чтобы линия не пропадала на 2024 строках.
«Сразу готовые кнопки — построить Хоррориуса 1024, потом 2024» и «до скольки можем строить?» — кнопки «хорр» 256 / 512 / 1024 / 2024 / 4096 (строк = вершин, ход «лево-право», сразу «Построить»); предел строк поднят с 2048 до 4096. Поле N × N маятника — примерно 3N × N: 2024 — ~0,3 ГБ и полторы минуты, 4096 — ~0,5 ГБ и около 10 минут; 8192 упирается в предел холста Chrome и в часы счёта, поэтому не включено.
Найдено при проверке в Chrome: в скрытой вкладке «Построить» стояло на вершине 0 — браузер не крутит кадры анимации в фоне. Быстрое построение теперь идёт на таймере, в фоне порция больше (400 мс): 512 × 512 в скрытой вкладке — 4,2 с. «▶ Анимация» осталась на кадрах.
Битмультфильмы v0.016: «в начале будут свежие заметки, перемести наверх» — раздел «Маятник» поднят в верхний блок свежего (к «Прилёту» и «Рисункам Зеркалиуса»), перед «Циклом 1024».
«Проведи исследование, что почему как строится в Хоррориусе», «что за треугольники исчезают, частота их, как это связано с верхушкой», «запиши в исследование». Замеры ядром MAYATNIK (то, что сверено с Excel) на 128…1024 строках, только биты:
исчезают пустые треугольники Серпинского — шум сужает их с боков и сверху; дыра во всю ширину гибнет на 12-й вершине при любой высоте, ≥ N/2 — к ≈ 0,18 N, ≥ N/4 — к ≈ 0,26 N, все ≥ 31 — к ≈ N/3 (0,31 → 0,32 → 0,33 на 256 / 512 / 1024). Шум лежит строго в конусе якоря (|c| ≤ r), снаружи — одни «1». Край шума недобирает до края конуса в отдельных строках, и эти недоборы периодичны с шагом n/2 строк (n — число вершин) и повторяют мотив верхушки: боковой край — верхушка, сложенная столбиком. Картинки: issledovanie/mayatnik-kadry-256.png, mayatnik-stupeni.png. Почему 1/3 и почему n/2 — открыто.
«Теперь разбери дальше». Поле маятника — две независимые шахматные половины (вершины чередуют чётность, конус и его родители живут в одной половине). Если конусы пересчитывают всю свою половину строки, а не треугольник, поле даёт точная формула: вершина k — свой Серпинский в строках r с r & (m − 1) = 0, m — число конусов той же чётности начиная с неё (Куммер, как родник в разделе 13); сверено на 128 строках, n = 3…128, клетка в клетку, и это чистый фрактал без шума. Значит, шум — целиком от обрезки: клетки на краю конуса берут непересчитанных соседей, а края левых вершин проходят диагоналями через конус якоря — отсюда и «шум только в конусе якоря». Полоса «1» снаружи доказана: она замкнута, и в ней всегда 1 ⊕ 1 ⊕ 1 = 1 или пусто ⊕ 0 ⊕ 1 = 1. Картинка issledovanie/mayatnik-kraya-64.png: как есть и без краёв.
«Индекс не масштабируется мышкой», «биты не играют», «всё убежало из видимости и никак не достать». Масштаб колесом и +/− раньше зависел от замка перемещения; теперь доступен всегда, замок разрешает только перетаскивание. Ромб ⌂ рядом с масштабом возвращает исходный рисунок и ось в центр, убирает сдвиги, ставит масштаб 100%, повороты поля и 3D в 0°, останавливает оба вращения. Двойной щелчок по проценту делает то же. Выбранные узор, наклоны битов и скорости сохраняются.
Запуск с вершины работал, но уехавшая вершина становилась недоступна. В верхнюю полосу добавлены «Биты ▶/Ⅱ», скорость 1/2/4/8 строк в секунду и ■ для остановки с возвратом к началу. Пауза продолжает ту же строку; индикаторы исходной и отражённой вершины синхронизированы. Начальный треугольник помещается ниже панели, включая экран 390 px. Кнопка возврата поднята над прозрачной частью панели, которая перехватывала её на узком экране.
Проверено в Chrome: колесо при закрытом замке, +/−, возврат после переноса битов на 610 px и запуска 3D, пуск/пауза/остановка и мобильные кнопки. Реальная запись содержит AAC со звуком (средний уровень −29,5 dB, максимум −15,7 dB). Три проверки воспроизводят закрытый замок, прокрутку меню и восстановление сохранённого рисунка с большими сдвигами и 3D под 90°.
Пользователь: «когда дыра уменьшается, мы отдаляемся от верха… давай считать дальше, это очень занятно». Замер на 256 / 512 / 1024 строках: дыра Серпинского остаётся перевёрнутым треугольником, её верх опускается на ½ строки за вершину (строка за пару «влево + вправо»), кончик поднимается на 1: верх T + n/2, кончик T + h − n, ширина 2h − 3n, гибель при n = 2h/3 — треть ширины. Центральная (T = h = N/2) гибнет при N/3, верхняя (T = h = N/4) — при N/6; вся таблица раздела 14 — моменты, когда N − 3n проходит пороги. Картинка issledovanie/mayatnik-dyra.png: треугольник по закону поверх настоящей дыры. Гипотеза «площадь верхушки равна площади дыры» не подтвердилась (на n = 32: 45 580 против 72 361). Открыто: почему скорости ½ и 1, и шаг ступеней n/2.
Покадрово край дыры в одной строке сдвигается по повторяющемуся рисунку: на 1024 строках за каждые 4 вершины левый край +1, +1, +2, 0, правый −2, 0, 0, −2 (ровно 4 столбца внутрь с каждой стороны), верх — 2 строки; на 512 строках период 8 с тем же итогом (8 за 8). Скорости закона дыры (1 и ½) — точный шаг, не среднее по шуму. Вывод «почему 4 за 4» ещё впереди.
В координатах p = (r + c)/2, q = (r − c)/2 конус вершины — четверть плоскости, дыра Серпинского — прямоугольный треугольник p < N/2, q < N/2, p + q ≥ N/2, и закон дыры одной фразой: все три стороны сдвигаются внутрь на n/2 — на полуразмах маятника. Отсюда кончик N − n и верх N/2 + n/2. Простое наложение сдвинутых Серпинских дало бы вдвое меньше и неподвижный верх — удвоение и опускание даёт обрезка конусов.
Ход «только влево» / «только вправо» подчиняется простому наложению сдвинутых Серпинских: дыра отступает с одной стороны на размах вершин, верх стоит (N/2). У маятника обе стороны отступают на полный размах и верх опускается — это взаимодействие левых и правых вершин. На своей шахматной половине при «сначала влево» сторона p отступает на 1 за каждую свою вершину, q — на 2 за каждую свою правую; при «сначала вправо» роли зеркальны, итог (верх, ширина) тот же до строки.
Опыт: вершины одной чётности 0, −20 (или 0, +20) дают чистый правильный узор; добавить третью с другой стороны — сразу шум и неровные дыры, порядок даёт зеркало (картинка issledovanie/mayatnik-tri-vershiny.png). Гипотеза «виртуальная вершина на глубине j» одной точкой не подтвердилась: клетки, нарушающие правило 90 относительно родителей, занимают почти всё поле, кроме дыр, — стык это область. Измерять закон дыры на трёх вершинах не выходит (дыру режут полосы): он проявляется на длинном маятнике.
Автор: Codex — независимый исследователь Хоррориуса. По просьбе «исследуй самостоятельно, до победы» и «все свои подписывай» отдельно подписаны вывод, код проверки, данные и график. Я проверил оставшуюся гипотезу о шаге бокового края n/2 и нашёл контрпримеры: 48 вершин — период 32, не 24; 16 — период 16, не 8. В прежнем тексте n/2 ограничен примерами, где он действительно совпадает с периодом.
Я вывел замкнутую рекурсию конечной полосы в координате d = c + r: родители d и d − 2. После ранних строк переход нижнетреугольный, T = I + B над битами; при P — степени двойки не меньше числа независимых переменных B^P = 0, поэтому T^P = I. Это доказывает периодичность полосы по степеням двойки. Чтобы доказать период всего края, я проверяю, что в полном цикле первый ноль всегда остаётся в полосе; для 12 случаев 8…128 вершин получены точные установившиеся периоды 8, 16, 32, 64.
Независимая проверка: 575 438 битов рекурсии совпали с ядром MAYATNIK.cone, извлечённым из страницы. Кроме того, на опубликованном Маятнике построены 512 строк и 48 вершин и выгружен TXT: отступы первого нуля 1/9 в строках 96/120 и снова 1/9 в 128/152 подтверждают цикл 32. Раздел 15 содержит доказательство, подписанный график и ссылки на исполняемый расчёт и JSON. Я не объявляю выведенной простую формулу минимального периода по n и не подменяю этим доказательство скоростей большой дыры.
«Обрезка на N/3»: центральная дыра гибнет при n = N/3 (закон дыры, Исследование §14¾), дальше кадры — почти одинаковый шум. На странице Маятника — кнопка «N/3» у поля «вершин» и галочка «до N/3» для кнопок «хорр»: вершин ⌈N/3⌉ + ⌈N/64⌉ (запас — увидеть, как дыра закрылась); 256 строк — 90 вершин. Фильмы в Битмультфильмах пересобраны до N/3: 256 строк — 90 кадров, 1,2 МБ вместо 3,8; 512 строк — каждый 4-й кадр до 179-й вершины, 46 кадров, 2,2 МБ вместо 3,6; последний кадр держится 1,5 с. Подписи ссылаются на §14¾.
«То есть это бесконечная кинолента?» — при высоте N нет: вершина a трогает конус якоря только при |a| ≤ 2(N − 1), крайняя вершина маятника стоит на ±n/2, поэтому к n ≈ 4N картинка внутри конуса якоря застывает. Замер: N = 64 / 128 / 256 — биты последний раз меняются на вершине 250 / 506 / 1018, цвета — 253 / 509 / 1021. Четыре части ленты: Серпинский, таяние дыр до N/3, шум без дыр до 4N, застывший кадр (растёт только боковая полоса «1»). Исследование §14⅞; на странице Маятника — кнопка «4N», предел вершин поднят до 16384.
«А если цвет битов уберём, много сэкономим?» — замер: без цвета фильмы легче на ~17 % (1,18 → 0,98 и 2,16 → 1,82 МБ), расчёт быстрее на ~20 % (1024 строки до N/3: 2,6 → 2,0 с), поле 5 байт на клетку вместо 6. Но цвет можно не терять: «мерцание» из Excel — это чётность числа конусов над клеткой (первая запись чёрная, каждая следующая переключает чёрный ↔ цветной, цветной показывает бит). Вершины всех ходов идут подряд, поэтому число конусов над (r, c) — вершины a из [lo, hi] с |c − a| ≤ r и чётностью c + r — считается одной формулой (MAYATNIK.tint). Массив цветов из ядра убран; формула сверена с прежним хранимым цветом на 15,3 млн клеток (все ходы и фоны) и заново с выгрузкой Excel (35 968 значений, 2 440 цветов) — расхождений нет. Опорные кадры ползунка — только биты, их вдвое больше в тех же 200 МБ, листать назад вдвое быстрее.
Codex — независимый исследователь Хоррориуса · 12.10.2026. Продолжаю от себя по просьбе пользователя. Проверил сжатие по исходным битам: на 384 строках при N/3 = 128 вершинах крупнейший сплошной нулевой треугольник ещё высотой 67; на 768 строках при 256 вершинах — 131. N/3 не универсальная точная граница для произвольной обрезки. Предложил огибающую с размером исходной дыры P, связанным со степенями двойки; мелкие отклонения остаются, точной формулой каждого кадра её не называю. Все замеры, определения и графики — в моём разделе 16.
На этом компьютере подтвердил окончание браузерного расчёта v0.006: 4096 строк / 1430 вершин, 227,3 с. Мой независимый движок по 32 бита в слове завершил 8192 строки / 2859 вершин за 62,51 с, битовый массив 18,81 МиБ; это без большого холста, цветов и истории отмены. На 16 384 строках прошёл только 64 вершины, оценка полного расчёта 10,7 минуты. Уже добавленную большую программу отдельно сверил с ядром на 2 228 224 клетках, расхождений нет; проба 70 000 строк / две вершины заняла 1,93 с для конусов и 21,41 с со всем выводом. Полный прогон 70 000 строк не выполнен.
Пользователь уточнил: разные картинки при каждом масштабе — в этом и интерес. Поэтому создал лабораторию масштаба v0.001: колесо, ползунок, перетаскивание, каждый шаг построения, запись показанных масштабов и сдвигов, сохранение всего архива и PNG вида. Расчёт, подготовка растров и упаковка архива — в Worker; при масштабе готового кадра конусы не пересчитываются. Биты каждого шага хранятся отдельно, упакованы без потерь; пустое начальное поле задаётся описанием, при открытии проверяются SHA-256 кадров. Лаборатория ограничена 512 строками и 180 МБ битовой истории; для огромного фильма нужна запись на диск частями. По следующему уточнению вернул цвета исходного Маятника (белый/серый, синий/красный), сверил формулу с ядром страницы. Добавил поворот 0…360° вокруг вертикальной оси центра кадра, ручной ползунок и автоматическое вращение «Ось Y»; цвет и угол также записываются в архив видов. На этом компьютере проверяется параллельная проекция, при доступном WebGL используется перспектива.
Скачанный настоящий архив: 512 строк, 179 рассчитанных кадров, 111 443 968 хранимых битов с выравниванием, 179 контрольных сумм — всё совпало с повторным построением. Код фонового потока открывает и повторно выгружает те же биты, суммы и виды; повреждение одного бита отвергается. Автоматизированное открытие через файловый диалог ограничено настройкой браузерного расширения, поэтому этот путь проверен непосредственно кодом Worker. В проверенной версии большого PNG-рендерера обнаружил отдельную неточность: перенос целого слова в пиксель его середины и потерю 32 крайних единиц на тесте 1024 / 2 / масштаб 33. Подготовил точный модуль распределения по границам пикселей, не меняя чужую большую программу. Мой раздел 17 объясняет и художественный эффект уменьшения, и проверку сохранности данных.
По просьбе «распиши в мультфильме» проверил сами GIF: 256 строк — 91 кадр (0…90), 512 — 46 (0, 4, 8…176, 179). В Битмультфильмах объяснил: шаг — одна вершина и пересчёт всего конуса сверху вниз; за шаг могут меняться многие строки. Уточнил 90 шагов плюс начальный кадр; задержка показа не равна времени расчёта строки.
Codex — независимый исследователь Хоррориуса. Пользователь уточнил: разные картинки возникают при масштабе одного неизменного кадра, и попросил начать с одного кадра скриптом. Сначала я отдал исходный PNG, затем написал отдельную выборку с точными дробями. Взял текущий кадр 96, 2048 строк, 8190×2048 клеток; 4096 в прежнем имени выгрузки — цель расчёта, а не готовый кадр.
Я сохранил 17 масштабов × 3 сдвига сетки: 51 вид, 47 различных по пикселям, а также центральную вырезку каждого вида. Исходник сохранён без изменений. Виды — PNG 1024×768 плюс подпись, фрагменты — 256×256 плюс подпись. Проверил все контрольные суммы, точные вырезки и 1836 пикселей независимой дробной формулой. Серия моделирует выборку без сглаживания и не выдаётся за все возможные масштабы или точную фильтрацию каждой видеокарты.
Галерея · PNG и подписанные скрипты ZIP · Раздел 18 с методом и проверкой.
Codex — независимый исследователь Хоррориуса. Пользователь заметил: «ты просто кадр на части порезал». В первом прогоне я действительно сохранял фиксированное окно и центральную вырезку; отдельные мотивы не выделял. Уточнение — нужен целый кадр при каждом масштабе. Я расширил каждую из 51 экранных сеток до полных границ исходного кадра. Проверил границы, 714 дробных индексов и совпадение всех 40 108 032 пикселей прежних окон с новыми целыми изображениями. Кадр не изменился, подписи вынесены в метаданные.
Следующая просьба — «эти части по одному узору обведи». Я обвёл один выбранный участок в каждой из шести сравнительных частей. В №4 округлый мотив виден ясно; в других масштабах меняется или распадается. Это ручная визуальная обводка одного места, а не автоматическое выделение естественной границы. Чистые вырезки выбранных мест сохранены отдельно. Обводки · Целые кадры.
Codex — независимый исследователь Хоррориуса. По просьбе найти части, внутри которых проходит ось, а за границей симметрия заканчивается, я проверил полный исходник и экранный PNG 35/32. Искал четыре направления решётки. В исходнике получил 1234 ограниченные области с точным отражением каждого пикселя и несовпадением снаружи сбоку, перед началом и после конца. Все находки при заданных размерах вертикальные; остальные направления не прошли критерий. Из 794 компактных областей 116 имеют узор в каждой строке, без пустых серых дыр. На кадре показал 36 распределённых примеров, 10 начинаются выше строки 1024.
Я независимо сравнил 7 063 644 исходных пикселя и 3702 внешние несовпадающие пары. В самом экранном PNG — 176 областей, 553 170 пикселей и 528 внешних пар. На контрольных искусственных изображениях проходят все четыре направления. Прежний округлый мотив точно симметричен в исходном блоке, а на экране совпадение около 97,15%: масштабная выборка немного нарушает симметрию. Я явно разделил исходные области и их проекции. Поиск ограничен указанными ширинами и формами; всех произвольных контуров он не перечисляет. Области · Раздел 19.
Пользователь искал в «шуме» рисунки и дал определение: узор — фигура с отчётливой зеркальной симметрией, которая кончается на её границе; «вместо кружков рисуй линии симметрии и обрывай их, когда симметрия закончится»; ширину — «как Хорохориус»: смена бита справа, потом слева, не совпало — ещё шаг влево, потом вправо, не сошлось — строку останавливаем. Флажок «симметрия»: ось ищется между любыми соседними столбцами, строка засчитывается при зеркале ≥ 6 клеток в обе стороны (и 0, и 1 внутри — не дыра и не полоса), вертикаль — ≥ 8 таких строк подряд (случайно ≈ (1/64)^8). Края зоны по строкам — маятником. На кадре 2024 строки / 128 вершин: 366 вертикалей, оси на 640, 768, 896, 1024… (шаг 64 и 128 — сами нашлись), зеркальная зона каждой оси — треугольник под 45°, расширяется на клетку в сторону за строку (как конус правила 90); допуск на шаг нужен в 74 строках из 1151. Горизонтальной симметрии нет: по битам лучшее 70–79 % (случайно 50 %), по размытым пятнам «горизонтальных» мест столько же, сколько на случайных битах (4 585 против 5 068) — не рисуется. Расчёт ~2 с на кадр (кэш по кадру), во время анимации не считается.
Codex — независимый исследователь Хоррориуса. По просьбе «публикуй в исследовании от себя» и «объясни логику» я дописал в раздел 19 последовательное объяснение своего поиска: неизменные исходные биты, перебор осей, парные сравнения от оси наружу, общая ширина соседних сечений, несовпадения за границами, отбор узорных областей и независимая проверка. Показал область №383: 130×54 = 7020 совпадающих клеток и три конкретные внешние пары 0/1. Уточнил, что области могут перекрываться, а нарушение за границей относится к продолжению той же области и оси. Моя логика поиска.
Codex — независимый исследователь Хоррориуса. По просьбе исследовать уменьшенный вид я использовал пять PNG пользователя напрямую: серый=0, белый=1, интерфейс исключён маской. Исходные файлы сохранены без изменений; отдельно доступны массивы битов. Я показал 54 области приблизительного отражения по объявленной модели Gaussian Blur 2 px, корреляция каждого сечения ≥0,85, нарушение за границами; все пересчитаны независимой проверкой. Точный режим 0/1 оставлен отдельно и использует другие ограничения. По вопросу «что общего» измерил общую вертикальную зеркальность первых трёх общих снимков — 100%, четвёртого — 99,93%; на первом пары 2–3, 4–5, 6–7, 8–9 совпадают побитно после отражения. Внутренняя симметрия каждой части при этом может быть приблизительной. Это не доказательство, что все части — один узор, и не проверенная модель человеческого восприятия. В разделе 20 подписал метод, ограничения и объяснение масштабной выборки; в просмотре переключаются пять снимков, строгая проверка и рамки. Общие свойства · Просмотр.
git pull) или руками, и между двумя
правками файл мог уехать вперёд с другой машины.archive\. Архив
хранит версию ПОСЛЕ правки.fold.html в трёх местах, и пять подписей
?v=NNNN у тегов скриптов — без них браузер отдаст скрипты из кэша.<title>,
подпись в углу. Сами файлы с v0.008 лежат в Binary-Drum-Machine\oktaedr\ — туда же
переехали и три SVG знака; архив остался в корневом: archive\Zerkalius-oktaedr\ и
archive\Zerkalius-dnevnik\. Архив один и он в корне — это правило папку не меняет.По уточнениям пользователя: шарики остаются видимыми в площади нужного бита, вращаются с ним и сохраняются после переноса строки в поле. Повторные попадания распределяются внутри бита; после 64 видимых точек показывается также полный счёт ×N. У верхнего конца вертикальной оси — текст текущего запуска: время, вылеты, выходы, движения и ожидания; у каждого кольца — входы, переходы, застрявшие, новые единицы, развороты и обороты сокращёнными дробями. Новый запуск начинает новый счёт, сброс шариков, ⟲ и ⌖✕ стирают весь счёт и застрявшие точки.
Раскладка для ссылок обновлена из экспорта 23:38: новая сцепка «За чертой» с ☀/☾ и ряд «Кручения». «Вид» и «Лазер» закреплены за верхней полосой; автоматическое раздвигание групп их не двигает. Все рабочие ссылки — Solo с bg=0 (кнопки и поле строк доступны); первое и второе кольца начинают по осям холста. Начальное состояние страницы не менялось.
Журнал дописывается вручную при каждой правке — одной записью со ссылкой на причину.
Строка Zerkalius-oktaedr.html и Zerkalius-dnevnik.html в CLAUDE.md пока
НЕ добавлена: правка свода правил — отдельное решение, его принимает пользователь.