From 1b4115f62e5234466d665fc730aa2da75d1d6730 Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 3 Sep 2026 01:11:54 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D1=8F=D0=B4=D1=80=D0=BE=20(07)=20=D0=A0?= =?UTF-8?q?=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D1=8B=20=D1=82=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hypn0/hypn0_site/services/halftone.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/hypn0/hypn0_site/services/halftone.py b/hypn0/hypn0_site/services/halftone.py index 0d4a1b3..67acd93 100644 --- a/hypn0/hypn0_site/services/halftone.py +++ b/hypn0/hypn0_site/services/halftone.py @@ -117,10 +117,10 @@ def generate_halftone_svg( - seed: сид для детерминированного распределения анимаций TODO ПОЧИНИТЬ-УЛУЧШИТЬ: - - max_radius (радиус точки): сейчас зазор между точками не меняется. Нужно чтобы: - - при d=0 -- зазор 10 - - при d<10 -- зазор 10-d - - при d>10 -- перекрытие d-10 (отрицательный зазор) + ПОЧИНИЛИ ДЛЯ ПРОСТЫХ ФИГУР - max_radius (радиус точки): + - шаг ячейки STEP = 20, базовый радиус R0 = 10 + - при d=0 .. 10 -- зазор между точками + - при d>10 -- перекрытие и наползание точек - angle: сейчас это просто поворот картинки. Нужно чтобы: - нужно чтобы это был поворт картинки (т.е. ряды-столбцы были со смещение-поворотом, как при полиграфии) - blink: что-то страннное. пока не понял @@ -161,9 +161,18 @@ def generate_halftone_svg( img_resized = img.resize((grid_width, grid_height), Image.Resampling.LANCZOS) - step = max_radius * 2 + 2 - width = grid_width * step - height = grid_height * step + # Базовый шаг ячейки сетки (номинальный радиус касания точек R0 = 10, диаметр D0 = 20) + STEP = 20 + + # Расчет запаса/паспарту (margin) по краям холста: + # Учитывает увеличенный радиус точек (при наползании) и масштабирование при пульсации/повороте + scale_val = max(0.5, min(1.5, scale / 1000.0)) + max_effective_radius = max_radius * max(1.0, scale_val) + max_visual_extent = math.ceil(max_effective_radius * 1.42) + 2 + margin = max(4, max_visual_extent - STEP // 2 + 2) + + width = grid_width * STEP + 2 * margin + height = grid_height * STEP + 2 * margin # 2. Формирование классов анимации animation_classes = [] @@ -195,8 +204,8 @@ def generate_halftone_svg( if radius == 0: continue - cx = x * step + step // 2 - cy = y * step + step // 2 + cx = margin + x * STEP + STEP // 2 + cy = margin + y * STEP + STEP // 2 anim_class = rng.randint(0, animation_variants - 1) encoded_class = encode_to_base36(anim_class)