feat: complete academic symbol lexicon heal, 2-column Cooper extraction, and updated assets
This commit is contained in:
@@ -0,0 +1,244 @@
|
||||
import math
|
||||
import numpy as np
|
||||
from PIL import Image, ImageDraw, ImageFilter
|
||||
|
||||
HI_SIZE = 4096
|
||||
OUT_SIZE = 1024
|
||||
CENTER = HI_SIZE / 2.0
|
||||
|
||||
# 1. ГЛУБОКИЙ КИНЕМАТОГРАФИЧЕСКИЙ КОСМОС
|
||||
bg = Image.new('RGBA', (HI_SIZE, HI_SIZE), (2, 3, 10, 255))
|
||||
|
||||
# Плавная галактическая спираль и звездная пыль
|
||||
dust = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
ddraw = ImageDraw.Draw(dust)
|
||||
|
||||
for i in range(24):
|
||||
a = -0.6 + (i / 24.0) * 1.2
|
||||
r_dist = (i - 12) * 140
|
||||
cx = CENTER + r_dist * math.cos(a + math.pi/2)
|
||||
cy = CENTER + r_dist * math.sin(a + math.pi/2)
|
||||
rw = 2300 - abs(i - 12) * 120
|
||||
rh = 850 - abs(i - 12) * 45
|
||||
col = (45, 20, 75, 40) if i % 2 == 0 else (15, 55, 95, 45)
|
||||
ddraw.ellipse([cx - rw, cy - rh, cx + rw, cy + rh], fill=col)
|
||||
|
||||
dust = dust.filter(ImageFilter.GaussianBlur(340))
|
||||
bg = Image.alpha_composite(bg, dust)
|
||||
|
||||
# Золотой аккреционный вихрь вокруг сингулярности
|
||||
vortex = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
vdraw = ImageDraw.Draw(vortex)
|
||||
vdraw.ellipse([CENTER - 1650, CENTER - 1050, CENTER + 1650, CENTER + 1050], fill=(220, 115, 20, 35))
|
||||
vdraw.ellipse([CENTER - 1200, CENTER - 1200, CENTER + 1200, CENTER + 1200], fill=(255, 160, 35, 45))
|
||||
vdraw.ellipse([CENTER - 800, CENTER - 800, CENTER + 800, CENTER + 800], fill=(255, 210, 80, 50))
|
||||
vortex = vortex.filter(ImageFilter.GaussianBlur(220))
|
||||
bg = Image.alpha_composite(bg, vortex)
|
||||
|
||||
# Россыпь мягких звезд
|
||||
np.random.seed(137)
|
||||
star_layer = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
sdraw = ImageDraw.Draw(star_layer)
|
||||
for _ in range(500):
|
||||
sx = np.random.uniform(40, HI_SIZE - 40)
|
||||
sy = np.random.uniform(40, HI_SIZE - 40)
|
||||
rad = np.random.uniform(2, 8)
|
||||
alpha = np.random.randint(80, 240)
|
||||
tints = [(255, 255, 255), (255, 230, 175), (195, 230, 255)]
|
||||
tint = tints[np.random.randint(len(tints))]
|
||||
sdraw.ellipse([sx - rad, sy - rad, sx + rad, sy + rad], fill=(*tint, alpha))
|
||||
|
||||
star_layer = star_layer.filter(ImageFilter.GaussianBlur(3))
|
||||
bg = Image.alpha_composite(bg, star_layer)
|
||||
|
||||
# 2. РОВНО 13 ЛУЧЕЙ КАК ПЛАВНЫЕ ЭНЕРГЕТИЧЕСКИЕ ЛЕПЕСТКИ СВЕТА (ОРГАНИЧЕСКАЯ САМИКА, НЕ ЧЕРТЕЖ!)
|
||||
petals_glow = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
pg_draw = ImageDraw.Draw(petals_glow)
|
||||
|
||||
petals_body = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
pb_draw = ImageDraw.Draw(petals_body)
|
||||
|
||||
petals_core = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
pc_draw = ImageDraw.Draw(petals_core)
|
||||
|
||||
N_POINTS = 13
|
||||
R_TIP = HI_SIZE * 0.440 # Вершина 13 лучей
|
||||
R_WAIST = HI_SIZE * 0.290 # Талия лепестка
|
||||
R_BASE = HI_SIZE * 0.175 # Основание
|
||||
|
||||
# Вершина строго вертикально вверх
|
||||
angles = [(-math.pi / 2.0) + (2.0 * math.pi * i / N_POINTS) for i in range(N_POINTS)]
|
||||
|
||||
# Строим каждый из 13 лучей как грациозный изогнутый плазменный лепесток
|
||||
for i in range(N_POINTS):
|
||||
a = angles[i]
|
||||
tip = (CENTER + R_TIP * math.cos(a), CENTER + R_TIP * math.sin(a))
|
||||
|
||||
# Боковые крылья лепестка (плавные кривые Безье)
|
||||
half_w_ang = (math.pi / N_POINTS) * 0.65
|
||||
ctrl_left = (CENTER + R_WAIST * math.cos(a - half_w_ang), CENTER + R_WAIST * math.sin(a - half_w_ang))
|
||||
ctrl_right = (CENTER + R_WAIST * math.cos(a + half_w_ang), CENTER + R_WAIST * math.sin(a + half_w_ang))
|
||||
|
||||
base_left = (CENTER + R_BASE * math.cos(a - half_w_ang * 0.7), CENTER + R_BASE * math.sin(a - half_w_ang * 0.7))
|
||||
base_right = (CENTER + R_BASE * math.cos(a + half_w_ang * 0.7), CENTER + R_BASE * math.sin(a + half_w_ang * 0.7))
|
||||
|
||||
# Генерация точек по Безье
|
||||
left_side = []
|
||||
right_side = []
|
||||
for step in range(35):
|
||||
t = step / 34.0
|
||||
# Кривая от основания через талию к острию
|
||||
lx = (1-t)**2 * base_left[0] + 2*(1-t)*t * ctrl_left[0] + t**2 * tip[0]
|
||||
ly = (1-t)**2 * base_left[1] + 2*(1-t)*t * ctrl_left[1] + t**2 * tip[1]
|
||||
left_side.append((lx, ly))
|
||||
|
||||
rx = (1-t)**2 * base_right[0] + 2*(1-t)*t * ctrl_right[0] + t**2 * tip[0]
|
||||
ry = (1-t)**2 * base_right[1] + 2*(1-t)*t * ctrl_right[1] + t**2 * tip[1]
|
||||
right_side.append((rx, ry))
|
||||
|
||||
petal_poly = left_side + right_side[::-1]
|
||||
|
||||
# Полупрозрачное золотистое тело лепестка
|
||||
pg_draw.polygon(petal_poly, fill=(255, 175, 40, 50))
|
||||
pb_draw.polygon(petal_poly, fill=(255, 215, 80, 75))
|
||||
|
||||
# Внутренний сияющий криволинейный контур
|
||||
for p in range(len(left_side) - 1):
|
||||
pb_draw.line([left_side[p], left_side[p+1]], fill=(255, 235, 130, 200), width=10)
|
||||
pc_draw.line([left_side[p], left_side[p+1]], fill=(255, 255, 255, 240), width=4)
|
||||
for p in range(len(right_side) - 1):
|
||||
pb_draw.line([right_side[p], right_side[p+1]], fill=(255, 235, 130, 200), width=10)
|
||||
pc_draw.line([right_side[p], right_side[p+1]], fill=(255, 255, 255, 240), width=4)
|
||||
|
||||
# Центральный луч-нерв каждого лепестка
|
||||
p_in = (CENTER + R_BASE * 0.95 * math.cos(a), CENTER + R_BASE * 0.95 * math.sin(a))
|
||||
pg_draw.line([p_in, tip], fill=(255, 190, 45, 160), width=36)
|
||||
pb_draw.line([p_in, tip], fill=(255, 235, 110, 220), width=14)
|
||||
pc_draw.line([p_in, tip], fill=(255, 255, 255, 255), width=6)
|
||||
|
||||
# Плавные переплетающиеся дуги между 13 лучами (вместо жестких хорд-чертежей)
|
||||
arcs_layer = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
adraw_arc = ImageDraw.Draw(arcs_layer)
|
||||
for i in range(N_POINTS):
|
||||
p1 = (CENTER + R_TIP * math.cos(angles[i]), CENTER + R_TIP * math.sin(angles[i]))
|
||||
p2 = (CENTER + R_TIP * math.cos(angles[(i + 4) % N_POINTS]), CENTER + R_TIP * math.sin(angles[(i + 4) % N_POINTS]))
|
||||
# Дуга, изогнутая к центру
|
||||
mid_a = (angles[i] + angles[(i + 4) % N_POINTS]) / 2.0
|
||||
if abs(angles[(i + 4) % N_POINTS] - angles[i]) > math.pi:
|
||||
mid_a += math.pi
|
||||
ctrl = (CENTER + R_WAIST * 0.95 * math.cos(mid_a), CENTER + R_WAIST * 0.95 * math.sin(mid_a))
|
||||
|
||||
arc_pts = []
|
||||
for step in range(30):
|
||||
t = step / 29.0
|
||||
ax = (1-t)**2 * p1[0] + 2*(1-t)*t * ctrl[0] + t**2 * p2[0]
|
||||
ay = (1-t)**2 * p1[1] + 2*(1-t)*t * ctrl[1] + t**2 * p2[1]
|
||||
arc_pts.append((ax, ay))
|
||||
for p in range(len(arc_pts) - 1):
|
||||
adraw_arc.line([arc_pts[p], arc_pts[p+1]], fill=(140, 220, 255, 120), width=8)
|
||||
pc_draw.line([arc_pts[p], arc_pts[p+1]], fill=(255, 255, 255, 180), width=3)
|
||||
|
||||
# 3. ЦЕНТРАЛЬНЫЙ ТРИСКЕЛИОН ХРОМ-999: ЖИДКИЙ ШЕЛК И ПЛАВНЫЕ СПИРАЛИ
|
||||
trisk_glow = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
tgdraw = ImageDraw.Draw(trisk_glow)
|
||||
|
||||
trisk_body = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
tbdraw = ImageDraw.Draw(trisk_body)
|
||||
|
||||
# Единое центральное кольцо
|
||||
R_RING = HI_SIZE * 0.088
|
||||
tgdraw.ellipse([CENTER - R_RING, CENTER - R_RING, CENTER + R_RING, CENTER + R_RING], outline=(255, 185, 35, 220), width=44)
|
||||
tbdraw.ellipse([CENTER - R_RING, CENTER - R_RING, CENTER + R_RING, CENTER + R_RING], outline=(255, 235, 120, 255), width=22)
|
||||
pc_draw.ellipse([CENTER - R_RING, CENTER - R_RING, CENTER + R_RING, CENTER + R_RING], outline=(255, 255, 255, 255), width=8)
|
||||
|
||||
# 3 плавных хвоста девяток
|
||||
for k in range(3):
|
||||
rot = -math.pi / 2.0 + k * (2.0 * math.pi / 3.0)
|
||||
spine = []
|
||||
widths = []
|
||||
|
||||
# Плавное раскручивание от кольца
|
||||
for step in range(50):
|
||||
t = step / 49.0
|
||||
ang = rot + t * 1.52
|
||||
rad = R_RING + t * (HI_SIZE * 0.165)
|
||||
px = CENTER + rad * math.cos(ang)
|
||||
py = CENTER + rad * math.sin(ang)
|
||||
spine.append((px, py))
|
||||
w = 34.0 * (1.0 - t * 0.65)
|
||||
widths.append(w)
|
||||
|
||||
# Изящная логарифмическая завитушка девяточки
|
||||
tip_pt = spine[-1]
|
||||
tip_ang = rot + 1.52
|
||||
for f in range(40):
|
||||
ft = f / 39.0
|
||||
f_r = 78.0 * (1.0 - ft * 0.82)
|
||||
f_a = tip_ang + ft * math.pi * 1.82
|
||||
fx = tip_pt[0] + f_r * math.cos(f_a) - 78.0 * math.cos(tip_ang)
|
||||
fy = tip_pt[1] + f_r * math.sin(f_a) - 78.0 * math.sin(tip_ang)
|
||||
spine.append((fx, fy))
|
||||
widths.append(max(4.0, 12.0 * (1.0 - ft * 0.72)))
|
||||
|
||||
# Каллиграфическая лента переменной толщины
|
||||
left_edge = []
|
||||
right_edge = []
|
||||
for i in range(len(spine)):
|
||||
p = spine[i]
|
||||
w = widths[i] / 2.0
|
||||
if i == 0:
|
||||
dx = spine[1][0] - p[0]
|
||||
dy = spine[1][1] - p[1]
|
||||
elif i == len(spine) - 1:
|
||||
dx = p[0] - spine[i-1][0]
|
||||
dy = p[1] - spine[i-1][1]
|
||||
else:
|
||||
dx = spine[i+1][0] - spine[i-1][0]
|
||||
dy = spine[i+1][1] - spine[i-1][1]
|
||||
length = math.hypot(dx, dy) + 1e-6
|
||||
nx = -dy / length
|
||||
ny = dx / length
|
||||
left_edge.append((p[0] + nx * w, p[1] + ny * w))
|
||||
right_edge.append((p[0] - nx * w, p[1] - ny * w))
|
||||
|
||||
poly = left_edge + right_edge[::-1]
|
||||
tgdraw.polygon(poly, fill=(255, 175, 30, 200))
|
||||
tbdraw.polygon(poly, fill=(255, 240, 130, 255))
|
||||
|
||||
# Сверхгладкая центральная световая нить
|
||||
for p in range(len(spine) - 1):
|
||||
pc_draw.line([spine[p], spine[p+1]], fill=(255, 255, 255, 255), width=7)
|
||||
|
||||
# Центральное фотонное оптическое ядро (чистый мягкий сферический свет)
|
||||
core = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0))
|
||||
cdraw = ImageDraw.Draw(core)
|
||||
for r_c in range(130, 0, -4):
|
||||
alpha = int(255 * (1.0 - r_c / 130.0)**1.3)
|
||||
cdraw.ellipse([CENTER - r_c, CENTER - r_c, CENTER + r_c, CENTER + r_c], fill=(255, 253, 240, alpha))
|
||||
|
||||
# Нежная горизонтальная световая линия аккреции
|
||||
for dx in range(-650, 650, 2):
|
||||
fade = 1.0 - (abs(dx) / 650.0)**2
|
||||
alpha = int(180 * fade)
|
||||
h_w = int(14 * (1.0 - abs(dx) / 650.0) + 2)
|
||||
cdraw.ellipse([CENTER + dx - 2, CENTER - h_w, CENTER + dx + 2, CENTER + h_w], fill=(185, 242, 255, alpha))
|
||||
|
||||
# 4. СБОРКА И МНОГОУРОВНЕВЫЙ BLUR
|
||||
comp = Image.alpha_composite(bg, petals_glow.filter(ImageFilter.GaussianBlur(50)))
|
||||
comp = Image.alpha_composite(comp, trisk_glow.filter(ImageFilter.GaussianBlur(35)))
|
||||
comp = Image.alpha_composite(comp, arcs_layer.filter(ImageFilter.GaussianBlur(15)))
|
||||
comp = Image.alpha_composite(comp, petals_body)
|
||||
comp = Image.alpha_composite(comp, trisk_body)
|
||||
comp = Image.alpha_composite(comp, pc_draw._image if hasattr(pc_draw, '_image') else petals_core)
|
||||
comp = Image.alpha_composite(comp, core)
|
||||
|
||||
# Финальный оптический bloom
|
||||
bloom = comp.filter(ImageFilter.GaussianBlur(28))
|
||||
comp = Image.blend(comp, bloom, 0.22)
|
||||
|
||||
# 5. СВЕРХКАЧЕСТВЕННЫЙ ДАУНСЕЙМПЛИНГ С 4096 ДО 1024 ЧЕРЕЗ LANCZOS
|
||||
final_1024 = comp.resize((OUT_SIZE, OUT_SIZE), Image.Resampling.LANCZOS)
|
||||
|
||||
out_file = '/home/alexives/.gemini/antigravity-ide/brain/4ff924d9-3d7f-4202-9066-3ac5c3088b8e/star_13_celestial_plasma_flow.png'
|
||||
final_1024.save(out_file, 'PNG')
|
||||
print("Saved celestial plasma flow:", out_file)
|
||||
Reference in New Issue
Block a user