Ejes: símbolo feminista en Igualdad y bala rota en Pueblos libres

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
hacklab 2026-10-14 21:30:25 +02:00
parent 879764b6a9
commit 3509b6dd38
16 changed files with 59 additions and 44 deletions

View file

@ -103,29 +103,44 @@ def fronteras(o, col):
linea(o, [(x + 4, y - 4), (x - 4, y + 4)], col, 4)
def igualdad(o, col):
# El signo igual, en dos barras de spray con chorreones.
relleno(o, [(14, 50), (126, 46), (126, 76), (14, 80)], col)
relleno(o, [(14, 100), (126, 96), (126, 126), (14, 130)], col)
for x, y, l in ((30, 79, 14), (100, 75, 10), (46, 129, 22), (112, 126, 14)):
# El símbolo feminista: anillo en zigzag y la cruz de debajo, con chorreones.
cx, cy, r, pts = 70, 58, 40, []
for i in range(180):
a = 2 * math.pi * i / 179
rr = r - (0 if i % 2 else 11) + random.uniform(-1.5, 1.5)
pts.append((cx + rr * math.cos(a), cy + rr * math.sin(a)))
o.append(f'<path d="M{" L".join(f"{x:.1f},{y:.1f}" for x, y in pts)}" fill="none" stroke="{col}" stroke-width="3.2" stroke-linejoin="round" filter="url(#spray)"/>')
relleno(o, [(63, 96), (77, 96), (77, 160), (63, 160)], col)
relleno(o, [(46, 120), (94, 120), (94, 134), (46, 134)], col)
for x, y, l in ((52, 134, 12), (88, 134, 18), (66, 160, 10), (74, 160, 6)):
chorreon(o, x, y, l, col)
def eslabon(o, cx, cy, ang, col, roto=False):
# Un eslabón: óvalo a pulso; el roto se abre por un extremo.
ca, sa, pts = math.cos(ang), math.sin(ang), []
for k in range(29 if roto else 37):
t = 2 * math.pi * (k / 36 + (.12 if roto else 0))
x, y = 19 * math.cos(t), 11 * math.sin(t)
pts.append((cx + x * ca - y * sa, cy + x * sa + y * ca))
linea(o, pts, col, 7)
def girar(pts, ang, ox, oy, dx, dy):
ca, sa = math.cos(ang), math.sin(ang)
return [(ox + (x - ox) * ca - (y - oy) * sa + dx, oy + (x - ox) * sa + (y - oy) * ca + dy) for x, y in pts]
def pueblos(o, col):
# Una cadena rota: dos tramos enlazados que se abren en el centro, con chispas en el corte.
eslabon(o, 20, 118, -.3, col)
eslabon(o, 48, 108, -.3, col, roto=True)
eslabon(o, 92, 108, .3 + math.pi, col, roto=True)
eslabon(o, 120, 118, .3, col)
for a in (-2.5, -2.0, -1.57, -1.14, -.64):
linea(o, [(70 + 16 * math.cos(a), 96 + 16 * math.sin(a)), (70 + 36 * math.cos(a), 96 + 36 * math.sin(a))], col, 5)
# Una bala rota: la punta salta hacia un lado y el casquillo se queda, con chispas en el corte.
punta = [(70, 30), (76, 35), (81, 43), (84, 52), (85, 62), (85, 80), (78, 77), (72, 82), (64, 76), (55, 79), (55, 62), (56, 52), (59, 43), (64, 35)]
grieta_a = [(85, 80), (78, 77), (72, 82), (64, 76), (55, 79)]
casquillo = [(55, 90), (63, 86), (70, 92), (77, 86), (85, 90), (85, 128), (55, 128)]
grieta_b = [(55, 90), (63, 86), (70, 92), (77, 86), (85, 90)]
culote = [(52, 132), (88, 132), (88, 150), (52, 150)]
giro_a = lambda pts: girar(pts, -.38, 70, 80, -4, 6)
giro_b = lambda pts: girar(pts, .08, 70, 120, 6, 8)
relleno(o, giro_a(punta), col)
linea(o, giro_a(punta[10:] + punta[:6]), col, 3)
linea(o, giro_a(grieta_a), col, 3.5)
relleno(o, giro_b(casquillo), col)
relleno(o, giro_b(culote), col)
linea(o, giro_b([(55, 90), (55, 128), (52, 132), (52, 150), (88, 150), (88, 132), (85, 128), (85, 90)]), col, 3)
linea(o, giro_b(grieta_b), col, 3.5)
for a in (-.5, 0, .45):
linea(o, [(96 + 6 * math.cos(a), 92 + 6 * math.sin(a)), (96 + 20 * math.cos(a), 92 + 20 * math.sin(a))], col, 4)
for a in (2.7, 3.2):
linea(o, [(46 + 6 * math.cos(a), 96 + 6 * math.sin(a)), (46 + 18 * math.cos(a), 96 + 18 * math.sin(a))], col, 4)
for x, l in ((60, 12), (74, 18), (84, 8)):
chorreon(o, x, 160, l, col)
os.makedirs(OUT, exist_ok=True)
for n, (nombre, col) in enumerate(EJES.items()):