Disegna il ☣ (simbolo di rischio biologico)


66

Disegna il simbolo Biohazard in un colore arbitrario su uno sfondo chiaramente colorato. Le proporzioni specifiche furono pubblicate nel numero del 27 giugno 1974 del Registro federale del governo degli Stati Uniti.

Dettagli

  • Come output, sono consentiti entrambi la scrittura su un file (sono consentiti i formati raster e vettoriale) o la visualizzazione sullo schermo.

  • Puoi disegnare solo il bordo o la forma piena.

  • Se si utilizzano immagini raster, è necessario prendere un parametro (o due) come input che consente di regolare la risoluzione dell'output (ad es. Larghezza / altezza).

  • Lo sfondo deve almeno avere la dimensione del riquadro di delimitazione del simbolo ma può essere più grande.

  • L'emissione del simbolo unicode ☣ non è sufficiente .

  • I rapporti esatti delle distanze utilizzate sono riportati nel diagramma seguente (che era originariamente da qui ):

Ho anche provato a fare un diagramma aggiuntivo con le stesse misurazioni che si spera sia un po 'più facile da leggere:

(Ispirato da un post sul 99% invisibile )


2
Scappatoia: possiamo solo mettere un'immagine di 1x1 pixel all'interno di uno sfondo di dimensioni variabili?
John Dvorak,

Non penso che lo sia, se imposti una risoluzione abbastanza grande il simbolo dovrebbe ancora apparire. E in ogni caso spero che le persone qui abbiano abbastanza buon senso per capire cosa intendiamo :)
flawr

1
Se avessi tempo da perdere, proverei con PostScript o la grafica delle tartarughe.
Guy Coder

1
@ SriotchilismO'Zaic La lunghezza è determinata dai due cerchi: hanno ciascuno un centro e un raggio, quindi la lunghezza è determinata dalla dimensione del gap.
flawr

1
Questa è "E" nel diagramma originale (le croci rappresentano i centri del cerchio) e in quello che ho aggiunto sotto (dove il raggio incontra l'asse di simmetria). 11
flawr

Risposte:


96

T-SQL, 442 441 426 355 349 344 byte

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(@)

Oltre 70 byte salvati utilizzando REPLACE()parole chiave lunghe ed eseguendo come SQL dinamico. Vedi il codice post-sostituzione nello screenshot qui sotto.

Ho raddoppiato i valori delle coordinate dall'illustrazione del campione e sono aumentato di 9 unità, per ridurre il numero di decimali visualizzati.

Ciò è stato fatto in SQL 2017, utilizzando le funzionalità geospaziali introdotte in SQL 2008. Molte utili funzioni geometriche incorporate, tra cuiSTBuffer , che mi dà un modo semplice per definire cerchi di dimensioni diverse attorno a un punto.

Visual di output, con codice annotato:

Simbolo di rischio biologico in T-SQL mediante funzioni geospaziali

Per ulteriori disegni T-SQL, vedi il mio coniglietto pasquale .

Per applicazioni più pratiche di questa tecnologia in SQL, leggi questo articolo o guarda questo video . SE ha persino un sito correlato, gis.stackexchange.com .

modifiche:

  1. Salvato 1 byte modificando una coordinata da 104 a 99.
  2. 15 byte salvati prendendo il simbolo STDifferencedi aSTUnion degli oggetti, anziché ciascuno singolarmente.
  3. 71 byte salvati utilizzando REPLACE()parole chiave ripetute, quindi eseguendo come SQL dinamico. Ripristina Modifica 2, per lasciare più sostituzioni diSTDifference .
  4. Salvato 4 byte spostando il centro in alto di 9 unità, modificando alcune coordinate in cifre singole (negative). Ciò ha anche liberato il numero 5da utilizzare come carattere sostitutivo anziché '#', risparmiando altri 2 byte tra virgolette.
  5. 5 byte salvati spostandosi )nella STDifferencestringa di sostituzione; grazie, @Nicholas!

56
Perché ... esiste?
Alexander,

26
@Alexander Per database che contengono o utilizzano dati geografici, come il censimento della popolazione o studi scientifici, o anche solo le vendite dei clienti per area geografica. O semplicemente per disegnare conigli e simboli di rischio biologico.
BradC,

24
SQL è abbastanza male per l'unica cosa per cui è destinato, che nella loro mente giusta vorrebbe andare oltre. Immagina GUI scritte in SQL. Ho bisogno di annotazioni, aspetti e un framework di unit test. Dobbiamo andare a un pareggio .
Alexander,

24
@Alexander Come desideri: TSQLT
FreeMan

15
@FreeMan Oh per l'amor di Dio.
Alexander,

32

Tex + Tikz, 232 byte

43 byte salvati passando a tex. Grazie a Phelype Oleinik

Alcuni byte salvati grazie 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 interruzioni di riga e senza \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

Spiegazione

Questo è un po 'obsoleto, lo risolverò quando riuscirò a capire come rendere le immagini non entusiasmanti

Qui spiegherò come la risposta non compressa risolve il problema. Potrei spiegare ad un certo punto come funziona la compressione. Per prima cosa disegniamo i grandi cerchi neri:

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

inserisci qui la descrizione dell'immagine

Quindi disegniamo alcune linee bianche:

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

inserisci qui la descrizione dell'immagine

Quindi disegniamo cerchi bianchi:

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

inserisci qui la descrizione dell'immagine

Quindi aggiungiamo un cerchio bianco centrale:

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

inserisci qui la descrizione dell'immagine

Quindi aggiungiamo un annulus nero:

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

inserisci qui la descrizione dell'immagine

Quindi rimuoviamo parti dell'annulus nero

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

inserisci qui la descrizione dell'immagine


9
Non hai smussato i sei punti esterni. Dovrebbero esserci 4 unità di spazio bianco tra ogni coppia.
Level River St

1
@LevelRiverSt I sei punti esterni sono ora a 4 unità di distanza dal loro partner.
Wheat Wizard

2
Quelle "punte di artigli" sono troppo appuntite, dovrebbero consistere in segmenti di linea retta paralleli ai segmenti provenienti dal cerchio centrale. Anche il 20.88 sembra abbastanza sospetto.
flawr

È possibile salvare un altro byte utilizzando \1invece di \x, come è possibile utilizzare \def\f{\foreach\1in{90,210,330}}.
Skillmon,

1
@flawr bene ... ora sono letteralmente un po 'più piccoli di 5000x5000 ... solo 90x90 ora ... riescono a malapena a distinguere i dettagli: D
Nelson

15

C, 8010 byte

Molto tempo prima, prima di SVG o EMF, dovevi occuparti di raster e, se volevi caricare subito qualcosa, dicevi prima che l'O / S fosse pronto, come una schermata di avvio di Windows, dovevi usare RLE o run-length -encoding. Questo mostro genera un file PBM usando RLE come dati. Costruisci come al solito e corri in questo modo./biohazard > biohazard.pbm .

Se dovessi includere tutti i framework necessari per generare, ad esempio il motore SVG in HTML, le librerie Java, ecc. Questa sarebbe probabilmente la soluzione autonoma più piccola , perché putsè l'unica funzione esterna ed è in genere una delle più piccolestdio.h funzioni.

Per quanto riguarda questo dettaglio:

Se si utilizzano immagini raster, è necessario prendere un parametro (o due) come input che consente di regolare la risoluzione dell'output (ad es. Larghezza / altezza).

Ho interpretato "dovrebbe" come diverso da "must", ad esempio come in RFC 2119 , quindi non ho incluso il ridimensionamento, perché per questo codice sarebbe possibile fare solo multipli dell'originale, ad es. ./biohazard 2E ciò introdurrebbe atoi, printfe altro complicazioni che toglierebbero l'attenzione principale alla presentazione.

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");}

1
Sarebbe bello spiegare come hai generato il codice.
Cœur il

Il codice genera una nuova riga dopo ogni carattere; Penso che tu abbia bisogno putchar()o simili.
marzo

@marcelm - Il formato PBM P1 va bene così!

1
Sono abbastanza sicuro che ciò significhi necessariamente per questa domanda, ma che probabilmente varrebbe la pena accettare con l'OP.
Wheat Wizard

1
Non penso che l'utilizzo debba necessariamente significare che esiste una distinzione. Questa è davvero una domanda che dovresti (o forse devi) porre al PO.
Wheat Wizard

15

TeX + Ti k Z, 234 230 226 byte

Inizialmente 5 byte in più rispetto alla risposta dello Sriotchilismo O'Zaic , ma questo dovrebbe essere corretto. È simile alla sua risposta ma salva qualche byte in più qua e là, ne ha bisogno uno in \draw[line width=8]più (nel codice sotto questo è fatto da\28](~30)to(~55); , cioè 17 byte aggiunti solo per questo) per ottenere i suggerimenti del simbolo giusto, quindi il 5 byte più lunghezza complessiva del codice.

E grazie allo Sriotchilism O'Zaic rileggo alcune delle domande e mi rendo conto che posso cambiare il colore in rosso, in modo da risparmiare ancora qualche byte:

\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 byte

Solo se a qualcuno interessa, il seguente usa un dialetto di golf basato su TeX su cui sto lavorando (non considerare stabile il codice). Il conteggio dei byte include i caratteri EOL e il carattere EOF, poiché vengono utilizzati semanticamente (EOL delimita gli argomenti dei loop). Il dialetto è abbastanza piccolo fino ad ora e presenta solo scorciatoie per le definizioni e una sintassi for-loop, tuttavia non è specificamente scritto per questa risposta, quindi non dovrebbe infrangere le regole del golf del codice. Repository per il -g.tex-package / file: 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);
}

L'output di entrambi i frammenti di codice sembra identico:

inserisci qui la descrizione dell'immagine

( troppo pigro per aggiornare l'immagine, immagina che sia rosso )


La mia risposta ora è corretta e 2 byte in meno della tua. Sono sicuro che qualcuno potrebbe probabilmente combinare alcune delle mie risposte con alcune delle tue per renderne più brevi, ma non capisco bene la tua risposta.
Wheat Wizard

@ SriotchilismO'Zaic se cambio il colore in rosso (sovrappongo alla regola che il colore può essere arbitrario), lo ottengo a 230 byte.
Skillmon,

@ SriotchilismO'Zaic e ovviamente hai salvato più di un byte nella tua risposta guardando il mio (solo dicendo).
Skillmon,

Ok, ho guardato la tua risposta e non ho capito cosa stesse facendo, quindi non credo che avrei potuto prendere molto dalla tua risposta. Ma ho cambiato il messaggio per rimuovere comunque un numero esatto, dal momento che forse ho raccolto alcune cose dalla tua risposta senza accorgermene.
Wheat Wizard

2
@ SriotchilismO'Zaic è ok. Il mio codice è influenzato dal tuo dopo tutto, attualmente provo a scrivere un pacchetto di golf di codice per trasformare TeX in un linguaggio di golf di qualche tipo. Quando l'ho finalmente pubblicata, la mia risposta sarà più breve :) (Questa non è una lingua appositamente creata per questa domanda, quindi non infrange le regole)
Skillmon

12

GLSL, 700 629 564 545 499 byte

#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.;}

Stavo giocando con Shadertoy, quindi ho provato il linguaggio di ombreggiatura GLSL. Il codice rasterizza cerchi e linee testando ogni frammento e assegna loro un valore di uno o zero. La dimensione è stata ridotta da> 1000 byte a causa dell'uso intenso di macro.

Programma Shadertoy

inserisci qui la descrizione dell'immagine


1
Benvenuti nel sito! Prima risposta ordinata!
Wheat Wizard

Non conosco la lingua, ma posso &&e posso ||giocare a golf in &e |in alcune o tutte le parti?
Kevin Cruijssen,

@KevinCruijssen È un sottoinsieme di C, quindi quelle sarebbero operazioni bit per bit. Per me il compilatore si lamenta però del tipo
Roninkoi,

1
@Roninkoi In effetti ho visto che era basato su C. In C è possibile usare |/ &invece di ||/ &&per i bool, non è vero? Non ho fatto nulla in C da molto tempo, quindi non ne sono sicuro. So che funziona in Java / C # .NET nella maggior parte dei casi. Ma solo ora noto il link Shadertoy che hai aggiunto e non sembra funzionare lì come hai già detto. Ah bene. Bella prima risposta tra l'altro! Benvenuti in CGCC.
Kevin Cruijssen,

Ho tagliato -30 byte sul codice pubblicato ma l'intestazione indica 566 byte e il codice pubblicato è 628?
PrincePolka,

12

SVG (HTML5), 434 410 321 byte

<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

Ora basato sull'SVG di @ LevelRiverSt.


1
Credo che omettere <defs>sia sicuro. Questo funziona per me su Firefox, Chrome e Edge.
Arnauld

@Arnauld Grazie, questo significa che posso sbarazzarmi anche del primo <use>!
Neil,

12

Elaborazione, 371 368 byte

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);}

Non ero sicuro che l'elaborazione dovesse essere considerata rasterizzata o meno ai fini di questa sfida. Se conta come rasterizzato, il translateescale è necessario per rendere il simbolo leggibile e sullo schermo per una determinata dimensione della finestra. Ma poiché tutti i comandi di disegno sono vettorializzati, funziona su una data scala; quindi se assumiamo che il disegno all'origine relativa sia largo circa 200 unità, i primi 43 byte possono essere eliminati.

Ciò presuppone che sia il colore di sfondo 204, 204, 204, che è il colore di sfondo predefinito durante l'elaborazione. Presuppone anche un rectModedi CORNERe un ellipseModediCENTER (valori predefiniti)

Con un'iniziale size(640, 640), lo schizzo risultante è simile al seguente:

inserisci qui la descrizione dell'immagine

Raddoppiando la scala, ho salvato 3 byte, perché .5 s vengono eliminati (anche se diversi numeri scorrono da 1 a 2 cifre).

La costruzione è simile alla soluzione TeX, disegnando nero e poi grigio in alto per "cancellare" gli spazi tra la forma.

Spiegazione:

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);
}

Sembra carino :) Penso che se raddoppi tutte le misure puoi evitare il .5!
flawr

Sì, ma ciò cambierebbe anche parte del numero di una cifra in doppia cifra, quindi non sono sicuro di come si bilanci. Se ho contato bene, sembra che risparmierebbe 2 byte. Stavo anche pensando di usare a scaleper cambiarlo solo per una parte del codice, ma non ero sicuro di dove metterlo meglio
Curtis Fenner,

oh hai ragione, non l'ho considerato.
flawr

Raddoppiando le misure per rimuovere i decimali ho salvato quasi 10 byte nella mia risposta, anche se alcuni cavi sono passati da una cifra singola a una doppia. Vale la pena provare, comunque.
BradC,

1
Ho salvato 3 byte raddoppiando la scala a cui è disegnata. @IsmaelMiguel
Curtis Fenner,

9

GLSL, 319 310 byte

#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);}

Questo può essere reso su Shadertoy .

campione

Puoi usare la simmetria nell'immagine per disegnarla con una quantità minore di forme separate.

Ecco una versione un po 'gonfiata:

#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);
}

(grazie a @Kevin Cruijssen per la rimozione di alcuni spazi bianchi non necessari)


1
È possibile rimuovere alcuni degli spazi. Quello nel tuo definire: H(y) sqrtH(y)sqrt; tutti gli spazi nelle tue dichiarazioni if: if (if(; e quelli nella tua ultima istruzione if che circonda gli 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 byte

Salvataggio di molti byte utilizzando la versione pre-minimizzata di SVG di 2 byte salvati da @ Neil
grazie a @Shaggy

Una versione compressa di questo file SVG da 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>

Provalo online! (genera solo la stringa decompressa)

Frammento dimostrativo


Questo funziona, il CodePen in Chrome Android, per 392.
Shaggy

1
@Arnauld Ho invertito la mia risposta, anche se è costato 5 byte (ho trovato un altro byte non necessario anche se nel complesso il mio punteggio è aumentato solo di 4).
Neil,

@Neil Aggiornato di conseguenza. ;)
Arnauld

Si scopre che SVG di @ LevelRiverSt è molto più piccolo!
Neil

7

Haskell , 530 491 436 435 430 420 byte

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]

Emette un file PBM.

È stato molto divertente!

Biohazard

(Ho dovuto convertire questo in PNG per caricare in imgur)

Fondamentalmente creiamo le nostre funzioni di grafica vettoriale che eseguono il rendering su un'immagine pixel per pixel rilevando se il pixel fa parte della forma. La forma è costruita come un gruppo di cerchi e linee (che si irradiano dall'origine) tenuti insieme con operazioni di base: unione, intersezione e non. I cerchi sono composti dal loro centro e da un raggio, e le linee hanno un raggio minimo, una larghezza e un angolo in quell'ordine. Rilevare l'appartenenza a un cerchio è semplice: sottraggo solo le coordinate centrali e confronto la grandezza con il raggio. La linea è leggermente più complicata: ruoto il punto dall'opposto dell'angolo per portarlo (per annullare la rotazione), quindi controllo solo se le coordinate xey rientrano nell'intervallo previsto. Il raggio minimo è quello di garantire che lo spazio maggiore alle estremità dei cerchi grandi non superi i piccoli spazi vicino al centro. Dopodiché è una semplice questione di logica booleana impostare la matematica.

EDIT: Grazie mille a @flawr per aver tolto 39 byte!

EDIT2: Grazie mille a @Christian Sievers per il decollo di 55 byte! Buona idea trasformandoli in funzioni

EDIT3: Grazie ancora a @Christian Sievers per esserti rasato un altro byte!

EDIT4: rimosso 7 byte grazie a @ H.PWiz e @Angs!

EDIT5: ho appena notato un bug! Stavo rendendo le linee due volte più spesse di quanto avrebbero dovuto essere! Mi è costato 2 byte per risolverlo (doveva dividere la larghezza per 2; avrebbe potuto regolare i valori costanti ma cambiare da 1 a 0,5 avrebbe anche un costo di 2).

EDIT6: Grazie @Angs per il decollo di altri 10 byte!


Wow, è fantastico. È raro vedere qualcuno che definisce i propri tipi nel code-golf qui :) Due domande: è necessario avere angoli negativi [-90,-210,-330]? E sarebbe possibile cambiare il <=in <?
flawr

1
Quindi l'ho provato e sono riuscito a radere qualche byte in meno
flawr

1
Oh, nel caso in cui non lo sapessi, abbiamo una chat di haskell e alcuni suggerimenti per giocare a golf in haskell .
flawr

1
Un'altra piccola modifica
flawr

1
Bello! È possibile senza tipo di dati
Christian Sievers

6

Rubino , 278 byte

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})'/>"}

Provalo online!

Genera il codice SVG di seguito, con il simbolo al 200% della scala nell'OP.

È costituito da un cerchio sul retro e dai poli in primo piano. Il rebbio è scalato -1,0,1in Xasse e ruotato multipli di 120 gradi. I casi in cui il Xridimensionamento è zero non produce alcun output, mentre -1e +1. fornire i due lati di ciascuna coppia di poli.

Si utilizza un bordo bianco largo di 2 unità attorno al polo per tagliare il cerchio posteriore, usando gli attributi strokee stroke-width. Affinché la forma interna sia per OP, le coordinate vengono spostate di 1 unità (metà della larghezza del bordo). Notare che il percorso non è deliberatamente chiuso, per sopprimere il disegno dell'ultima linea del bordo. Ciò garantisce che le due metà di ciascuna coppia di punte si uniscano.

Vengono disegnati 90 gradi del cerchio interno anziché i 60 previsti, per motivi di golf. Ciò significa che c'è una certa sovrapposizione tra le basi di ciascuna coppia di poli, ma ciò non influisce sull'aspetto della forma di output.

<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)'/>


6

PostScript , 367 359 328 271 byte

Codice (versione compressa):

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

Codice (versione non compressa):

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

Risultato (come animazione per vedere come viene disegnato):

risultato


Ottima animazione.
Dana,

2

Python 3 con pygame, 327 314 287 278 byte

(Applicato vari brutti hack per salvare 13 byte; in particolare non è più possibile memorizzare il colore ma calcolarlo al volo con -(r>25))
(Rifattorizzato per funzionare, perdere sys; hackerato matha favore delle costanti di coordinate; piccole modifiche; salvato 27 byte)
(Riscrivere le coordinate costanti in complessi trucchi matematici per ottenere (co) sinusoidali , risparmiando 9 byte)

Funzione che accetta un singolo argomento intero che rappresenta metà della larghezza / altezza dell'immagine risultante. Ad esempio f(500), creerà una finestra di 1000x1000 pixel e vi disegnerà un simbolo di rischio biologico.

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()

Versione non abbreviata:

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 chiave di questo programma consiste principalmente nello sfruttare la simmetria del punto a 3 vie del simbolo e nell'esprimere le operazioni di disegno il più scarsamente possibile. Il cuore di tutto è circles, che è un elenco di definizioni circolari, composto solo da:

  • position: quanto lontano dall'origine in metà unità di base
  • radius: il raggio del cerchio in metà unità di base
  • width: la larghezza del bordo del cerchio (verso l'interno dal cerchio esterno, 0 = riempimento)
  • color: sfruttando il fatto che pygame interpreta 0il nero e -1il bianco

Ogni operazione di disegno viene ripetuta tre volte, ruotata di 120 °. Lo smussamento degli "artigli" è fatto con un altro cerchio. I "tagli di linea" interni sono speciali perché non riuscivo a pensare a un modo più efficiente per inserirli. L ' "unità di base" definito nella specifica è raddoppiato qui quindi non ho dovuto usare .5in circlese int()in tutto il luogo per soddisfare pygame.

Risultato per python3 -c 'from biohazard import *; f(500)':

Visualizza l'output di questa risposta


1
Ottimo lavoro e benvenuto in CGCC! La descrizione dovrebbe indicare "Python 3 + pygame" quando viene utilizzata una libreria non incorporata. L'input può essere preso dallo standard input o come argomento di funzione per evitare di importare il sysmodulo, il che accorcia il codice (vedi regole ). Inoltre, questo trucco può essere applicato per evitare la necessità di importare math.
Gioele

@Joel Grazie per il feedback! Ho incluso pygame nell'intestazione e ho convertito il codice in una funzione. Per quanto riguarda math, ho refactored che a un elenco di coordinate; erano solo 3 di loro comunque. Nessun (co) seno necessario.
marzo

1
L'applicazione del trucco di cui sopra in realtà consente di risparmiare più byte rispetto all'inserimento di tutti i numeri nel codice sorgente.
Gioele

@Joel Grazie per il promemoria; prima ho scartato quell'opzione perché mi sembrava più lunga ma sembra che mi sbagliassi. Ha anche permesso alcune ulteriori ottimizzazioni.
marzo

1

Tcl / Tk - 557 byte

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

Quella versione, tuttavia, è noiosa, dato che ottieni la stessa immagine di piccole dimensioni, non importa quale. Tuttavia, soddisfa le condizioni OP per la visualizzazione sullo schermo. Ecco la versione non compressa con commento e la possibilità di specificare una dimensione aggiunta in:

# 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 .}

Siamo spiacenti, non ci sono foto (sto lavorando al telefono oggi). Produce un simbolo nero su uno sfondo arancione a rischio biologico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.