算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
create-glyph【设计与创意】Crear pictogramas (glyphs) basados en R para iconos de habilidades, agentes o equipos en la capa de visualizacion. Cubre el boceto del concepto, la composicion de capas con ggplot2 usando la biblioteca de primitivas, la estrategia de color, el registro en el archivo de mapeo de glyphs y manifiesto correspondiente, el renderizado mediante el pipeline …
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Crear pictogramas (glyphs) basados en R para iconos de habilidades, agentes o equipos en la capa de visualizacion viz/. Cada glyph es una funcion pura de ggplot2 que dibuja una forma reconocible en un lienzo de 100x100, renderizada con un efecto de resplandor neon sobre fondo transparente en formato WebP.
skill, agent o teamcreate-glyph, mystic, r-package-review) y dominio (para habilidades)--glow-sigma (predeterminado: 4)Identificar la entidad a iconificar y elegir una metafora visual.
skills/<id>/SKILL.mdagents/<id>.mdteams/<id>.mdComplexity Tiers:
+----------+--------+-------------------------------------------+
| Tier | Layers | Examples |
+----------+--------+-------------------------------------------+
| Simple | 2 | glyph_flame, glyph_heartbeat |
| Moderate | 3-5 | glyph_document, glyph_experiment_flask |
| Complex | 6+ | glyph_ship_wheel, glyph_bridge_cpp |
+----------+--------+-------------------------------------------+
glyph_<nombre_descriptivo> (snake_case, unico)Esperado: Un boceto mental claro de la forma con 2-6 capas planificadas.
En caso de fallo: Si el concepto es demasiado abstracto, recurrir a un objeto concreto relacionado. Revisar glyphs existentes del mismo dominio para inspiracion.
Escribir la funcion R que produce capas de ggplot2.
Firma de la funcion (contrato inmutable):
glyph_<name> <- function(cx, cy, s, col, bright) {
# cx, cy = center coordinates (50, 50 on 100x100 canvas)
# s = scale factor (1.0 = fill ~70% of canvas)
# col = domain color hex (e.g., "#ff88dd" for design)
# bright = brightened variant of col (auto-computed by renderer)
# Returns: list() of ggplot2 layers
}
Aplicar el factor de escala * s a TODAS las dimensiones para un escalado consistente:
r <- 20 * s # radius
hw <- 15 * s # half-width
lw <- .lw(s) # line width (default base 2.5)
lw_thin <- .lw(s, 1.2) # thinner line width
Construir la geometria usando las primitivas disponibles:
| Geometria | Uso |
|---|---|
ggplot2::geom_polygon(data, .aes(x, y), ...) | Formas rellenas |
ggplot2::geom_path(data, .aes(x, y), ...) | Lineas/curvas abiertas |
ggplot2::geom_segment(data, .aes(x, xend, y, yend), ...) | Segmentos de linea, flechas |
ggplot2::geom_rect(data, .aes(xmin, xmax, ymin, ymax), ...) | Rectangulos |
ggforce::geom_circle(data, .aes(x0, y0, r), ...) | Circulos |
Aplicar la estrategia de color:
Alpha Guide:
+----------------------+------------+--------------------------+
| Purpose | Alpha | Example |
+----------------------+------------+--------------------------+
| Large fill (body) | 0.08-0.15 | hex_with_alpha(col, 0.1) |
| Medium fill (accent) | 0.15-0.25 | hex_with_alpha(col, 0.2) |
| Small fill (detail) | 0.25-0.35 | hex_with_alpha(bright, 0.3) |
| Outline stroke | 1.0 | color = bright |
| Secondary stroke | 1.0 | color = col |
| No fill | --- | fill = NA |
+----------------------+------------+--------------------------+
Devolver una list() plana de capas (el renderizador itera y envuelve cada una con resplandor)
Colocar la funcion en el archivo de primitivas correspondiente segun el tipo de entidad:
primitives.R — bushcraft, compliance, containerization, data-serialization, defensiveprimitives_2.R — devops, general, git, mcp-integrationprimitives_3.R — mlops, observability, PM, r-packages, reporting, review, web-dev, esoteric, designprimitives_4.R hasta primitives_19.R para dominios mas recientesviz/R/agent_primitives.Rviz/R/team_primitives.REsperado: Una funcion R funcional que devuelve una lista de 2-6 capas de ggplot2.
En caso de fallo: Si ggforce::geom_circle causa errores, asegurarse de que ggforce esta instalado. Si las coordenadas estan mal, recordar que el lienzo es de 100x100 con (0,0) en la esquina inferior izquierda. Probar la funcion interactivamente:
source("viz/R/utils.R"); source("viz/R/primitives.R") # etc.
layers <- glyph_<name>(50, 50, 1.0, "#ff88dd", "#ffa8f0")
p <- ggplot2::ggplot() + ggplot2::coord_fixed(xlim=c(0,100), ylim=c(0,100)) +
ggplot2::theme_void()
for (l in layers) p <- p + l
print(p)
Agregar el mapeo entidad-glyph en el archivo de mapeo correspondiente.
Para habilidades:
viz/R/glyphs.R# -- design (3))"skill-id" = "glyph_function_name",
Para agentes:
viz/R/agent_glyphs.RAGENT_GLYPHS"agent-id" = "glyph_function_name",
Para equipos:
Abrir viz/R/team_glyphs.R
Encontrar la posicion alfabetica en TEAM_GLYPHS
Agregar la entrada:
"team-id" = "glyph_function_name",
Verificar que no exista un ID duplicado en la lista objetivo
Esperado: La lista *_GLYPHS correspondiente contiene el nuevo mapeo.
En caso de fallo: Si la construccion reporta "No glyph mapped", verificar que el ID de la entidad coincide exactamente con el del manifiesto y el registro.
Registrar el icono en el archivo de manifiesto correspondiente.
Para habilidades: viz/data/icon-manifest.json
{
"skillId": "skill-id",
"domain": "domain-name",
"prompt": "<domain basePrompt>, <descriptors>, dark background, vector art",
"seed": <next_seed>,
"path": "public/icons/cyberpunk/<domain>/<skill-id>.webp",
"status": "pending"
}
Para agentes: viz/data/agent-icon-manifest.json
{
"agentId": "agent-id",
"prompt": "<agent-specific descriptors>, dark background, vector art",
"seed": <next_seed>,
"path": "public/icons/cyberpunk/agents/<agent-id>.webp",
"status": "pending"
}
Para equipos: viz/data/team-icon-manifest.json
{
"teamId": "team-id",
"prompt": "<team-specific descriptors>, dark background, vector art",
"seed": <next_seed>,
"path": "public/icons/cyberpunk/teams/<team-id>.webp",
"status": "pending"
}
Esperado: JSON valido con la nueva entrada colocada entre sus entidades del mismo tipo.
En caso de fallo: Validar la sintaxis JSON. Errores comunes: coma final despues del ultimo elemento del arreglo, comillas faltantes.
Ejecutar el pipeline de iconos para renderizar el nuevo glifo. Usar siempre build.sh como punto de entrada — se encarga de la deteccion de plataforma y de la seleccion del binario de R. Ver render-icon-pipeline para la referencia completa de opciones y la arquitectura del pipeline.
# From project root — renders all palettes, standard + HD, skips existing icons
bash viz/build.sh --only <domain> --skip-existing # skills
bash viz/build.sh --type agent --only <id> --skip-existing # agents
bash viz/build.sh --type team --only <id> --skip-existing # teams
# Dry run first:
bash viz/build.sh --only <domain> --dry-run
build.sh ejecuta el pipeline completo (paleta → datos → manifiesto → renderizado → glifos de terminal). Los pasos que no son de renderizado agregan unos 10 segundos, pero garantizan que todos los datos esten actualizados.
Ubicaciones de salida:
viz/public/icons/<palette>/<domain>/<skill-id>.webpviz/public/icons/<palette>/agents/<agent-id>.webpviz/public/icons/<palette>/teams/<team-id>.webpEsperado: El registro muestra OK: <entity> (seed=XXXXX, XX.XKB) y el archivo WebP existe.
En caso de fallo:
"No glyph mapped" — Falta el mapeo del Paso 3 o tiene un error tipografico"Unknown domain" — El dominio no esta en get_palette_colors() en palettes.Rinstall.packages(c("ggplot2", "ggforce", "ggfx", "ragg", "magick")) primeroComprobar que la salida renderizada cumple los estandares de calidad.
Verificar que el archivo existe y tiene un tamano razonable:
ls -la viz/public/icons/cyberpunk/<type-path>/<entity-id>.webp
# Expected: 15-80 KB typical range
Abrir el WebP en un visor de imagenes para comprobar:
Comprobar a tamanos pequenos (el icono se renderiza a ~40-160px en el grafo de fuerzas):
Esperado: Un pictograma claro y reconocible con resplandor neon uniforme sobre fondo transparente.
En caso de fallo:
--glow-sigma 2 (el predeterminado es 4)--glow-sigma 8.lw(s, base))Realizar ajustes y re-renderizar.
Ajustes comunes:
.lw(s, base) — probar base = 3.0 o 3.5s (p. ej., 20 * s -> 24 * s)Para re-renderizar despues de cambios:
# Delete the existing icon first, then re-render
rm viz/public/icons/cyberpunk/<type-path>/<entity-id>.webp
# Use the appropriate build command from Step 5
Cuando se este satisfecho, verificar que el estado del manifiesto muestra "done" (el script de construccion lo actualiza automaticamente al completarse con exito)
Esperado: El icono final pasa todas las verificaciones del Paso 6.
En caso de fallo: Si despues de 3+ iteraciones el glyph aun no se lee bien, considerar usar una metafora visual completamente diferente (volver al Paso 1).
Los colores de dominio (para habilidades) estan definidos en viz/R/palettes.R (la unica fuente de verdad). Los colores de agentes y equipos tambien se gestionan en palettes.R. La paleta cyberpunk (colores neon ajustados manualmente) esta en get_cyberpunk_colors(). Las paletas de la familia viridis se generan automaticamente via viridisLite.
Para buscar un color:
source("viz/R/palettes.R")
get_palette_colors("cyberpunk")$domains[["design"]] # skill domain
get_palette_colors("cyberpunk")$agents[["mystic"]] # agent
get_palette_colors("cyberpunk")$teams[["tending"]] # team
Al agregar un nuevo dominio, agregarlo en tres lugares de palettes.R:
PALETTE_DOMAIN_ORDER (alfabeticamente)get_cyberpunk_colors()bash viz/build.sh para regenerar paletas, datos y manifiestosConsultar el catalogo completo de funciones de glyph disponibles en los archivos fuente de primitivas:
viz/R/primitives.R hasta viz/R/primitives_19.R (agrupados por dominio)viz/R/agent_primitives.Rviz/R/team_primitives.R| Funcion | Firma | Proposito |
|---|---|---|
.lw(s, base) | (scale, base=2.5) | Ancho de linea consciente de la escala |
.aes(...) | alias de ggplot2::aes | Atajo para mapeo estetico |
hex_with_alpha(hex, alpha) | (string, 0-1) | Agregar alfa a color hexadecimal |
brighten_hex(hex, factor) | (string, factor=1.3) | Aclarar un color hexadecimal |
dim_hex(hex, factor) | (string, factor=0.4) | Oscurecer un color hexadecimal |
glyph_<name>(cx, cy, s, col, bright) -> list()* scol para rellenos, bright para contornos, hex_with_alpha() para transparencia*_glyphs.R correspondiente"status": "pending""done" despues del renderizado exitoso* s: Los valores de pixeles codificados directamente se rompen cuando la escala cambia. Siempre multiplicar por s.y mas altos mueven ARRIBA.ggfx::with_outer_glow() a cada capa. NO agregar resplandor dentro de la funcion del glyph.get_cyberpunk_colors() en palettes.R, el renderizado fallara. Agregar el color primero y luego regenerar.primitives*.R agrupados por dominio, los agentes en agent_primitives.R, los equipos en team_primitives.R.