colorines.c
Código
El 15 de abril del 2019 vi un cuarto de baño de un restaurante cuya pared estaba adornada con un mosaico de cuadrados de diferentes tonalidades de azul.
Me gustó la idea de generar mosaicos (tablas) de rectángulos de tonalidad de algún color o incluso, su representación en clave de códigos #rrggbb (RGB).
Me planteo realizar un programa que los genere utilizando algún lenguaje de programación de los que manejo más o menos mal: C o JavaScript. Por supuesto, si pienso que el resultado podría ser una página web, el más lógico de los lenguajes sería JavaScript, así que inmediatamente me decanto por realizarlo en C.
/********************************************************
Proyecto colorines (escrito en C)
realizado por Giusseppe Domínguez
a partir del día 26 de abril de 2019
********************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define KO 0
int tablas(FILE *fichero, int formato);
int colorines(FILE *fichero, int formato, int quecolor, int color1, int color2);
int firma(FILE *fichero);
int main(int argc, char *argv[])
{
int i, formato=0;
char *loquesea, *extension[] = { "txt", "html" }, nombrefichero[27];
FILE *fichero;
if (argc != 2)
{
printf("\n\nUtilización: %s [1 para html | 0 para txt]\n\n", argv[0]);
return KO;
}
formato = strtol(argv[1], &loquesea, 10);
// Verificamos que lo introducido es un número natural
if ((loquesea == argv[1]) || (*loquesea != '\0') || (formato < 0) || (formato > 1)) {
printf ("|%s| No es un argumento válido\n", argv[1]); return KO;
}
// Creamos 81 Tablas en el formato especificado en distintos archivos
for (i=1; i<=81; i++) {
sprintf(nombrefichero, "%s/tabla%02d.%s", extension[formato], i, extension[formato]);
printf("\nNombrefichero= |%s|", nombrefichero);
fichero = fopen(nombrefichero, "a");
if (fichero==NULL) { printf("Error abriendo el fichero %s", nombrefichero); return KO;}
// Creamos las tablas en el fichero
sleep(1);
tablas(fichero, formato);
fclose(fichero);
}
}
/******************************************
La función tablas genera un par de tablas
en el formato indicado [1 para html | 0 para txt]
de un color elegido aleatoriamente entre
0 - rojo, 1 - verde, 2 - azul
fijando también aleatoriamente la base (RGB)
de los otros dos colores color1, color2
entre 0 y 200 en formato exadecimal para
excluir los colores muy saturados.
******************************************/
int tablas(FILE *fichero, int formato)
{
char *colores[]= {"rojo", "verde", "azul"};
int color1, color2, quecolor;
/* Aleatoriamente elegidos los dos otros colores */
srand(time(NULL));
color1 = rand() % 200;
color2 = rand() % 200;
quecolor = rand() % 3;
if (formato == 1) fprintf(fichero, "<h2>");
fprintf(fichero, "256 Tonos de %s\n", colores[quecolor]);
if (formato == 1) fprintf(fichero, "</h2>");
switch (quecolor) {
case 0: fprintf(fichero, "Sobre una base de %s=%02X y %s=%02X\n", colores[1], color1, colores[2], color2); break; // rojo
case 1: fprintf(fichero, "Sobre una base de %s=%02X y %s=%02X\n", colores[0], color1, colores[2], color2); break; // verde
case 2: fprintf(fichero, "Sobre una base de %s=%02X y %s=%02X\n", colores[0], color1, colores[1], color2); break; // azul
default: fprintf(fichero, "colorines necesita código 0=rojo, 1=verde, 2=azul\n"); return KO;
}
colorines(fichero, formato, quecolor, color1, color2);
firma(fichero);
if (formato == 1) fprintf(fichero, "<h2>");
fprintf(fichero, "256 Tonos Básicos de %s\n", colores[quecolor]);
if (formato == 1) fprintf(fichero, "</h2>");
colorines(fichero, formato, quecolor, 0, 0);
firma(fichero);
return OK;
}
/******************************************
La función colorines devuelve una "tabla"
de 16x16 colores en función del parámetro
quecolores: verde, rojo, azul
color1 y color2, de 0 a 255
******************************************/
int colorines(FILE *fichero, int formato, int quecolor, int color1, int color2)
{
char *colores[]= {"rojo", "verde", "azul"};
int c1, c2, color[3], orden[3];
char cad_color[6];
color[1]=color1;
color[2]=color2;
/* rojo orden=0,1,2 verde orden=1,0,2 azul orden=1,2,0 */
switch (quecolor) {
case 0: orden[0]=0; orden[1]=1; orden[2]=2; break; // rojo
case 1: orden[0]=1; orden[1]=0; orden[2]=2; break; // verde
case 2: orden[0]=1; orden[1]=2; orden[2]=0; break; // azul
default: printf("colorines necesita código 0=rojo, 1=verde, 2=azul\n"); return KO;
}
if (formato == 1) fprintf(fichero, "<table width=100%%>");
for (c1=0; c1<16; c1++) { /* para las 16 filas ... */
if (formato == 1) fprintf(fichero, "<tr>");
for (c2=0; c2<16; c2++) { /* para las 16 columnas ... */
color[0] = c1*16+c2;
/* rojo orden=0,1,2 verde orden=1,0,2 azul orden=1,2,0 */
sprintf(cad_color, "%02X%02X%02X", color[orden[0]], color[orden[1]], color[orden[2]]);
if (formato == 1) fprintf(fichero, "<td bgcolor=#%s width=6,25%%>%s</td>", cad_color, cad_color);
else fprintf(fichero, "%s ", cad_color);
} /* fin de las 16 columnas */
if (formato == 1) fprintf(fichero, "</tr>");
fprintf(fichero, "\n");
} /* fin de las 16 filas */
if (formato == 1) fprintf(fichero, "</table>");
return OK;
}
int firma(FILE *fichero)
{
time_t tiempo = time(0);
struct tm *tiempolocal = localtime(&tiempo);
char txt_firma[128];
strftime(txt_firma,128,"\nGiusseppe Domínguez, a las %H:%M. M-%Y%m%d\n",tiempolocal);
fprintf(fichero, "%s\n",txt_firma);
return OK;
}