123 lines
4.5 KiB
Python
123 lines
4.5 KiB
Python
import math
|
|
import numpy as np
|
|
from PIL import Image, ImageDraw, ImageFilter
|
|
|
|
SIZE = 1024
|
|
CENTER = SIZE / 2.0
|
|
|
|
bg = Image.new('RGBA', (SIZE, SIZE), (2, 4, 12, 255))
|
|
bdraw = ImageDraw.Draw(bg)
|
|
|
|
np.random.seed(777)
|
|
for _ in range(400):
|
|
x = np.random.randint(0, SIZE)
|
|
y = np.random.randint(0, SIZE)
|
|
br = np.random.randint(150, 255)
|
|
sz = np.random.choice([1, 1, 2, 2, 3], p=[0.7, 0.2, 0.07, 0.02, 0.01])
|
|
bdraw.ellipse([x, y, x + sz, y + sz], fill=(br, br, 255, br))
|
|
|
|
N_POINTS = 13
|
|
R_TIP = SIZE * 0.46
|
|
R_VALLEY = SIZE * 0.28
|
|
R_MEDALLION = SIZE * 0.255
|
|
R_CORE = SIZE * 0.09
|
|
|
|
start_angle = -math.pi / 2.0
|
|
|
|
tips = []
|
|
valleys = []
|
|
for i in range(N_POINTS):
|
|
ang_tip = start_angle + i * (2.0 * math.pi / N_POINTS)
|
|
ang_val = ang_tip + (math.pi / N_POINTS)
|
|
tips.append((CENTER + R_TIP * math.cos(ang_tip), CENTER + R_TIP * math.sin(ang_tip)))
|
|
valleys.append((CENTER + R_VALLEY * math.cos(ang_val), CENTER + R_VALLEY * math.sin(ang_val)))
|
|
|
|
star_layer = Image.new('RGBA', (SIZE, SIZE), (0, 0, 0, 0))
|
|
sdraw = ImageDraw.Draw(star_layer)
|
|
|
|
GOLD_CORE = (255, 255, 240, 255) # incandescent white-gold
|
|
GOLD_MAIN = (255, 215, 80, 240) # warm celestial amber-gold
|
|
GOLD_GLOW = (220, 160, 20, 90)
|
|
|
|
# Fill rays with deep translucent astral gradient
|
|
for i in range(N_POINTS):
|
|
p_tip = tips[i]
|
|
p_vl = valleys[(i - 1) % N_POINTS]
|
|
p_vr = valleys[i]
|
|
sdraw.polygon([CENTER, CENTER, p_vl[0], p_vl[1], p_tip[0], p_tip[1]], fill=(35, 28, 12, 120))
|
|
sdraw.polygon([CENTER, CENTER, p_tip[0], p_tip[1], p_vr[0], p_vr[1]], fill=(50, 38, 16, 150))
|
|
|
|
# Sacred tridecagram linear lattice (subtle geometric star web inside)
|
|
for i in range(N_POINTS):
|
|
p1 = tips[i]
|
|
p2 = tips[(i + 3) % N_POINTS]
|
|
sdraw.line([p1[0], p1[1], p2[0], p2[1]], fill=(255, 210, 70, 40), width=1)
|
|
|
|
# Fine outer outlines of the 13 rays
|
|
for i in range(N_POINTS):
|
|
p_tip = tips[i]
|
|
p_vl = valleys[(i - 1) % N_POINTS]
|
|
p_vr = valleys[i]
|
|
|
|
# Glow outline
|
|
sdraw.line([p_vl[0], p_vl[1], p_tip[0], p_tip[1]], fill=GOLD_GLOW, width=5)
|
|
sdraw.line([p_tip[0], p_tip[1], p_vr[0], p_vr[1]], fill=GOLD_GLOW, width=5)
|
|
sdraw.line([CENTER, CENTER, p_tip[0], p_tip[1]], fill=GOLD_GLOW, width=5)
|
|
|
|
# Sharp gold line
|
|
sdraw.line([p_vl[0], p_vl[1], p_tip[0], p_tip[1]], fill=GOLD_MAIN, width=2)
|
|
sdraw.line([p_tip[0], p_tip[1], p_vr[0], p_vr[1]], fill=GOLD_MAIN, width=2)
|
|
sdraw.line([CENTER, CENTER, p_tip[0], p_tip[1]], fill=GOLD_CORE, width=2)
|
|
|
|
# Medallion
|
|
med_layer = Image.new('RGBA', (SIZE, SIZE), (0, 0, 0, 0))
|
|
mdraw = ImageDraw.Draw(med_layer)
|
|
|
|
mdraw.ellipse([CENTER - R_MEDALLION, CENTER - R_MEDALLION, CENTER + R_MEDALLION, CENTER + R_MEDALLION], fill=(6, 8, 18, 250), outline=GOLD_MAIN, width=3)
|
|
mdraw.ellipse([CENTER - R_MEDALLION + 6, CENTER - R_MEDALLION + 6, CENTER + R_MEDALLION - 6, CENTER + R_MEDALLION - 6], outline=(255, 240, 160, 160), width=1)
|
|
|
|
# Chrome Triskelion - 3 curved wings (number 9 loops sharing 1 central circle)
|
|
# Center circle:
|
|
mdraw.ellipse([CENTER - R_CORE, CENTER - R_CORE, CENTER + R_CORE, CENTER + R_CORE], fill=(3, 5, 14, 255), outline=GOLD_MAIN, width=4)
|
|
mdraw.ellipse([CENTER - R_CORE + 4, CENTER - R_CORE + 4, CENTER + R_CORE - 4, CENTER + R_CORE - 4], outline=GOLD_CORE, width=1)
|
|
|
|
# Chrome pinwheel curved ribbon blades
|
|
for k in range(3):
|
|
rot = start_angle + k * (2.0 * math.pi / 3.0)
|
|
outer_pts = []
|
|
inner_pts = []
|
|
steps = 50
|
|
for s in range(steps + 1):
|
|
t = s / float(steps)
|
|
cr = R_CORE + t * (R_MEDALLION - R_CORE - 10)
|
|
ca = rot + t * 1.35
|
|
|
|
bx = CENTER + cr * math.cos(ca)
|
|
by = CENTER + cr * math.sin(ca)
|
|
outer_pts.append((bx, by))
|
|
|
|
thick = (1.0 - t * 0.8) * 16
|
|
ir = max(R_CORE, cr - thick)
|
|
ix = CENTER + ir * math.cos(ca + 0.08)
|
|
iy = CENTER + ir * math.sin(ca + 0.08)
|
|
inner_pts.append((ix, iy))
|
|
|
|
poly = outer_pts + inner_pts[::-1]
|
|
mdraw.polygon(poly, fill=(180, 130, 20, 120))
|
|
|
|
# Sharp gold boundary
|
|
for p in range(len(outer_pts) - 1):
|
|
mdraw.line([outer_pts[p], outer_pts[p+1]], fill=GOLD_CORE, width=2)
|
|
for p in range(len(inner_pts) - 1):
|
|
mdraw.line([inner_pts[p], inner_pts[p+1]], fill=GOLD_MAIN, width=1)
|
|
|
|
comp = Image.alpha_composite(bg, star_layer)
|
|
comp = Image.alpha_composite(comp, med_layer)
|
|
|
|
bloom = comp.filter(ImageFilter.GaussianBlur(8))
|
|
final_img = Image.blend(comp, bloom, 0.22)
|
|
|
|
out_file = '/home/alexives/.gemini/antigravity-ide/brain/4ff924d9-3d7f-4202-9066-3ac5c3088b8e/star_exact_13_gold_filigree_ribbons.png'
|
|
final_img.save(out_file, 'PNG')
|
|
print("Rendered ribbons variant to", out_file)
|