Dibuja el ☣ (Símbolo de riesgo biológico)

66

Dibuje el símbolo de riesgo biológico en un color arbitrario sobre un fondo de colores distintos. Las proporciones específicas se publicaron en la edición del 27 de junio de 1974 del Registro Federal del Gobierno de los Estados Unidos.

Detalles

  • Como salida, se permite escribir en un archivo (se permiten los formatos ráster y vectorial) o mostrarlos en la pantalla.

  • Puede dibujar solo el borde o la forma rellena.

  • Si utiliza imágenes ráster, debe tomar un parámetro (o dos) como entrada que le permita ajustar la resolución de la salida (por ejemplo, ancho / alto).

  • El fondo debe tener al menos el tamaño del cuadro delimitador del símbolo, pero puede ser más grande.

  • La salida del símbolo unicode ☣ no es suficiente .

  • Las proporciones exactas de las distancias utilizadas se dan en el siguiente diagrama (que originalmente era de aquí ):

También traté de hacer un diagrama adicional con las mismas medidas que espero sea un poco más fácil de leer:

(Inspirado por una publicación en 99% invisible )

falla
fuente
2
Escapatoria: ¿podemos poner una imagen de 1x1 píxeles dentro de un fondo de tamaño variable?
John Dvorak
No creo que lo sea, si configura la resolución lo suficientemente grande, el símbolo aún debería aparecer. Y en cualquier caso, espero que la gente aquí tenga suficiente sentido común para entender lo que queremos decir :)
falla el
1
Si tuviera tiempo de sobra, lo probaría con PostScript o gráficos de tortuga.
Guy Coder
1
@ SriotchilismO'Zaic La longitud está determinada por los dos círculos: cada uno tiene un centro y radio determinados, por lo que la longitud está determinada por el tamaño de la brecha.
falla
1
Esa es "E" en el diagrama original (las cruces representan los centros del círculo) y en el que agregué a continuación (donde el radio se encuentra con el eje de simetría). 11
falla

Respuestas:

96

T-SQL, 442 441 426 355 349 344 bytes

DECLARE @ VARCHAR(MAX)=REPLACE(REPLACE(REPLACE('DECLARE @a5MULTIPOINT((0 31),(19 -2),(-19 -2))'',@b5MULTIPOINT((0 39),(26 -6),(-26 -6))'',@5POINT(0 9)'',@d5LINESTRING(0 9,0 99,90 -43,0 9,-90 -43)''SELECT @a830%b821)%86)%d81)%d84%819))).STUnion(@827%820)).STIntersection(@b819)))'
,8,'.STBuffer('),5,' GEOMETRY='''),'%',').STDifference(@')EXEC(@)

Ahorró más de 70 bytes al usar REPLACE()palabras clave largas y ejecutar como SQL dinámico. Vea el código posterior al reemplazo en la captura de pantalla a continuación.

Dupliqué los valores de coordenadas de la ilustración de muestra y subí 9 unidades, para reducir el número de decimales que se muestran.

Esto se realizó en SQL 2017, utilizando características geoespaciales introducidas en SQL 2008. Muchas funciones de geometría incorporadas útiles, que incluyen STBuffer, lo que me brinda una manera simple de definir círculos de diferentes tamaños alrededor de un punto.

Visual de salida, con código anotado:

Símbolo de riesgo biológico en T-SQL utilizando funciones geoespaciales

Para más dibujos de T-SQL, vea mi Conejito de Pascua .

Para aplicaciones más prácticas de esta tecnología en SQL, lea este artículo o vea este video . SE incluso tiene un sitio relacionado, gis.stackexchange.com .

Ediciones:

  1. Se guardó 1 byte al cambiar una coordenada de 104 a 99.
  2. Ahorró 15 bytes al tomar el STDifferencede a STUnionde objetos, en lugar de cada uno individualmente.
  3. Ahorró 71 bytes al usar REPLACE()palabras clave repetidas y luego se ejecutó como SQL dinámico. Revertido Edit 2, para dejar más reemplazos de STDifference.
  4. Ahorró 4 bytes moviendo el centro hacia arriba 9 unidades, lo que cambió algunas coordenadas a dígitos únicos (negativos). Esto también liberó el número 5para usarlo como un carácter de reemplazo en lugar de '#', ahorrando 2 bytes más en las comillas.
  5. Se guardaron 5 bytes moviéndose )a la STDifferencecadena de reemplazo; gracias, @Nicholas!
BradC
fuente
56
¿Por qué ... existe esto?
Alexander
26
@Alexander Para bases de datos que contienen o utilizan datos geográficos, como censos de población o estudios científicos, o incluso solo ventas de clientes por región geográfica. O simplemente para dibujar conejitos y símbolos de riesgo biológico.
BradC
24
SQL es lo suficientemente malo para la única cosa para la que está destinado, quien en su sano juicio querría ir más allá de eso. Imagine GUIs escritos en SQL. Necesito anotaciones, aspectos y un marco de prueba de unidad. Necesitamos ir más profundo .
Alexander
24
@Alexander Como quieras: TSQLT
FreeMan
15
@FreeMan Oh, por el amor de Dios.
Alexander
32

Tex + Tikz, 232 bytes

43 bytes guardados al cambiar a tex. Gracias a Phelype Oleinik

Algunos bytes guardados gracias a Skillmon

\input tikz \tikz[x=1,y=1,white]{\def\f{\foreach\1in{90:,210:,330:}}\def\u{\draw[line width=}\def~{circle(}\f\fill[red](\122)~30);\f{\u2](0,)--(\111);\u8](\130)--(\160);\fill(\130)~21);}\fill~6);\u7,red]~23.5);\f\u2](\130)~20);}\bye

Con saltos de línea y sin \def:

\input tikz
\tikz[x=1,y=1,white]{
\foreach\1in{90,210,330}\fill[red](\1:22)circle(30);
\foreach\1in{90,210,330}{
\draw[line width=2](0,0)--(\1:11);
\fill(\1:30)circle(21);
\draw[line width=8](\1:30)--(\1:60);
}
\fill(0,0)circle(6);
\draw[line width=7,red](0,0)circle(23.5);
\foreach\1in{90,210,330}\draw[line width=2](\1:30)circle(20);
}
\bye

Explicación

Esto está un poco desactualizado. Lo arreglaré cuando pueda descubrir cómo hacer que las imágenes no sean enormes.

Aquí voy a explicar cómo la respuesta sin comprimir resuelve el problema. En algún momento puedo explicar cómo funciona la compresión. Primero dibujamos los grandes círculos negros:

\foreach\x in{90,210,330}\fill(\x:21)circle(30);

ingrese la descripción de la imagen aquí

Luego dibujamos algunas líneas blancas:

\foreach\x in{90,210,330}\draw[white,line width=2cm](0,0)--(\x:11);

ingrese la descripción de la imagen aquí

Luego dibujamos círculos blancos:

\foreach\x in{90,210,330}\fill[white](\x:30)circle(21);

ingrese la descripción de la imagen aquí

Luego agregamos un círculo blanco central:

\fill[white](0,0)circle(6);

ingrese la descripción de la imagen aquí

Luego agregamos un anillo negro:

\draw[line width=7cm](0,0)circle(25.5);

ingrese la descripción de la imagen aquí

Luego eliminamos partes del anillo negro

\foreach\x in{90,210,330}\draw[white,line width=2cm](\x:30)circle(20);

ingrese la descripción de la imagen aquí

Asistente de trigo
fuente
99
No has embotado los seis puntos exteriores. Debe haber 4 unidades de espacio en blanco entre cada par.
Level River St
1
@LevelRiverSt Los seis puntos exteriores ahora están a 4 unidades de su compañero.
Wheat Wizard
2
Esas "puntas de garras" son demasiado puntiagudas, deben consistir en segmentos de línea recta paralelos a los segmentos que provienen del círculo central. También el 20.88 parece bastante sospechoso.
falla
Puede guardar otro byte usando en \1lugar de \x, como puede usar \def\f{\foreach\1in{90,210,330}}.
Skillmon
1
@flawr bueno ... ahora son literalmente un poco más pequeños que 5000x5000 ... solo 90x90 ahora ... apenas puedo distinguir los detalles: D
Nelson
15

C, 8010 bytes

Hace mucho tiempo, antes de SVG o EMF, tenía que lidiar con el ráster, y si quería que algo se cargara de inmediato, antes de que el O / S estuviera listo, como una pantalla de inicio de Windows, tenía que usar RLE o duración de ejecución -coding. Este monstruo genera un archivo PBM usando RLE como datos. Construye como siempre y corre así ./biohazard > biohazard.pbm.

Si tuviera que incluir todos los marcos necesarios para generar, por ejemplo, el motor SVG en HTML, las bibliotecas de Java, etc., esta sería probablemente la solución autónoma más pequeña , porque putses la única función externa, y generalmente es una de las más pequeñas stdio.hfunciones

Con respecto a este detalle:

Si utiliza imágenes ráster, debe tomar un parámetro (o dos) como entrada que le permita ajustar la resolución de la salida (por ejemplo, ancho / alto).

Interpreté "debería" como diferente de "imprescindible", por ejemplo, como en RFC 2119 , por lo que no incluí el escalado, porque para este código solo sería factible hacer múltiplos del original, por ejemplo, ./biohazard 2y eso introduciría atoi, printfy otros complicaciones que restarían importancia al foco principal de la presentación.

int o,i,x[]=
{4946,3,33,2,389,8,33,8,378,13,33,13,369,17,33,16,363,20,33,20,356,19,41,19,350,18,49,18,344,18,55,18,339,17,61,17,334,
17,66,17,330,17,71,17,325,17,75,17,321,17,79,17,317,17,83,17,313,17,87,16,311,16,90,17,307,17,93,17,303,17,97,17,300,
17,99,17,297,17,102,18,293,18,105,17,291,18,107,18,288,17,110,18,285,18,113,17,283,18,115,18,280,18,117,18,277,19,119,
18,275,19,121,19,272,19,123,19,270,19,125,19,268,19,127,19,266,19,129,19,263,20,131,19,261,20,133,19,259,20,134,20,257,
20,136,20,255,21,137,20,253,21,139,20,251,21,141,20,249,21,142,21,248,21,143,21,246,21,145,21,244,21,146,22,242,22,147,
22,240,22,149,22,238,22,150,22,238,22,151,22,236,22,152,23,234,23,153,23,232,23,155,22,232,23,155,23,230,23,157,23,228,
24,157,24,226,24,159,23,226,24,159,24,224,24,160,25,222,25,161,24,222,24,162,25,220,25,163,25,219,25,163,25,218,25,164,
26,216,26,165,25,216,26,165,26,214,26,166,26,214,26,167,26,212,27,167,26,212,26,168,27,210,27,169,27,209,27,169,27,208,
27,170,28,207,27,170,28,206,28,171,27,206,28,171,28,204,29,171,28,204,28,172,29,202,29,172,29,202,29,173,29,201,29,173,
29,200,30,173,29,200,30,173,30,198,31,173,30,198,30,174,31,197,30,174,31,196,31,174,31,196,31,175,31,195,31,175,31,194,
32,175,31,194,32,175,32,193,32,175,32,193,32,175,32,192,33,175,32,192,33,175,33,191,33,175,33,190,34,175,33,190,34,175,
33,190,34,175,34,189,34,174,35,189,34,174,35,188,35,174,35,188,35,174,36,187,36,173,36,187,36,173,36,187,36,173,36,186,
37,74,25,74,36,186,37,67,39,67,36,186,37,62,49,61,38,185,37,58,57,57,38,185,38,53,64,54,38,185,38,50,71,50,38,185,38,
47,76,48,38,185,38,45,81,44,39,184,40,41,87,41,39,184,40,39,91,39,39,184,40,37,95,37,39,184,40,35,99,34,41,183,41,32,
103,32,41,183,41,30,107,30,41,183,41,28,111,27,42,183,42,25,115,25,42,183,42,24,117,24,42,183,42,22,121,21,43,183,43,
19,124,20,43,183,43,18,127,18,43,183,43,17,129,16,44,183,44,14,133,14,44,183,44,13,135,12,45,183,45,11,137,11,45,183,
45,10,139,9,46,183,46,9,138,10,46,183,46,10,137,9,47,183,47,9,136,10,47,183,47,10,135,9,48,183,48,10,56,20,57,10,48,
183,49,9,50,33,49,10,48,184,49,10,45,41,45,10,48,184,50,10,40,49,40,10,49,184,50,10,37,55,36,10,50,185,50,10,33,60,34,
10,50,185,51,10,30,65,30,10,51,185,51,11,27,69,27,10,52,185,52,10,25,73,24,11,52,185,53,10,22,77,21,11,53,185,53,11,19,
81,19,10,53,186,54,11,16,85,16,10,54,185,56,11,13,88,14,11,56,181,59,11,11,91,11,11,59,176,63,11,8,94,9,11,63,171,66,
11,6,97,6,11,66,167,68,12,4,99,4,11,69,163,71,12,1,102,2,11,72,159,74,126,75,155,77,124,78,151,80,123,79,149,82,120,83,
145,85,118,86,141,88,116,88,139,90,114,91,135,93,112,93,133,96,109,96,130,98,107,98,127,101,104,102,124,104,101,104,
122,106,99,106,119,110,95,109,117,112,93,112,114,115,89,115,112,118,85,118,110,120,82,121,107,124,78,124,105,127,74,
127,103,131,69,130,101,134,65,133,99,137,60,137,97,141,54,141,95,146,47,145,93,151,39,150,91,157,29,156,89,166,13,165,
88,168,9,168,86,169,9,169,84,170,9,170,82,171,9,171,80,172,9,171,79,173,9,172,78,173,9,173,76,174,9,174,74,175,9,175,
72,176,9,175,72,176,9,176,70,177,9,177,68,64,20,93,10,94,20,63,68,57,34,83,17,83,33,58,66,54,42,77,21,76,43,54,64,51,
50,71,25,71,49,51,64,48,57,65,29,65,56,49,62,46,63,61,31,61,62,47,60,45,67,58,33,58,67,44,60,43,71,55,35,54,72,43,58,
41,36,8,32,52,37,51,33,8,35,41,58,40,36,17,26,49,39,48,27,16,37,40,56,39,38,22,23,46,41,45,24,21,39,39,55,37,40,26,21,
43,42,44,21,26,40,37,54,36,42,29,20,41,43,41,20,29,42,36,53,35,43,29,21,39,44,39,22,29,43,35,52,34,45,29,23,37,45,37,
23,29,45,34,51,33,46,29,24,35,46,35,25,29,46,33,50,32,48,29,26,33,47,33,26,29,47,33,49,31,49,29,27,32,47,32,27,29,49,
31,48,31,49,30,28,30,48,30,29,29,50,31,47,29,51,30,30,28,49,28,30,29,51,30,46,29,52,29,32,27,49,27,31,29,53,28,46,28,
53,29,33,26,49,26,32,29,54,28,44,28,54,29,34,25,49,25,33,29,55,27,44,27,55,29,35,24,49,23,35,29,56,27,43,26,56,29,36,
22,50,22,36,29,57,26,42,26,57,29,37,21,50,21,37,29,58,26,41,25,58,29,38,21,49,20,38,29,59,25,40,25,59,29,39,20,49,19,
39,29,60,24,40,24,60,29,40,19,49,19,39,29,61,24,39,23,61,29,41,18,49,18,40,29,62,23,38,23,62,30,41,17,49,17,41,29,63,
22,38,22,63,30,42,16,48,17,42,29,63,23,37,21,65,29,43,16,47,16,43,29,64,22,36,22,65,29,43,16,47,15,44,29,65,21,36,21,
66,29,44,13,50,14,44,29,66,21,35,20,67,29,45,11,53,11,45,29,67,20,34,20,68,29,46,8,57,8,46,29,67,20,34,20,68,29,46,6,
61,5,46,30,68,19,34,19,69,29,47,4,63,4,46,30,69,19,33,18,70,30,47,1,67,1,47,29,70,19,32,19,70,30,163,29,71,18,32,18,71,
30,61,2,37,2,61,29,72,18,31,17,73,29,59,5,35,5,58,30,72,18,31,17,73,29,58,7,33,7,57,30,73,17,30,17,74,30,55,10,31,10,
55,30,73,17,30,17,74,30,53,13,28,14,53,30,74,16,30,16,75,30,51,17,25,16,52,29,75,17,29,16,76,29,50,20,21,19,50,30,76,
16,29,15,77,30,50,21,16,22,50,30,77,15,29,15,77,30,50,26,7,25,51,30,77,15,28,15,78,30,51,57,50,30,78,15,28,15,78,31,50,
56,51,30,79,15,27,14,80,30,51,55,51,30,79,15,27,14,80,30,51,55,50,31,80,14,27,13,81,31,51,53,51,30,81,14,27,13,82,30,
51,53,51,30,82,13,27,13,82,31,50,52,51,31,82,13,26,13,83,31,51,51,51,31,82,13,26,13,83,31,51,51,50,31,84,12,26,13,84,
31,50,50,51,31,84,12,26,12,85,31,51,49,50,32,84,13,25,12,85,32,50,49,50,31,86,12,25,12,86,31,50,48,50,32,86,12,25,11,
87,32,50,47,50,32,86,12,25,11,87,32,50,47,49,32,88,11,25,11,88,32,49,47,49,32,88,11,25,11,88,32,49,46,49,32,89,11,25,
10,90,32,49,45,49,32,89,11,25,10,90,33,48,45,48,33,90,10,25,10,91,32,48,45,47,33,91,10,25,10,91,33,47,44,48,33,91,10,
25,10,91,34,46,44,47,33,92,10,25,9,93,33,47,43,46,34,92,10,25,9,93,34,46,43,46,33,93,10,25,9,94,34,45,43,45,34,94,9,25,
9,94,35,44,43,44,34,95,9,25,9,95,34,44,42,44,35,95,9,25,9,95,35,43,42,44,34,96,9,25,9,96,35,42,42,43,35,96,9,25,8,97,
36,42,41,42,35,97,9,25,8,98,36,41,41,41,36,97,9,25,8,99,36,40,41,40,36,98,8,26,8,99,37,39,41,39,36,99,8,26,8,100,37,38,
41,38,37,99,8,27,7,100,38,37,41,37,37,101,7,27,7,101,38,36,41,36,38,101,7,27,7,102,38,35,41,35,38,102,7,27,7,102,39,34,
41,34,38,103,7,27,7,103,39,33,41,33,39,103,7,27,7,104,39,32,41,32,39,104,7,27,7,104,41,30,41,30,40,104,7,29,6,105,41,
29,41,29,40,105,7,29,6,106,41,28,41,28,41,105,7,29,6,107,42,26,41,26,42,106,7,29,6,108,42,25,41,25,42,107,7,29,7,107,
44,22,42,23,43,108,6,30,7,108,44,21,42,21,45,108,6,31,6,109,45,19,42,20,45,109,6,31,6,110,46,17,43,17,46,110,6,31,6,
111,47,15,43,15,47,111,6,31,6,112,48,13,43,13,48,112,5,33,5,113,49,11,43,10,50,112,6,33,5,114,50,9,43,9,50,113,6,33,6,
113,50,8,44,9,49,114,6,33,6,114,48,9,45,8,48,115,5,35,5,115,47,9,45,8,47,116,5,35,5,117,45,8,46,9,45,116,6,35,6,117,44,
8,46,9,44,117,5,37,5,118,42,9,47,8,43,118,5,37,5,119,41,9,47,9,41,119,5,37,5,120,40,8,48,9,40,119,5,39,5,120,39,8,48,9,
38,121,5,39,5,121,37,9,49,8,37,122,5,39,5,123,35,9,49,9,35,123,4,41,5,123,34,8,50,9,34,123,5,41,5,124,32,9,51,9,31,125,
5,42,3,127,30,9,51,9,30,127,3,43,1,130,28,9,52,9,29,130,1,176,26,9,53,9,26,310,24,9,54,9,24,314,22,9,55,9,22,317,20,9,
55,9,20,320,18,9,56,10,17,324,15,10,57,9,16,327,13,9,58,10,13,331,10,10,59,9,11,335,8,9,60,10,8,339,5,10,61,9,6,344,2,
9,62,10,2,358,63,368,65,367,65,366,67,365,67,364,69,362,70,362,71,360,73,358,75,356,76,356,77,354,79,352,81,350,82,349,
84,215,2,130,86,130,3,79,5,129,87,128,6,77,6,127,89,126,6,79,6,125,91,124,7,80,6,123,93,122,7,82,6,121,95,120,7,84,6,
119,97,118,7,86,7,115,100,116,7,87,8,113,102,114,7,89,8,111,105,111,7,91,8,109,107,109,7,93,8,107,109,106,9,94,9,103,
112,104,9,96,9,101,115,101,9,98,10,97,118,98,10,100,10,95,121,95,10,102,11,91,124,92,11,104,11,89,127,88,11,107,12,85,
131,85,11,110,12,81,135,81,12,112,13,77,138,78,13,114,14,73,143,73,14,116,15,69,72,2,73,69,15,118,17,63,74,5,73,64,16,
122,17,59,75,7,75,58,18,124,19,53,77,9,77,53,19,126,22,45,79,13,78,46,21,130,24,37,82,15,81,38,24,132,28,27,85,18,86,
27,28,135,37,5,95,21,95,5,37,138,134,24,135,141,131,27,131,144,128,31,127,148,124,34,125,151,121,37,121,155,117,41,117,
159,113,45,113,163,109,49,109,167,105,53,105,171,101,57,101,175,96,62,96,181,91,67,91,185,86,72,86,191,80,78,81,196,74,
84,74,204,67,91,67,211,59,99,59,219,51,107,51,228,40,119,39,242,25,133,25,5311,0};
main(){for(puts("P1\n432 408");x[i];++i,o=!o)while(x[i]--)puts(o?"0":"1");}
mbomb007
fuente
1
Sería bueno explicar cómo generó el código.
Coeur
El código genera una nueva línea después de cada carácter; Creo que necesitas putchar()o similar.
Marcelm
@marcelm - ¡El formato PBM P1 está bien con eso!
1
Estoy bastante seguro de que debería significar imprescindible para esta pregunta, pero probablemente valdría la pena abordar el OP.
Wheat Wizard
1
No creo que usar necesariamente deba significar que hay una distinción. Esta es realmente una pregunta que debería (o quizás deba) hacerle al OP.
Wheat Wizard
15

TeX + Ti k Z, 234 230 226 bytes

Originalmente 5 bytes más que la respuesta de Sriotchilism O'Zaic , pero esta debería ser correcta. Es similar a su respuesta, pero ahorra algunos bytes más aquí y allá, necesita uno \draw[line width=8]más (en el código a continuación, esto se hace por \28](~30)to(~55);, eso es 17 bytes agregados solo para esto) para obtener las puntas del símbolo correctas, de ahí el 5 bytes más longitud total del código.

Y gracias al Sriotchilism O'Zaic volví a leer algunas de las preguntas y me di cuenta de que puedo cambiar el color a rojo, de modo que vuelvo a guardar algunos bytes:

\input tikz\let~\def~\1{circle(}~\2{\draw[line width=}~~{\foreach~in{90:,210:,330:}}\tikz[x=1,y=1,white]{~\fill[red](~22)\130);~{\fill(~30)\121);\28](~30)to(~55);\22](~0)to(~10);}\fill\16);\27,red]\123.5);~\22](~30)\120);}\bye

TeX-g + Ti k Z, 195 bytes

Solo si a alguien le importa, lo siguiente usa un dialecto de golf de código basado en TeX en el que estoy trabajando (no considere el código estable). El recuento de bytes incluye caracteres EOL y el carácter EOF, ya que se usan semánticamente (EOL delimita argumentos de bucles). El dialecto es bastante pequeño hasta ahora y solo presenta shorthands para definiciones y una sintaxis for-loop, sin embargo, no está escrito específicamente para esta respuesta, por lo que no debería romper las reglas del golf de código. Repositorio para el -g.texpaquete / archivo: https://github.com/Skillmon/TeX-g

\input-g <tikz>~"{\:~{90:,210:,330:}}~'{circle(}~_{\draw[line width=}!f\fill\tikz[x=1,y=1,white]{"f[red](~22)'30);
"f(~30)'21);_8](~30)to(~55);_2](~0)to(~10);
f'6);_7,red]'23.5);"_2](~30)'20);
}

La salida de ambos fragmentos de código se ve idéntica:

ingrese la descripción de la imagen aquí

( Demasiado perezoso para actualizar la imagen, solo imagina que es rojo )

Skillmon
fuente
Mi respuesta ahora es correcta y 2 bytes más corta que la tuya. Estoy seguro de que alguien podría combinar algunas de mis respuestas con algunas de las suyas para hacer una más corta, pero no entiendo bien su respuesta.
Wheat Wizard
@ SriotchilismO'Zaic si cambio el color a rojo (sobrepasado la regla de que el color puede ser arbitrario), lo consigo a 230 bytes.
Skillmon
@ SriotchilismO'Zaic y obviamente guardaste más de un byte en tu respuesta mirando el mío (solo diciendo).
Skillmon
Ok, miré tu respuesta y no entendí lo que estaba haciendo, así que no creo que realmente podría haber tomado mucho de tu respuesta. Pero de todos modos cambié el mensaje para eliminar un número exacto, ya que tal vez recogí algunas cosas de su respuesta sin darme cuenta.
Wheat Wizard
2
@ SriotchilismO'Zaic está bien. Después de todo, mi código está influenciado por el suyo, actualmente intento escribir un paquete de código de golf para convertir TeX en un lenguaje de código de algún tipo. Cuando finalmente lo publique, mi respuesta será más corta :) (Este no es un lenguaje específicamente diseñado para esta pregunta, por lo que no rompe las reglas)
Skillmon
12

GLSL, 700 629 564 545 499 bytes

#define v vec2
#define j(x,r)length(x-g)<r
#define k(x,r,q)j(x,q)!=j(x,r)
#define l(b)length(g-b)<1.&&length(g-dot(g,b)*b)<(length(g)<S?A*S:A/S)
float C=.86,S=.5,F=.3,E=.22,A=.02,G=.21;void mainImage(out vec4 o,in v p){v r=iResolution.xy;v g=(p/S-r)/r.y;o.g=(k(v(0,F),G,G-A)||k(v(F*C,-F*S),G,G-A)||k(v(-F*C,-F*S),G,G-A))?o.g=0.:k(v(0),F,G)?C:l(v(0,1))||l(v(C,-S))||l(v(-C,-S))||j(v(0),.06)||j(v(0,F),G)||j(v(F*C,-F*S),G)||j(v(-F*C,-F*S),G)?0.:j(v(0,E),F)||j(v(E*C,-E*S),F)||j(v(-E*C,-E*S),F)?C:0.;}

Estaba jugando con Shadertoy, así que probé el lenguaje de sombreado GLSL. El código simplemente rasteriza círculos y líneas al probar cada fragmento y les asigna un valor de uno o cero. El tamaño se redujo de> 1000 bytes por el uso intensivo de macros.

Programa de sombreado

ingrese la descripción de la imagen aquí

Roninkoi
fuente
1
Bienvenido al sitio! Neat primera respuesta!
Wheat Wizard
No sé la lengua, pero puedo el &&y ||estar a Jugamos al golf &y |en algunas o todas las partes?
Kevin Cruijssen
@KevinCruijssen Es un subconjunto de C, por lo que serían operaciones bit a bit. Sin embargo
Roninkoi
1
@Roninkoi De hecho, vi que estaba basado en C. En C es posible usar |/ en &lugar de ||/ &&para bools, ¿no? No he hecho nada en C en mucho tiempo, así que no estoy seguro. Sé que funciona en Java / C # .NET en la mayoría de los casos. Pero solo ahora noto el enlace de Shadertoy que ha agregado, y no parece funcionar allí como ya lo ha dicho. Ah bueno. Bonita primera respuesta por cierto! Bienvenido a CGCC.
Kevin Cruijssen
¿Corté -30 bytes en el código publicado pero el encabezado dice 566 bytes y el código publicado es 628?
PrincePolka
12

SVG (HTML5), 434 410 321 bytes

<svg><circle cx=60 cy=60 r=23.5 stroke-width=7 fill=#fff stroke=#000 /><use href=#g transform=translate(120,0)scale(-1,1) /><g id=g><use href=#p transform=rotate(120,60,60) /><use href=#p transform=rotate(240,60,60) /><path id=p stroke=#fff stroke-width=2 d=M55,60A5,5,0,0,1,60,55V50A20,20,0,0,1,58,10V7A31,31,0,0,0,29,43

Ahora basado en el SVG de @ LevelRiverSt.

Neil
fuente
1
Creo que omitir <defs>es seguro. Esto funciona para mí en Firefox, Chrome y Edge.
Arnauld
@Arnauld ¡Gracias, eso significa que también puedo deshacerme del primero <use>!
Neil
12

Procesamiento, 371 368 bytes

translate(width/2,width/2);scale(width/99);int i=0,b=204;float t=TAU/3;noStroke();for(;i<3;i++){fill(0);ellipse(0,-22,60,60);rotate(t);}for(;i<6;i++){fill(b);rect(-4,-60,8,16);ellipse(0,-30,42,42);rotate(t);}ellipse(0,0,12,12);stroke(0);strokeWeight(7);noFill();ellipse(0,0,47,47);for(;i<9;i++){strokeWeight(2);stroke(b);ellipse(0,-30,40,40);line(0,0,0,-9);rotate(t);}

No estaba seguro de si el procesamiento debería contar como rasterizado o no para el propósito de este desafío. Si cuenta como rasterizado, el translatey scalees necesario para que el símbolo sea legible y en pantalla para un tamaño de ventana determinado. Pero, dado que todos los comandos de dibujo están vectorizados, funciona a cualquier escala; así que si suponemos que dibujar en el origen relativo tiene unas 200 unidades de ancho está bien, los primeros 43 bytes se pueden descartar.

Esto supone que el color de fondo es 204, 204, 204, que es el color de fondo predeterminado en el procesamiento. También supone un rectModede CORNERy un ellipseModede CENTER(los valores predeterminados)

Con una inicial size(640, 640), el boceto resultante se ve así:

ingrese la descripción de la imagen aquí

Al duplicar la escala, ahorré 3 bytes, porque .5se eliminan los s (aunque varios números fluyen de 1 dígito a 2 dígitos).

La construcción es similar a la solución TeX, dibujando negro y luego gris en la parte superior para "borrar" los espacios entre la forma.

Explicación:

translate(width/2,width/2); // Move to the middle of the canvas
scale(width/99);            // Scale up to fill the canvas

int i=0,b=204;              // Initialize i, and `b` to the background color
float t=TAU/3;              // Save a rotation of one third, in radians

noStroke();
for(;i<3;i++){ // Draw the three big black circles
  fill(0);
  ellipse(0,-22,60,60);
  rotate(t);
}
for(;i<6;i++){
  fill(b);
  rect(-4,-60,8,16);     // "Blunt" the corners on the sharp outer rings
  ellipse(0,-30,42,42); // Cut out the middle of the big circles
  rotate(t);
}
ellipse(0,0,12,12); // Cut out the small circle in the middle
stroke(0);
strokeWeight(7);
noFill();
ellipse(0,0,47,47); // Draw the thick band that goes through all three big circles
for(;i<9;i++){
  strokeWeight(2);
  stroke(b);
  ellipse(0,-30,40,40); // Cut the "gap" between the three big rings
                        //and the band passing through them
  line(0,0,0,-16);      // Cut the lines coming out of the small middle circle
  rotate(t);
}
Curtis Fenner
fuente
Se ve bien :) Creo que si duplica todas las medidas puede evitar el .5!
falla
Sí, pero eso también cambiaría parte del número de un solo dígito a dos dígitos, por lo que no estoy seguro de cómo se equilibra. Si conté bien, parece que eso ahorraría 2 bytes. También estaba pensando en usar un scalepara cambiarlo solo por una parte del código, pero no estaba seguro de dónde ponerlo mejor
Curtis Fenner
oh tienes razón, no lo consideré.
falla
Duplicar las medidas para eliminar decimales ahorró casi 10 bytes en mi respuesta, a pesar de que algunos códigos pasaron de uno a dos dígitos. Vale la pena intentarlo, de todos modos.
BradC
1
Ahorré 3 bytes duplicando la escala a la que se dibuja. @IsmaelMiguel
Curtis Fenner
9

GLSL 319 310 bytes

#define F float
#define H(y)sqrt(x*x+(y)*(y))
void mainImage(out vec4 D,in vec2 u){vec2 U=u*.003-.5;F x=abs(U.x),y=U.y;if(y<.577*x){F t=.5*x+.866*y;y=.866*x-.5*y;x=abs(t);}F c=F(H(y-.11)<.15);F R=H(y);F S=H(y-.15);if(S<.105)c=0.;if(R<.03)c=0.;if(x<(R<.1?.005:.02))c=0.;if(R>.10&&R<.135&&S<.095)c=1.;D=vec4(c);}

Esto se puede representar en Shadertoy .

muestra

Puede usar la simetría en la imagen para dibujarla con una cantidad menor de formas separadas.

Aquí hay una versión algo inflada:

#define F float
#define H(y) sqrt(x*x+(y)*(y))

void mainImage(out vec4 D,in vec2 u)
{
    // normalized UV
    vec2 U = u*.003 - .5;

    // fold the 6 identical sections to the same UV coordinates
    F x = abs(U.x), y = U.y;
    if (y < .577*x)
    {
        F t = .5*x + .866*y;
        y = .866*x - .5*y;
        x = abs(t);
    }

    // circles and lines
    F c = F(H(y-.11) < .15);
    F R = H(y);
    F S = H(y-.15);
    if (S < .105) c = 0.;
    if (R < .03) c = 0.;
    if (x < (R < .1 ? .005 : .02)) c = 0.;
    if (R > .10 && R < .135 && S < .095) c = 1.;

    // output
    D = vec4(c);
}

(gracias a @Kevin Cruijssen por eliminar algunos espacios en blanco innecesarios)

roeland
fuente
1
Puedes eliminar algunos de los espacios. El que está en su definición: H(y) sqrtH(y)sqrt; todos los espacios en sus sentencias if: if (if(; y aquellos en su último enunciado if que rodean los AND: if (R>.10 && R<.135 && S<.095)c=1.;if(R>.10&&R<.135&&S<.095)c=1.;.
Kevin Cruijssen
8

HTML / JS,  448 435 433  387 bytes

Ahorró muchos bytes usando la versión minimizada de @ Neil del SVG.
Ahorró 2 bytes gracias a @Shaggy

Una versión comprimida de este archivo SVG de Wikimedia Commons.

<body onload="_=`<svg~12y~24y><path id=p d=m28.8117,27.046a3,3}0qb3117q4.004v-1w539|1wq20.7959v-w583a1jxb7975x7.3228xj,8.6032x9.7443l-.4835q.2792|-18.7598q9.0989zm3.4148q8.871a10x0}0q1b453,c9w,9w{-kx3wx3w}1x6.8042,0x0x0{k>~><use href=#p transform=rotate(},cc|a10wx0w}c{}1qb1756,yc26,26) /x,1w.5q,-kb7417j5x5}1c0,b2.`;for(i of`bcjkqwxy{|}~`)with(_.split(i))_=b.innerHTML=join(pop())"id=b>

Pruébalo en línea! (solo da salida a la cadena descomprimida)

Fragmento de demostración

Arnauld
fuente
Esto funciona, en CodePen en Chrome Android, para 392.
Shaggy
1
@Arnauld He invertido mi respuesta, aunque costó 5 bytes (aunque encontré otro byte innecesario, así que en general mi puntaje solo aumentó 4).
Neil
@Neil Actualizado en consecuencia. ;)
Arnauld
¡Resulta que el SVG de @ LevelRiverSt es mucho más pequeño!
Neil
7

Haskell , 530 491 436 435 430 420 bytes

f=fromIntegral
c(a,b)r(x,y)=(x-a)^2+(y-b)^2<r^2
(m#w)t(x,y)|c<-cos(-t),s<-sin(-t)=x*c-y*s>m&&abs(x*s+y*c)<w/2
u a p=any($p)a
i a p=all($p)a
v=(*(pi/6))<$>[9,5,1]
o=c(0,0)
h?r=[c(h*cos a,h*sin a)r|a<-v]
(h%y)x|u[i[u$11?15,(not.)$u$o 3:map(0#1)v++map(9#4)v++15?10.5],i[o 13.5,not.(o 10),u$15?9.5]](60*f x/h-30,60*f y/h-30)="0 "|0<1="1 "
g h|s<-show h,n<-[0..h-1]=writeFile"a.pbm"$unlines$"P1":(s++' ':s):[n>>=(f h%)y|y<-n]

Emite un archivo PBM.

¡Esto fue muy divertido!

Peligro biológico

(Tuve que convertir esto a PNG para cargar a imgur)

Básicamente creamos nuestras propias funciones de gráficos vectoriales que se representan en una imagen píxel por píxel al detectar si el píxel es parte de la forma. La forma se construye como un grupo de círculos y líneas (que se irradian desde el origen) unidos con operaciones básicas del conjunto: unión, intersección y no. Los círculos están compuestos por su centro y un radio, y las líneas tienen un radio mínimo, un ancho y un ángulo en ese orden. Detectar la membresía en un círculo es fácil: solo resta las coordenadas centrales y comparo la magnitud con el radio. La línea es un poco más complicada: giro el punto por el opuesto del ángulo para traerlo (para anular la rotación) y luego verifico si las coordenadas x e y están dentro del rango esperado. El radio mínimo es garantizar que el espacio más grande en los extremos lejanos de los círculos grandes no anule los espacios pequeños cerca del centro. Después de eso, es una simple cuestión de lógica booleana establecer las matemáticas.

EDITAR: ¡Muchas gracias a @flawr por quitar 39 bytes!

EDIT2: ¡Muchas gracias a @Christian Sievers por sacar 55 bytes! Buena idea convertirlos en funciones.

EDIT3: ¡Gracias de nuevo a @Christian Sievers por eliminar otro byte!

EDIT4: ¡Despegó 7 bytes gracias a @ H.PWiz y @Angs!

EDIT5: ¡Acabo de notar un error! ¡Estaba renderizando las líneas dos veces más gruesas de lo que se suponía que debían ser! Me costó 2 bytes arreglarlo (tuve que dividir el ancho por 2; podría haber ajustado los valores constantes, pero cambiar 1 a 0.5 también costaría 2).

EDIT6: ¡Gracias @Angs por sacar otros 10 bytes!

usuario1472751
fuente
Wow, esto es genial. Es raro ver a alguien definiendo sus propios tipos en code-golf aquí :) Dos preguntas: ¿Es necesario tener ángulos negativos [-90,-210,-330]? ¿Y sería posible cambiar el <=a <?
falla
1
Así que lo probé y logré
reducir
1
Ah, en caso de que no lo supieras, tenemos un chat de haskell y algunos consejos para jugar al golf en haskell .
falla
1
Otro pequeño
retoque
1
¡Agradable! Es posible sin tipo de datos
Christian Sievers
6

Rubí , 278 bytes

puts"<svg viewBox='-60-60 120 120'><circle cx='0'cy='0'r='23.5'stroke-width='7'fill='white'stroke='red'/>",(-3..5).map{|i|"<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(#{i/3},-1)rotate(#{i*120})'/>"}

Pruébalo en línea!

Genera el código SVG a continuación, con el símbolo al 200% de la escala en el OP.

Consiste en un círculo en la parte posterior y las puntas en primer plano. La punta se escala -1,0,1en el Xeje y se gira a través de múltiplos de 120 grados. Los casos donde la Xescala es cero no producen salida, mientras que -1y +1. Proporcione los dos lados de cada par de dientes.

Se utiliza un borde blanco de 2 unidades de ancho alrededor del diente para cortar el círculo posterior, utilizando los atributos strokey stroke-width. Para que la forma interna sea según el OP, las coordenadas se mueven 1 unidad (la mitad del ancho del borde). Observe que el camino no está cerrado deliberadamente, para suprimir el dibujo de la línea final del borde. Esto asegura que las dos mitades de cada par de puntas se unan.

Se dibujan 90 grados del círculo interior en lugar de los 60 esperados, por razones de golf. Esto significa que existe cierta superposición entre las bases de cada par de puntas, pero esto no afecta la apariencia de la forma de salida.

<svg viewBox='-60-60 120 120'><circle cx='0'cy='0'r='23.5'stroke-width='7'fill='white'stroke='red'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(-1,-1)rotate(-360)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(-1,-1)rotate(-240)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(-1,-1)rotate(-120)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(0,-1)rotate(0)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(0,-1)rotate(120)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(0,-1)rotate(240)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(1,-1)rotate(360)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(1,-1)rotate(480)'/>
<path fill='red'stroke='white'stroke-width='2'd='M5 0A5 5 0 0 1 0 5v5A20 20 0 0 1 2 50v3A31 31 0 0 0 31 17'transform='scale(1,-1)rotate(600)'/>

Level River St
fuente
6

PostScript , 367 359 328 271 bytes

Código (versión comprimida):

5 5 scale 36 24 translate <</c{0 360 arc closepath}/r{120 rotate}/R{repeat}/L{setlinewidth}/g{setgray}/F{fill}>>begin 3{0 11 15 c F r}R 1 g 3{0 15 10.5 c F r}R 0 0 3 c F 3{[-.5 2 1 3 -2 25 4 3]rectfill r}R 0 g 4 L 0 0 11.5 c stroke 1 g 1 L 3{0 15 10 c stroke r}R showpage

Código (versión sin comprimir):

5 5 scale                  % over-all scale
36 24 translate            % over-all shift

% define some short-named procedures for later use
<<
  /c { 0 360 arc closepath }  % append circle (x, y, radius are taken from stack)
  /r { 120 rotate }           % rotate by 120°
  /R { repeat }
  /L { setlinewidth }
  /g { setgray }
  /F { fill }
>> begin

3 {
    0 11 15 c F       % black circle
    r                 % rotate by 120°
} R
1 g                   % set white color
3 {
    0 15 10.5 c F     % white circle
    r                 % rotate by 120°
} R
0 0 3 c F             % small white circle
3 {
    [ -.5 2 1 3       % white gap near center
      -2 25 4 3       % white gap on edge
    ] rectfill
    r                 % rotate by 120°
} R
0 g                   % set black color
4 L                   % set linewidth 4
0 0 11.5 c stroke     % black ring
1 g                   % set white color
1 L                   % set linewidth 1
3 {
    0 15 10 c stroke  % white ring
    r                 % rotate by 120°
} R
showpage

Resultado (como animación para ver cómo se dibuja):

resultado

Thomas Fritsch
fuente
Gran animación
dana
2

Python 3 con pygame, 327 314 287 278 bytes

(Aplicado varios cortes desagradables para salvar a 13 bytes; más notablemente ya que almacena el color, pero el cálculo sobre la marcha sin -(r>25))
(refactorizado de funcionar, perdiendo sys; hackeado a cabo matha favor de coordinar constantes, pequeños retoques; guardadas en la memoria 27 bytes)
(Reescribió coordenada constantes a trucos matemáticos complejos para obtener (co) seno , ahorrando 9 bytes)

Función que toma un argumento entero único que representa la mitad del ancho / alto de la imagen resultante. Por ejemplo f(500), creará una ventana de 1000x1000 píxeles y dibujará un símbolo de riesgo biológico allí.

from pygame import*;D=display
def f(S):
 u=D.set_mode([S*2]*2);b=S>>6
 for p,r,w in(22,30,0),(30,20,0),(0,27,7),(30,21,2),(0,6,0),(51,4,0):
  for l in 0,4/3,8/3:Z=1j**l*p*b;q=S+int(Z.imag),S-int(Z.real);draw.circle(u,-(r>25),q,r*b,w*b);r-20or draw.line(u,0,(S,S),q,b*2);D.flip()

Versión sin acortar:

import pygame
import math
import sys

size = int(sys.argv[1])
basic = size // 55

screen = pygame.display.set_mode((size * 2, size * 2))

circles = [
    (22, 30, 0, -1),  # basic shape
    (30, 20, 0, 0),   # large cutouts
    (0, 27, 7, -1),   # "background circle"
    (30, 21, 2, 0),   # "background circle" clearance
    (0, 6, 0, 0),     # center disc
    (51, 4, 0, 0),    # blunt the points
]

for pos, radius, width, color in circles:
    for lobe in [0, math.pi * 2 / 3, math.pi * 4 / 3]:
        x = int(math.sin(lobe) * pos * basic) + size
        y = size - int(pos * basic * math.cos(lobe))
        pygame.draw.circle(screen, color, (x, y), radius * basic, width * basic)
        # Hack to draw the small slots in the center
        if radius == 20:
            pygame.draw.line(screen, 0, (size, size), (x, y), basic * 2)

pygame.display.flip()

La clave de este programa es explotar principalmente la simetría de puntos de 3 vías del símbolo y expresar las operaciones de dibujo de la forma más escasa posible. El corazón de todo es circles, que es una lista de definiciones de círculo, que consta solo de:

  • position: a qué distancia del origen en unidades básicas medias
  • radius: el radio del círculo en unidades medias medias
  • width: el ancho del borde del círculo (hacia adentro desde el círculo exterior, 0 = relleno)
  • color: explotando el hecho de que pygame interpreta 0como blanco y -1negro

Cada operación de dibujo se repite tres veces, girada 120 °. El embotamiento de las "garras" se realiza con otro círculo. Los "cortes de línea" internos están revestidos especialmente porque no podría pensar en una forma más eficiente de introducirlos allí. La "unidad básica" se define en la especificación se duplicó aquí, así que no tenía que usar .5en circlesy int()por todo el lugar para satisfacer pygame.

Resultado para python3 -c 'from biohazard import *; f(500)':

Mostrar salida de esta respuesta

marcelm
fuente
1
Buen trabajo y bienvenido a CGCC! La descripción debe decir "Python 3 + pygame" cuando se usa una biblioteca no integrada. La entrada se puede tomar de la entrada estándar o como un argumento de función para evitar importar el sysmódulo, lo que acorta el código (ver reglas ). Además, este truco se puede aplicar para evitar la necesidad de importar math.
Joel
@ Joel ¡Gracias por los comentarios! Incluí pygame en el encabezado y convertí el código en una función. En cuanto a math, refactoré eso a una lista de coordenadas; eran solo 3 de ellos de todos modos. No (co) seno necesario.
Marcelm
1
La aplicación del truco mencionado en realidad ahorra más bytes que poner todos los números en el código fuente.
Joel
@ Joel Gracias por el recordatorio; anteriormente descarté esa opción porque parecía más larga pero parece que estaba equivocada. También permitió algunas optimizaciones más.
Marcelm
1

Tcl / Tk - 557 bytes

set F #000
set B #F50
pack [canvas .c -bg $B]
rename expr e
rename foreach f
rename proc p
p R r {list [e $r*cos($::a)] [e $r*sin($::a)]}
p D {d r} {lassign [R $d] x y;list [e $x-$r] [e $y-$r] [e $x+$r] [e $y+$r]}
p C {d r c} {.c cr o {*}[D $d $r] -f $c -outline $c}
p L {p q w} {.c cr l {*}[R $p] {*}[R $q] -w [e $w] -f $::B}
p A {d r w c} {.c cr a {*}[D $d $r] -w [e $w] -star 0 -ex 359.9 -sty arc -outline $c}
f x {{C 11 15 $F} {C 15 10.5 $B} {L 0 5 1} {L 20 40 4} {C 0 3 $B} {A 0 11.75 3.5 $F} {A 15 10 1 $B}} {f a {2.62 4.72 6.81} $x}
.c move all 99 99

Sin embargo, esa versión es aburrida, ya que obtienes la misma imagen de tamaño pequeño sin importar qué. Sin embargo, satisface las condiciones OP para mostrar en pantalla. Aquí está la versión sin comprimir con comentarios y la capacidad de especificar un tamaño agregado en:

# Input: command line argument is the pixel width (same as the height) of the window to create
# For example:
#   wish a.tcl 500
set window_size $argv

set foreground_color #000
set background_color #F50
pack [canvas .c -bg $background_color -width $window_size -height $window_size]

# Helper procs to generate x,y coordinates
proc radius->x,y r {
  list [expr {$r*cos($::angle)}] [expr {$r*sin($::angle)}]
}

proc center_offset,radius->rectangle {offset r} {
  lassign [radius->x,y $offset] x y
  list [expr {$x-$r}] [expr {$y-$r}] [expr {$x+$r}] [expr {$y+$r}]
}

# Tk's canvas does not scale line widths, so we have to do that manually
# The $scale is a global variable for compressing the code text above
set scale [expr {$window_size*.016}]

# These three procs draw items in the canvas
proc circle {offset r color} {
  .c create oval {*}[center_offset,radius->rectangle $offset $r] -fill $color -outline $color
}
proc line {p q w} {
  .c create line {*}[radius->x,y $p] {*}[radius->x,y $q] -width [expr {$::scale*$w}] -fill $::background_color
}
proc annulus {offset r w color} {
  .c create arc {*}[center_offset,radius->rectangle $offset $r] -width [expr {$::scale*$w}] -start 0 -extent 359.9 -style arc -outline $color
}

# Our list of shapes to draw
#  circle  center_offset, radius,                   color
#  line    end_offset_1,  end_offset_2, line_width
#  annulus center_offset, radius,       line_width, color
foreach command {
  {circle  11 15        $foreground_color}
  {circle  15 10.5      $background_color}
  {line     0  5    1}
  {line    20 40    4}
  {circle   0  3        $background_color}
  {annulus  0 11.75 3.5 $foreground_color}
  {annulus 15 10    1   $background_color}
} {
  # Each command gets applied thrice, rotated $angle radians each time
  foreach angle {2.62 4.72 6.81} $command
}

.c scale all 0 0 $scale $scale
.c move all [expr {$window_size/2}] [expr {$window_size/2}]

# Some random convenience stuff for playing with it
bind . <Escape> exit
after 500 {focus -force .}

Lo siento, no hay fotos (trabajando en mi teléfono hoy). Produce un símbolo negro sobre un fondo naranja de riesgo biológico.

Dúthomhas
fuente