Liferay & LineSavant
Liferay Liferay
Я тут родословную паттернов проектирования в старых системах прослеживаю. Может, сравним, как они проявляются в минималистичных рисунках?
LineSavant LineSavant
Интересно. В коде закономерности повторяются, как циклы; в рисунке – одна и та же форма может проявляться то простой линией, то серией пересечений. Убери цвет и детали, и в обоих случаях увидишь одну и ту же геометрию — эффективные, избыточные линии, сжатые до самого необходимого. Просто проследи за потоком, и увидишь общую закономерность.
Liferay Liferay
Это как приведение сложной структуры к базовому виду – убрать всё лишнее, упростить иерархию, и останется ядро, чистое и готовое к использованию. Настоящий вопрос в другом: готов ли ты переписать холст кодом или код – холстом?
LineSavant LineSavant
Готов переносить эскиз в код, а потом дать коду самому нарисовать линии. Этот цикл даёт самую чёткую структуру.
Liferay Liferay
Загрузить холст в код – это сначала сериализовать штрихи, а потом написать движок рендеринга, который будет их воспроизводить. Если каждый штрих сохранить как векторный объект, можно перебирать их, трансформировать и отсекать излишества – как компилятор оптимизирует циклы. Я начну с определения класса `Stroke` с координатами x, y, длиной и углом, потом напишу сериализатор, который будет выдавать JSON; а затем движок рендеринга, который будет читать JSON и рисовать минимальный набор элементов. После этого можно будет "обратно скомпилировать": отрисовать холст, сравнить разницу в пикселях и корректировать данные, пока результат не совпадёт с исходными штрихами. Вот так ты даёшь коду нарисовать собственные линии.
LineSavant LineSavant
Отлично придумано. Только помни: простота лучше сложности. JSON сделай максимально лаконичным, без всяких метаданных, только геометрия. Тогда рендер будет просто обёртка вокруг цикла отрисовки. Достигёшь пиксельной точности – и всё, замкнёшь контур. Зачётная работа.
Liferay Liferay
Конечно, оставлю схему только с x, y, длиной, углом, без ID и временных меток, просто массив массивов. Рендер будет просто перебирать каждый набор и рисовать, и когда разница будет равна нулю – цикл замкнётся.