Dessinez le Bio (symbole Biohazard)


66

Dessinez le symbole Biohazard dans une couleur arbitraire sur un fond distinctement coloré. Les proportions spécifiques ont été publiées dans le numéro du 27 juin 1974 du Federal Register du gouvernement des États-Unis.

Détails

  • En sortie, l'écriture dans un fichier (les formats raster et vectoriel sont autorisés) ou l'affichage à l'écran sont tous deux autorisés.

  • Vous pouvez dessiner juste la bordure ou la forme remplie.

  • Si vous utilisez des images raster, vous devez utiliser un paramètre (ou deux) comme entrée, ce qui vous permet de régler la résolution de la sortie (par exemple, largeur / hauteur).

  • L'arrière-plan doit au moins avoir la taille du cadre de sélection du symbole, mais il peut être plus grand.

  • La sortie du symbole Unicode n'est pas suffisante .

  • Les rapports exacts des distances utilisées sont donnés dans le diagramme suivant (qui était à l'origine d' ici ):

J'ai aussi essayé de faire un diagramme supplémentaire avec les mêmes mesures, ce qui est un peu plus facile à lire:

(Inspiré par un message sur 99% invisible )


2
Loophole: peut-on simplement insérer une image de 1x1 pixel dans un arrière-plan de taille variable?
John Dvorak

Je ne pense pas que ce soit le cas. Si vous définissez une résolution suffisamment grande, le symbole doit toujours apparaître. Et en tout cas , j'espère que les gens ici ont assez de bon sens pour comprendre ce que nous voulons dire :)
flawr

1
Si j'avais du temps libre, j'essaierais avec des graphiques PostScript ou tortues.
Guy Coder

1
@ SriotchilismO'Zaic La longueur est déterminée par les deux cercles: ils ont chacun un centre et un rayon donnés, de sorte que la longueur est déterminée par la taille de l'espace.
Flawr

1
C'est "E" dans le diagramme original (les croix représentent les centres des cercles) et dans celui que j'ai ajouté ci-dessous (où le rayon rejoint l'axe de symétrie). 11
Flawr

Réponses:


96

T-SQL, 442 441 426 355 349 344 octets

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

Sauvegardé plus de 70 octets en utilisant REPLACE()des mots-clés longs et en s'exécutant en tant que SQL dynamique. Voir le code post-remplacement dans la capture d'écran ci-dessous.

J'ai doublé les valeurs de coordonnées de l'exemple d'illustration et augmenté de 9 unités afin de réduire le nombre de décimales affichées.

Cela a été fait dans SQL 2017, à l'aide des fonctionnalités géospatiales introduites dans SQL 2008. De nombreuses fonctions de géométrie intégrées utiles, notamment STBuffer, me permettent de définir simplement des cercles de différentes tailles autour d'un point.

Visuel de la sortie, avec code annoté:

Symbole Biohazard dans T-SQL utilisant des fonctions géo-spatiales

Pour plus de dessins T-SQL, voir mon lapin de Pâques .

Pour plus d' applications pratiques de cette technologie en SQL, lisez cet article ou visionnez cette vidéo . SE a même un site connexe, gis.stackexchange.com .

Modifications:

  1. Enregistré 1 octet en modifiant une coordonnée de 104 à 99.
  2. Sauvegardé 15 octets en prenant l' STDifferenceun STUniondes objets, au lieu de chacun individuellement.
  3. 71 octets enregistrés en utilisant REPLACE()des mots-clés répétés, puis en s'exécutant en tant que SQL dynamique. Revert Edit 2, pour laisser plus de remplacements de STDifference.
  4. Sauvegardé de 4 octets en déplaçant le centre vers le haut de 9 unités, ce qui a changé quelques coordonnées en chiffres simples (négatifs). Cela a également libéré le chiffre 5à utiliser comme caractère de remplacement au lieu de '#', en sauvegardant 2 octets supplémentaires sur les guillemets.
  5. 5 octets sauvegardés en passant )dans la STDifferencechaîne de remplacement; merci, Nicolas!

56
Pourquoi est-ce que ça existe?
Alexander

26
@Alexander Pour les bases de données contenant ou utilisant des données géographiques, telles que des recensements de population, des études scientifiques ou même simplement des ventes clients par région géographique. Ou simplement pour dessiner des lapins et des symboles de risque biologique.
BradC

24
SQL est assez mauvais pour la seule chose à laquelle il est destiné, qui dans son bon sens voudrait aller au-delà de cela. Imaginez des interfaces graphiques écrites en SQL. J'ai besoin d'annotations, d'aspects et d'un framework de tests unitaires. Nous devons aller deeeeeper .
Alexander

24
@Alexander Comme vous le souhaitez: TSQLT
FreeMan

15
@FreeMan Oh, pour l'amour de ...
Alexander

32

Tex + Tikz, 232 octets

43 octets enregistrés en passant à tex. Merci à Phelype Oleinik

Quelques octets sauvés grâce à 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

Avec des sauts de ligne et sans \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

Explication

C'est un peu désuet, je vais le réparer quand je pourrai comprendre comment rendre les images pas énormes

Ici, je vais expliquer comment la réponse non compressée résout le problème. J'expliquerai peut-être un jour le fonctionnement de la compression Nous dessinons d’abord les grands cercles noirs:

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

entrez la description de l'image ici

Ensuite, nous traçons des lignes blanches:

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

entrez la description de l'image ici

Ensuite, nous dessinons des cercles blancs:

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

entrez la description de l'image ici

Ensuite, nous ajoutons un cercle blanc central:

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

entrez la description de l'image ici

Ensuite, nous ajoutons un anneau noir:

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

entrez la description de l'image ici

Puis on enlève des parties de l'anneau noir

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

entrez la description de l'image ici


9
Vous n'avez pas émoussé les six points extérieurs. Il devrait y avoir 4 unités d'espace blanc entre chaque paire.
Level River St

1
@LevelRiverSt Les six points extérieurs sont maintenant à 4 unités de leur partenaire.
Wheat Wizard le

2
Ces "extrémités de griffes" sont trop pointues, elles devraient consister en des segments de ligne droite parallèles aux segments provenant du cercle central. Aussi le 20.88 semble assez suspect.
Flawr

Vous pouvez enregistrer un autre octet en utilisant à la \1place de \x, comme vous pouvez ensuite utiliser \def\f{\foreach\1in{90,210,330}}.
Skillmon le

1
@flawr well ... ils sont maintenant littéralement un peu plus petits que 5000x5000 ... seulement 90x90 maintenant ... à peine peut distinguer les détails: D
Nelson

15

C, 8010 octets

Il y a bien longtemps, avant SVG ou EMF, vous deviez gérer le raster et si vous vouliez quelque chose à charger immédiatement, disons avant que le système d'exploitation ne soit prêt, comme un écran de démarrage Windows, vous deviez utiliser RLE ou run-length. -codage. Ce monstre génère un fichier PBM en utilisant RLE comme données. Construisez comme d'habitude et courez comme ça ./biohazard > biohazard.pbm.

Si vous deviez inclure tous les frameworks nécessaires à la génération, par exemple le moteur SVG en HTML, les bibliothèques Java, etc., il s'agirait probablement de la plus petite solution autonome , car putsc'est la seule fonction externe, et c'est généralement l'une des plus petites. stdio.hles fonctions.

En ce qui concerne ce détail:

Si vous utilisez des images raster, vous devez utiliser un paramètre (ou deux) comme entrée, ce qui vous permet de régler la résolution de la sortie (par exemple, largeur / hauteur).

J'ai interprété "devrait" comme différent de "must", par exemple comme dans RFC 2119 , donc je n'ai pas inclus la mise à l'échelle, car pour ce code, il ne serait possible de faire que des multiples de l'original, par exemple ./biohazard 2, qui introduirait atoi, printfet d'autres complications qui détourneraient de l’objet principal de la soumission.

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
Ce serait bien d'expliquer comment vous avez généré le code.
Cœur

Le code génère une nouvelle ligne après chaque caractère; Je pense que vous avez besoin putchar()ou similaire.
Marcel

@marcelm - Le format PBM P1 est d'accord avec ça!

1
Je suis à peu près sûr que cela devrait signifier un devoir pour cette question, mais cela mériterait probablement d'être repris par le PO.
Wheat Wizard le

1
Je ne pense pas que l'utilisation doit nécessairement signifier qu'il y a une distinction. C’est vraiment une question que vous devriez (ou peut-être devez) poser au PO.
Wheat Wizard le

15

TeX + Ti k Z, 234 230 226 octets

À l'origine, 5 octets de plus que la réponse de Sriotchilism O'Zaic , mais celle-ci devrait être correcte. Il ressemble à sa réponse mais enregistre quelques octets de plus ici et là, il lui en faut un de \draw[line width=8]plus (dans le code ci-dessous \28](~30)to(~55);, 17 octets sont ajoutés uniquement pour cela), pour que les 5 octets plus la longueur totale du code.

Et grâce au Sriotchilism O'Zaic, j'ai relu une partie de la question et je me suis rendu compte que je pouvais changer la couleur en rouge, ce qui économise à nouveau quelques octets:

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

Juste si quelqu'un s'en soucie, ce qui suit utilise un dialecte de golf basé sur le code TeX sur lequel je travaille (ne considérez pas le code comme stable). Le nombre d'octets comprend les caractères EOL et le caractère EOF, car ceux-ci sont utilisés sémantiquement (EOL délimite les arguments des boucles). Jusqu'à présent, le dialecte était assez petit et ne comportait que des raccourcis pour les définitions et une syntaxe for-loop. Cependant, il n'est pas spécifiquement écrit pour cette réponse et ne devrait donc pas enfreindre les règles du code. Référentiel pour le -g.texfichier -package /: 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 sortie des deux extraits de code semble identique:

entrez la description de l'image ici

( trop paresseux pour mettre à jour l'image, imaginez juste qu'elle soit rouge )


Ma réponse est maintenant correcte et 2 octets plus courts que le vôtre. Je suis sûr que quelqu'un pourrait probablement combiner une partie de ma réponse avec une autre de la vôtre pour en faire une plus courte, mais je ne comprends pas très bien votre réponse.
Wheat Wizard le

@ SriotchilismO'Zaic si je change la couleur en rouge (remplace la règle que la couleur peut être arbitraire), je l'obtiens à 230 octets.
Skillmon

@ SriotchilismO'Zaic et, évidemment, vous avez économisé plus d'un octet dans votre réponse en regardant la mienne (rien qu'en disant).
Skillmon

Ok, j’ai regardé ta réponse et je n’ai pas compris ce qu’elle faisait, alors je ne pense pas que j’aurais vraiment pu tirer beaucoup de ta réponse. Mais j’ai changé le message pour supprimer un nombre exact de toute façon, car j’ai peut-être tiré des choses de votre réponse sans le savoir.
Wheat Wizard le

2
@ SriotchilismO'Zaic ça va. Après tout, mon code est influencé par le vôtre. J'essaie actuellement d'écrire un package de code pour transformer TeX en langage de code pour jouer au golf. Quand je l'
aurai

12

GLSL, 700 629 564 545 499 octets

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

Je jouais avec Shadertoy, alors j’ai essayé le langage d’ombrage GLSL. Le code rastérise simplement les cercles et les lignes en testant chaque fragment et leur attribue une valeur de un ou zéro. La taille a été réduite de> 1000 octets grâce à une utilisation intensive de macros.

Programme Shadertoy

entrez la description de l'image ici


1
Bienvenue sur le site! Neat première réponse!
Wheat Wizard du

Je ne connais pas la langue, mais peut - il &&et ||être à joué au golf &et |à certaines ou toutes les parties?
Kevin Cruijssen le

@KevinCruijssen C'est un sous-ensemble de C, ce sont donc des opérations au niveau des bits. Pour moi, le compilateur se plaint cependant du type
Roninkoi

1
@Roninkoi j'ai en effet vu qu'il était basé sur C. En C, il est possible d'utiliser |/ &au lieu de ||/ &&pour bools, n'est-ce pas? Je n'ai rien fait en C depuis longtemps, donc je ne suis pas sûr. Je sais que cela fonctionne dans Java / C # .NET dans la plupart des cas. Mais je remarque seulement maintenant le lien Shadertoy que vous avez ajouté, et cela ne semble pas fonctionner comme vous l'avez déjà indiqué. Et bien. Belle première réponse d'ailleurs! Bienvenue chez CGCC.
Kevin Cruijssen le

J'ai coupé -30 octets sur le code posté mais Header sais 566 octets, et le code posté est 628?
PrincePolka

12

SVG (HTML5), 434 410 321 octets

<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

Maintenant basé sur le SVG de @ LevelRiverSt.


1
Je crois que l'omission <defs>est sans danger. Cela fonctionne pour moi sur Firefox, Chrome et Edge.
Arnauld

@Arnauld Merci, cela signifie que je peux aussi me débarrasser du premier <use>!
Neil

12

Traitement, 371 368 octets

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

Je ne savais pas trop si le traitement devait être rasterisé ou non aux fins de ce défi. Si cela compte comme un rendu raster, translateil scaleest nécessaire de rendre le symbole lisible et visible à l'écran pour une taille de fenêtre donnée. Mais, comme toutes les commandes de dessin sont vectorisées, cela fonctionne à n'importe quelle échelle. Par conséquent, si nous supposons que dessiner à l'origine relative est large d'environ 200 unités, les 43 premiers octets peuvent être supprimés.

Cela suppose que la couleur d'arrière-plan est 204, 204, 204, qui est la couleur d'arrière-plan par défaut lors du traitement. Il suppose également un rectModede CORNERet un ellipseModede CENTER(les défauts)

Avec une initiale size(640, 640), l’esquisse résultante ressemble à ceci:

entrez la description de l'image ici

En doublant l'échelle, j'ai économisé 3 octets, car les .5s sont éliminés (bien que plusieurs nombres passent de 1 à 2 chiffres).

La construction est similaire à la solution TeX, dessinant le noir puis le gris en haut pour "effacer" les espaces entre la forme.

Explication:

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

J'ai l'air bien :) Je pense que si vous doublez toutes les mesures, vous pouvez éviter le .5!
Flawr

Oui, mais cela changerait aussi le nombre à un chiffre en un chiffre à deux chiffres, donc je ne suis pas sûr de la façon dont cela se balance. Si je comptais bien, il semblerait que cela économiserait 2 octets. Je pensais aussi à l' aide d' un scalechanger pour seulement une partie du code, mais ne savais pas où au mieux le mettre
Curtis Fenner

oh tu as raison, je n'ai pas considéré cela.
Flawr

Doubler les mesures pour supprimer les décimales économisait près de 10 octets dans ma réponse, même si quelques coordonnées passaient de simples à deux chiffres. Cela vaut la peine d'essayer, de toute façon.
BradC

1
J'ai économisé 3 octets en doublant l'échelle. @IsmaelMiguel
Curtis Fenner

9

GLSL, 319 310 octets

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

Cela peut être rendu sur Shadertoy .

échantillon

Vous pouvez utiliser la symétrie de l'image pour la dessiner avec une quantité moindre de formes séparées.

Voici une version un peu gonflée:

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

(merci à @Kevin Cruijssen d'avoir supprimé certains espaces inutiles)


1
Vous pouvez supprimer certains des espaces. Celui dans votre définir: H(y) sqrtH(y)sqrt; tous les espaces de votre if-statement: if (if(; et ceux de votre dernière déclaration if entourant les ET: if (R>.10 && R<.135 && S<.095)c=1.;if(R>.10&&R<.135&&S<.095)c=1.;.
Kevin Cruijssen le

8

HTML / JS,  448 435 433  387 octets

Sauvegardé de nombreux octets en utilisant la version pré-minimisée de SVG enregistrée par @ Neil
grâce à @Shaggy

Une version compressée de ce fichier 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>

Essayez-le en ligne! (sort juste la chaîne décompressée)

Extrait de démonstration


Cela fonctionne, sur CodePen dans Chrome Android, pour 392.
Shaggy

1
@Arnauld j'ai inversé ma réponse, bien que cela ait coûté 5 octets (j'ai trouvé un autre octet inutile, donc mon score n'a augmenté que de 4).
Neil

@ Neil mise à jour en conséquence. ;)
Arnauld le

Il s'avère que le SVG de @ LevelRiverSt est beaucoup plus petit!
Neil

7

Haskell , 530 491 436 435 430 420 octets

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]

Sort un fichier PBM.

C'était très amusant!

Biohazard

(J'ai dû convertir cela en PNG pour le télécharger sur imgur)

Fondamentalement, nous créons nos propres fonctions graphiques vectorielles qui rendent une image pixel par pixel en détectant si le pixel fait partie de la forme. La forme est construite sous la forme d’un ensemble de cercles et de lignes (rayonnant depuis l’origine) associés à des opérations de base: union, intersection et non. Les cercles sont composés de leur centre et d'un rayon, et les lignes ont un rayon minimal, une largeur et un angle dans cet ordre. Détecter l'appartenance à un cercle est facile: il suffit de soustraire les coordonnées du centre et de comparer la magnitude au rayon. La ligne est légèrement plus compliquée: je fais pivoter le point de l’opposé de l’angle pour le ramener (pour annuler la rotation), puis je vérifie simplement si les coordonnées x et y se situent dans la plage attendue. Le rayon minimum est d'assurer que le plus grand espace aux extrémités les plus éloignées des grands cercles ne l'emporte pas sur les petits espaces près du centre. Après cela, la logique booléenne consiste à faire des calculs mathématiques.

EDIT: Merci beaucoup à @flawr pour avoir enlevé 39 octets!

EDIT2: Merci beaucoup à @Christian Sievers pour avoir supprimé 55 octets! Bonne idée en les transformant en fonctions

EDIT3: Merci encore à @Christian Sievers pour avoir réduit un octet!

EDIT4: Suppression de 7 octets grâce à @ H.PWiz et @Angs!

EDIT5: Je viens de remarquer un bug! Je rendais les lignes deux fois plus épaisses qu'elles étaient supposées l'être! Cela m'a coûté 2 octets pour le réparer (il fallait diviser la largeur par 2; on aurait pu ajuster les valeurs constantes, mais passer de 1 à 0,5 coûterait également 2).

EDIT6: Merci @Angs d'avoir enlevé 10 octets supplémentaires!


Wow, c'est trop cool. Il est rare de voir quelqu'un définir ses propres types dans le code-golf ici :) Deux questions: est-il nécessaire d'avoir des angles négatifs [-90,-210,-330]? Et serait-il possible de changer le <=à <?
Flawr

1
J'ai donc essayé et réussi à raser quelques octets
flawr

1
Oh, au cas où vous ne le sauriez pas, nous avons une discussion avec haskell ainsi que des astuces pour jouer au golf à haskell .
Flawr

1
Un autre petit tweak
flawr

1
Agréable! C'est possible sans type de données
Christian Sievers

6

Ruby , 278 octets

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

Essayez-le en ligne!

Génère le code SVG ci-dessous, le symbole étant à 200% de l’échelle dans le PO.

Il se compose d'un cercle à l'arrière et des branches au premier plan. La broche est mise -1,0,1à l' échelle dans l' Xaxe et tournée de multiples de 120 degrés. Les cas où la Xmise à l' échelle est zéro ne produisent aucune sortie, tandis que les -1et +1. fournir les deux côtés de chaque paire de griffes.

On utilise une bordure blanche large de 2 unités autour de la branche pour couper le cercle arrière en utilisant les attributs strokeet stroke-width. Pour que la forme interne soit conforme au PO, les coordonnées sont déplacées de 1 unité (la moitié de la largeur de la bordure.) Notez que le tracé est délibérément non fermé afin de supprimer le tracé de la dernière ligne de la bordure. Cela garantit que les deux moitiés de chaque paire de griffes se rejoignent.

Le cercle intérieur est tracé à 90 degrés au lieu des 60 prévus, pour des raisons liées au golf. Cela signifie qu'il y a un certain chevauchement entre les bases de chaque paire de griffes, mais cela n'affecte pas l'apparence de la forme de sortie.

<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 octets

Code (version compressée):

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

Code (version non compressée):

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

Résultat (sous forme d'animation pour voir comment il est dessiné):

résultat


Super animation.
dana

2

Python 3 avec pygame, 327 314 287 278 octets

(Appliqué divers hacks méchants pour sauver 13 octets, notamment plus le stockage de la couleur , mais le calcul à la volée avec -(r>25))
(Refonte à la fonction, perdre sys, piraté en mathen faveur de coordonnées constantes; petites modifications; évité 27 octets)
(Réécriture coordonnées des constantes aux astuces mathématiques complexes pour obtenir le (co) sinus , en sauvegardant 9 octets

Fonction qui prend un seul argument entier représentant la moitié de la largeur / hauteur de l'image résultante. Par exemple f(500), créera une fenêtre de 1000 x 1000 pixels et y dessinera un symbole de risque biologique.

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

Version non raccourcie:

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 clé de ce programme consiste principalement à exploiter la symétrie à trois points du symbole et à exprimer le moins possible les opérations de dessin. Le coeur de tout cela est circles, qui est une liste de définitions de cercle, consistant uniquement en:

  • position: à quelle distance de l'origine en demi unités de base
  • radius: le rayon du cercle en demi unités de base
  • width: la largeur de la bordure du cercle (vers l'intérieur depuis le cercle extérieur, 0 = remplir)
  • color: exploiter le fait que pygame s'interprète 0en noir et -1en blanc

Chaque opération de dessin est répétée trois fois, avec une rotation de 120 °. L'affaiblissement des "griffes" se fait avec un autre cercle. Les coupes de lignes à l'intérieur ont une casse spéciale car je ne pouvais pas penser à un moyen plus efficace de les y faire entrer. "L'unité de base" définie dans la spécification est doublée ici, donc je n'ai pas eu à l'utiliser .5in circleset int()partout pour satisfaire pygame.

Résultat pour python3 -c 'from biohazard import *; f(500)':

Afficher le résultat de cette réponse


1
Bon travail et bienvenue au CGCC! La description devrait indiquer "Python 3 + pygame" lorsqu'une bibliothèque non intégrée est utilisée. L'entrée peut être extraite de l'entrée standard ou en tant qu'argument de fonction pour éviter d'importer le sysmodule, ce qui raccourcit le code (voir règles ). En outre, cette astuce peut être appliquée pour éviter le besoin d'importer math.
Joel le

@ Joel Merci pour les commentaires! J'ai inclus pygame dans l'en-tête et converti le code en une fonction. En ce qui concerne math, j'ai refactoré cela en une liste de coordonnées; ce n'était que 3 d'entre eux de toute façon. Pas de (co) sinus.
Marcel

1
L'application de l'astuce mentionnée ci-dessus économise en réalité plus d'octets que de mettre tous les nombres dans le code source.
Joel le

@ Joel Merci pour le rappel; Un peu plus tôt, j'ai écarté cette option parce qu'elle semblait plus longue, mais il me semble que j'avais tort. Cela a également permis quelques optimisations supplémentaires.
Marcel

1

Tcl / Tk - 557 octets

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

Cette version, cependant, est ennuyeuse, car vous obtenez la même image de petite taille, quoi qu’il en soit. Cependant, il satisfait aux conditions de l'OP pour l'affichage à l'écran. Voici la version non compressée avec commentaire et la possibilité de spécifier une taille ajoutée dans:

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

Désolé, pas de photos (travaillant sur mon téléphone aujourd'hui). Produit un symbole noir sur un fond orange présentant un risque biologique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.