Намалюйте ☣ (Символ біологічної небезпеки)


66

Накресліть символ біологічної небезпеки довільним кольором на чітко кольоровому тлі. Конкретні пропорції були опубліковані у випуску Федерального реєстру уряду США 27 червня 1974 року .

Деталі

  • Як вихід, дозволено запис у файл (растровий та векторний формати) або відображення на екрані.

  • Можна намалювати просто облямівку або заповнену форму.

  • Якщо ви використовуєте растрові зображення, вам слід взяти параметр (або два) як вхідний, що дозволяє регулювати роздільну здатність виводу (наприклад, ширина / висота).

  • Фон повинен мати принаймні розмір обмежувального поля символу, але може бути більшим.

  • Виведення символу unicode ☣ недостатньо .

  • Точні співвідношення використаних відстаней наведені на наступній схемі (яка спочатку була тут ):

Я також спробував скласти додаткову діаграму з тими ж вимірюваннями, яку, сподіваюся, трохи легше прочитати:

(Натхненний публікацією на 99% невидимим )


2
Лазівка: чи можемо ми просто помістити 1х1 піксельне зображення у фон змінного розміру?
Джон Дворак

Я не думаю, що це так, якщо ви встановите роздільну здатність досить велику, символ все одно повинен з’являтися. І в будь-якому випадку, я сподіваюся, що у людей тут достатньо здорового глузду, щоб зрозуміти, що ми маємо на увазі :)
помилка

1
Якби у мене було часу на запас, я б спробував це з графікою PostScript або черепахою.
Гай Кодер

1
@ SriotchilismO'Zaic Довжина визначається двома колами: кожен з них має заданий центр і радіус, тому довжина визначається розміром зазору.
недолік

1
Це "E" в оригінальній діаграмі (хрести представляють центри кола), а на тій, яку я додав нижче (де радіус відповідає осі симетрії). 11
недолік

Відповіді:


96

T-SQL, 442 441 426 355 349 344 байт

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

Збережено 70+ байтів за допомогою REPLACE()довгих ключових слів і виконання як динамічного SQL. Дивіться код після заміни на скріншоті нижче.

Я подвоїв значення координат із зразкової ілюстрації та перемістив на 9 одиниць, щоб зменшити кількість відображених десяткових знаків.

Це було зроблено в SQL 2017, використовуючи геопросторові функції, введені в SQL 2008. Багато корисних вбудованих функцій геометрії, в тому числі STBuffer, що дає мені простий спосіб визначити кола різного розміру навколо точки.

Візуальний вихід, з анотованим кодом:

Символ біологічної небезпеки в T-SQL з використанням геопросторових функцій

Докладніше про малювання T-SQL див. У моєму великодньому зайчику .

Для більш практичних застосувань цієї технології в SQL прочитайте цю статтю або подивіться це відео . SE навіть має відповідний сайт, gis.stackexchange.com .

Зміни:

  1. Збережено 1 байт, змінивши координату з 104 на 99.
  2. Збережені 15 байт шляхом прийняття STDifferenceз STUnionоб'єктів, а кожен по окремо.
  3. Збережено 71 байт за допомогою REPLACE()повторних ключових слів, а потім виконати як динамічний SQL. Скасовано редагування 2, щоб залишити більше замін STDifference.
  4. Збережено 4 байти, перемістивши центр вгору на 9 одиниць, які змінили кілька координат на одиничні (негативні) цифри. Це також звільнило число, 5щоб використовувати його як замінювальний символ, а не '#'зберегти ще два байти на лапки.
  5. Збережено 5 байт, перемістившись )у STDifferenceрядок заміни; дякую, @Nicholas!

56
Чому ... це існує?
Олександр

26
@ Олександр Для баз даних, які містять або використовують географічні дані, наприклад, перепис населення або наукові дослідження, або навіть просто продажі клієнтів за географічним регіоном. Або просто для малювання зайчиків та символів біологічної небезпеки.
BradC

24
SQL досить поганий для тієї речі, для якої він призначений, і хто з розуму хотів би вийти за рамки цього. Уявіть графічні інтерфейси, записані в SQL. Мені потрібні анотації, аспекти та блок тестування. Нам потрібно пройти глибше .
Олександр

24
@Alexander Як хочеш: TSQLT
FreeMan

15
@FreeMan О, заради ...
Олександр

32

Текс + Тікз, 232 байти

43 байти збережено при переході на текс. Завдяки Феліпе Олейник

Деякі байти збереглися завдяки 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

З розривами рядків і без \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

Пояснення

Це трохи застаріло, я це виправлю, коли зможу зрозуміти, як зробити зображення не величезними

Тут я збираюся пояснити, як нестиснена відповідь вирішує проблему. Я можу в якийсь момент пояснити, як працює компресія. Спочатку ми малюємо великі чорні кола:

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

введіть тут опис зображення

Потім малюємо кілька білих ліній:

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

введіть тут опис зображення

Потім малюємо білі кружечки:

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

введіть тут опис зображення

Потім додаємо центральне біле коло:

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

введіть тут опис зображення

Потім додаємо чорний відмінок:

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

введіть тут опис зображення

Потім видаляємо частини чорного кольця

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

введіть тут опис зображення


9
Ви не притупили шість зовнішніх точок. Між кожною парою повинно бути 4 одиниці білого простору.
Рівень р. Св.

1
@LevelRiverSt Шість зовнішніх точок тепер на 4 одиниці від свого партнера.
Пшеничний майстер

2
Ці "кінчики кігтів" занадто точні, вони повинні складатися з прямих відрізків, паралельних відрізків, що йдуть від центрального кола. Також 20,88 виглядає досить підозріло.
недолік

Ви можете зберегти інший байт, використовуючи \1замість \x, як ви можете потім використовувати \def\f{\foreach\1in{90,210,330}}.
Skillmon

1
@flawr добре ... вони зараз буквально трохи менше 5000x5000 ... тільки 90x90 зараз ... ледве розберемо деталі: D
Нельсон

15

C, 8010 байт

Зворотній шлях, перед тим, як SVG або EMF, вам довелося мати справу з растровими, і якщо ви хочете щось завантажити прямо зараз, скажімо, до того, як O / S буде готовий, як екран запуску Windows, вам довелося використовувати RLE або тривалість виконання -кодування. Цей монстр виводить файл PBM, використовуючи RLE як дані. Будуйте як зазвичай і бігайте так ./biohazard > biohazard.pbm.

Якщо ви повинні включити всі рамки, необхідні для генерації, наприклад, двигун SVG в HTML, бібліотеки Java тощо, це, мабуть, буде найменшим самостійним рішенням , оскільки putsце єдина зовнішня функція, і це, як правило, одна з найменших stdio.hфункції.

Щодо цієї деталі:

Якщо ви використовуєте растрові зображення, вам слід взяти параметр (або два) як вхідний, що дозволяє регулювати роздільну здатність виводу (наприклад, ширина / висота).

Я інтерпретував "повинен" як інакше, ніж "must", наприклад, як у RFC 2119 , тому я не включав масштабування, тому що для цього коду було б можливим робити лише кратні оригінали, наприклад, ./biohazard 2і це буде вводити atoi, printfі ін. ускладнення, які можуть зашкодити основній увазі подання.

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
Було б добре пояснити, як ви створили код.
Cœur

Код виводить новий рядок після кожного символу; Я думаю, вам потрібне putchar()чи подібне.
marcelm

@marcelm - PBM P1 формат з цим нормально!

1
Я майже впевнений, що це має означати обов'язково для цього питання, але це, мабуть, варто було б взяти до роботи з ОП.
Пшеничний майстер

1
Я не думаю, що використання обов'язково означає, що існує відмінність. Це дійсно питання, яке ви повинні (або, можливо, повинні) задати ОП.
Пшеничний майстер

15

TeX + Ti k Z, 234 230 226 байт

Спочатку на 5 байт довше, ніж відповідь Орізана Сріотчілізму О'Заїка , але це має бути правильним. Він схожий на його відповідь, але економить на кілька байт більше тут і там, йому потрібен ще один \draw[line width=8](у коді нижче це робиться \28](~30)to(~55);, це лише 17 байт додано для цього), щоб отримати підказки символу правильно, отже, 5 байт більше загальної довжини коду.

І завдяки сріотчілізму О'Заїч я перечитав кілька питань і зрозумів, що можу змінити колір на червоний, щоб знову зберегти кілька байт:

\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 байт

Якщо хтось дбає, далі використовується тестовий діалект для гольфу на основі TeX, над яким я працюю (не вважайте код стабільним). Кількість байтів включає символи EOL та символ EOF, оскільки вони семантично використовуються (EOL розмежовує аргументи циклів). Діалект на сьогоднішній день досить малий і містить лише скорочення для визначень та синтаксис for-loop, однак для цієї відповіді це спеціально не написано, тому він не повинен порушувати правила кодового гольфу. Репозиторій для -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);
}

Вихід обох фрагментів коду виглядає однаково:

введіть тут опис зображення

( занадто ліниво оновлювати зображення, просто уявіть, що воно червоне )


Зараз моя відповідь правильна і на 2 байти коротша за вашу. Я впевнений, що хтось міг би поєднати частину моєї відповіді з вашою, щоб зробити коротшу, але я не зовсім розумію вашу відповідь.
Пшеничний майстер

@ SriotchilismO'Zaic, якщо я зміню колір на червоний (перечитав правило, що колір може бути довільним), я отримую його на 230 байт.
Skillmon

@ SriotchilismO'Zaic і, очевидно, ви зберегли більше, ніж один байт, у своїй відповіді, дивлячись на мою (просто кажучи).
Skillmon

Гаразд, я переглянув вашу відповідь і не зрозумів, що це робить, тому я не думаю, що я міг би насправді дуже взяти з вашої відповіді. Але я змінив повідомлення, щоб все-таки видалити точне число, оскільки, можливо, я зібрав деякі речі з вашої відповіді, не усвідомлюючи цього.
Пшеничний майстер

2
@ SriotchilismO'Zaic це нормально. Зрештою, на мій код впливає ваш, я зараз намагаюся написати пакет для гольфу з кодом, щоб перетворити TeX на якусь мову гольфу з кодом. Коли я нарешті опублікував це, моя відповідь буде коротшою :) (Ця мова не спеціально створена для цього питання, тому вона не порушує правила)
Skillmon

12

GLSL, 700 629 564 545 499 байт

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

Я грав із Шадертоєм, тому я спробував мову затінення GLSL. Код просто розчленовує кола та рядки, випробовуючи кожен фрагмент, і присвоює їм значення одиниці або нулю. Розмір був зменшений від> 1000 байт шляхом інтенсивного використання макросів.

Програма Шадертоя

введіть тут опис зображення


1
Ласкаво просимо на сайт! Акуратна перша відповідь!
Пшеничний майстер

Я не знаю мови, але чи можна &&і ||грати в гольф в деяких місцях &чи |в них?
Кевін Круїссен

@KevinCruijssen Це підмножина C, тож це будуть побітні операції. Для мене компілятор скаржиться на тип
Ронінькой

1
@Roninkoi Я дійсно бачив, що він заснований на C. В C можна використовувати |/ &замість ||/ &&для bools, чи не так? Вже давно нічого не робив у С, тож не впевнений. Я знаю, що це працює в Java / C # .NET у більшості випадків. Але я лише зараз помічаю додане вами посилання Shadertoy, і воно, здається, не працює, як ви вже заявили. Ну добре. Приємна перша відповідь btw! Ласкаво просимо до CGCC.
Кевін Кройсейсен

Я вирізав -30 байт на розміщеному коді, але заголовка містить 566 байт, а розміщений код - 628?
PrincePolka

12

SVG (HTML5), 434 410 321 байт

<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

Тепер на основі SVG @ LevelRiverSt.


1
Я вважаю, що пропустити <defs>це безпечно. Це працює для мене на Firefox, Chrome та Edge.
Арнольд

@Arnauld Дякую, це означає, що я можу позбутися і першого <use>!
Ніл

12

Обробка, 371 368 байт

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

Я не був впевнений, чи слід Обробку вважати растрованою чи ні для цілей цього виклику. Якщо він вважає , як растрирования, то translateі scaleпотрібно зробити символ розбірливо і на екрані для заданого розміру вікна. Але, оскільки всі команди малювання векторизовані, він працює в будь-якому заданому масштабі; тож якщо ми вважаємо, що малюнок у відносному походженні шириною близько 200 одиниць є нормальним, перші 43 байти можна скинути.

Це передбачає, що колір фону 204, 204, 204є основним кольором тла при обробці. Воно також передбачає rectModeз CORNERі ellipseModeз CENTER(за замовчуванням)

З початкової size(640, 640), отриманий ескіз виглядає так:

введіть тут опис зображення

Подвоївши шкалу, я зберег 3 байти, тому що .5s усуваються (хоча декілька чисел перетікають від 1 до 2 цифр).

Конструкція схожа на рішення TeX, малюючи чорним, а потім сірим зверху, щоб «видалити» проміжки між формою.

Пояснення:

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

Чудово виглядає :) Я думаю, що якщо подвоїти всі вимірювання, то можна уникнути .5!
недолік

Так, але це також змінить частину одноцифрового числа на двоцифрове, так що я не впевнений, як це врівноважується. Якщо я порахував правильно, то, схоже, це дозволило б заощадити 2 байти. Я також думав про те, щоб використовувати його, scaleщоб змінити його лише на частину коду, але не знав, де найкраще його поставити
Кертіс Феннер

ой ти маєш рацію, я не вважав цього.
недолік

Подвійне вимірювання для вилучення десяткових знаків у моїй відповіді зберегло майже 10 байт, хоча кілька координат перейшли від одиничної до двоцифрової. Варто спробувати, все одно.
BradC

1
Я врятував 3 байти, подвоївши масштаб, на якому він намальований. @IsmaelMiguel
Кертіс Феннер

9

GLSL, 319 310 байт

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

Це можна зробити на Шадертої .

зразок

Ви можете використовувати симетричність на зображенні, щоб намалювати її меншою кількістю окремих фігур.

Ось дещо завищена версія:

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

(спасибі @Kevin Cruijssen за те, що він видалив зайвий пробіл)


1
Ви можете видалити деякі пробіли. Визначте: H(y) sqrtH(y)sqrt; всі пробіли у ваших if-операторах: if (if(; і ті, що містяться у вашому останньому викладі if, що стосується AND: if (R>.10 && R<.135 && S<.095)c=1.;if(R>.10&&R<.135&&S<.095)c=1.;.
Кевін Кройсейсен

8

HTML / JS,  448 435 433  387 байт

Збережено багато байтів, використовуючи попередньо мінімізовану версію SVG, збережену 2 байти @ Neil
завдяки @Shaggy

Стиснута версія цього файлу SVG з 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>

Спробуйте в Інтернеті! (просто виводить декомпресований рядок)

Демонстраційний фрагмент


Це працює на CodePen в Chrome Android для 392.
Shaggy

1
@Arnauld Я перевернув свою відповідь, хоча коштував 5 байтів (я знайшов ще один непотрібний байт, хоча в цілому моя оцінка зросла лише на 4).
Ніл

@Neil Оновлено відповідно. ;)
Арнольд

Виявляється, SVG @ LevelRiverSt набагато менший!
Ніл

7

Haskell , 530 491 436 435 430 420 байт

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]

Виводить файл PBM.

Це було дуже весело!

Біологічна небезпека

(Мені довелося перетворити це в PNG, щоб завантажити його в imgur)

В основному ми створюємо власні функції векторної графіки, які перетворюють на зображення піксель за пікселем, виявляючи, чи є піксель частиною форми. Форма побудована як купа кіл і ліній (випромінюють від початку), що проводяться разом з основними заданими операціями: об'єднанням, перетином та не. Кола складаються з їх центру та радіуса, а лінії мають мінімальний радіус, ширину та кут у такому порядку. Виявити членство в колі легко: я просто віднімаю центральні координати і порівнюю величину з радіусом. Лінія трохи складніша: я обертаю точку протилежно куту, щоб привести її (щоб звести нанівець обертання), тоді я просто перевіряю, чи не відповідають координати x і y в очікуваному діапазоні. Мінімальний радіус полягає в тому, щоб більший зазор на дальших кінцях великих кіл не перекривав невеликі зазори біля центру. Після цього просту справу булевої логіки зробити задану математику.

EDIT: Дякую @flawr за те, що він зняв 39 байт!

EDIT2: Дякую @Christian Sievers за зняття 55 байт! Гарна ідея, що робить їх функціями

EDIT3: Ще раз дякую @Christian Sievers за те, що поголив ще один байт!

EDIT4: Зняв 7 байт завдяки @ H.PWiz та @Angs!

EDIT5: Щойно помітив помилку! Я виводив лінії вдвічі товщі, ніж вони повинні були бути! Коштувати мені 2 байти, щоб виправити це (довелося розділити ширину на 2; можна було відрегулювати постійні значення, але зміна 1 на 0,5 також коштувала б 2).

EDIT6: Дякую @Angs за зняття ще 10 байт!


Ого, це так круто. Тут рідко можна зустріти когось, що визначає власні типи в коді-гольфі :) Два питання: чи потрібно мати негативні кути [-90,-210,-330]? І чи можна було б змінити <=на <?
недолік

1
Тож я спробував це, і мені вдалося поголити кілька байтів
помилка

1
О, якщо ви цього не знали, ми маємо чат з хешкелом , а також кілька порад щодо гольфу в хаскелл .
недолік

1
Ще один невеликий
твіт

1
Приємно! Можна без типу даних
Christian Sievers

6

Рубін , 278 байт

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

Спробуйте в Інтернеті!

Згенерує SVG-код нижче, при цьому символ знаходиться на 200% від шкали в ОП.

Він складається з кола ззаду та зубців на передньому плані. Зубчик масштабується -1,0,1по Xосі і обертається через кратні 120 градусів. Випадки, коли Xмасштабування дорівнює нулю, не дають результату, тоді як -1і +1. передбачте дві сторони кожної пари зубців.

Використовується 2-одинична біла рамка навколо зубця для вирізання заднього кола, використовуючи атрибути strokeта stroke-width. Для того, щоб внутрішня форма була по ОП, координати переміщуються на 1 одиницю (половину ширини межі.) Зверніть увагу, що шлях навмисно не закритий, щоб придушити малюнок кінцевої лінії кордону. Це забезпечує з’єднання двох половинок кожної пари зубців.

90 градусів внутрішнього кола намальовані, а не очікувані 60, з міркувань гольфу. Це означає, що між основами кожної пари зубців є певне перекриття, але це не впливає на появу вихідної форми.

<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 байт

Код (стисла версія):

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

Код (нестиснена версія):

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

Результат (як анімація, щоб побачити, як він намальований):

результат


Чудова анімація.
дата

2

Python 3 з пігамою, 327 314 287 278 байт

(Застосовували різні неприємні хаки, щоб зберегти 13 байт; головне, більше не зберігаючи колір, а обчислюючи його на льоту за допомогою -(r>25))
(Відновлено функціонування, втрачаючи sys; вирвано mathна користь констант координат; невеликі налаштування; збережено 27 байт)
(Переписати координату константи до складних математичних хитрощів, щоб отримати (ко) синус , заощаджуючи 9 байт)

Функція, яка приймає єдиний цілий аргумент, що представляє половину ширини / висоти отриманого зображення. Наприклад f(500), створить вікно 1000x1000 пікселів і намалює в ньому символ біологічної небезпеки.

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

Нескорочена версія:

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

Ключовим моментом цієї програми є в основному використання 3-х точкової симетрії символу та висловлення операцій з малюванням максимально рідко. Основою усього circlesцього є перелік визначень кола, що складається саме з:

  • position: як далеко назовні від початку в половині базових одиниць
  • radius: радіус кола в половині основних одиниць
  • width: ширина межі кола (всередину від зовнішнього кола, 0 = заливка)
  • color: експлуатація того факту, що пігама інтерпретується 0як чорний і -1як білий

Кожна операція малювання повторюється три рази, повертається на 120 °. Притуплення «кігтів» робиться іншим колом. Внутрішні "розрізи ліній" є спеціальними, тому що я не міг придумати більш ефективного способу потрапити їх туди. «Основна одиниця» визначена в специфікації подвоюється тут , так що я не повинен використовувати .5в circlesі int()всюди , щоб задовольнити Pygame.

Результат для python3 -c 'from biohazard import *; f(500)':

Показати вихід цієї відповіді


1
Гарна робота та ласкаво просимо до CGCC! В описі має бути написано "Python 3 + pygame", коли використовується небудована бібліотека. Вхід можна взяти зі стандартного вводу або як аргумент функції, щоб уникнути імпорту sysмодуля, що скорочує код (див. Правила ). Також цей трюк можна застосувати, щоб уникнути необхідності в імпорті math.
Джоель

@Joel Дякую за відгук! Я включив пігаме в заголовок і перетворив код у функцію. Що стосується math, я відновив це до списку координат; це було лише 3 з них все одно. Ніяких (ко) синусів не потрібно.
marcelm

1
Застосування вищезгаданого трюку фактично економить більше байтів, ніж введення всіх чисел у вихідний код.
Джоель

@Joel Дякую за нагадування; раніше я відкинув цей варіант, тому що він здався довшим, але, схоже, я помилявся. Це також дозволило зробити ще кілька оптимізацій.
marcelm

1

Tcl / Tk - 557 байт

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

Ця версія, однак, нудна, оскільки ви отримуєте однакове зображення невеликого розміру, незважаючи ні на що. Однак він відповідає умовам OP для відображення на екрані. Ось нестиснута версія з коментарями та можливістю вказувати розмір, доданий у:

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

Вибачте, жодних фотографій (сьогодні працюю над моїм телефоном). З'являється чорний символ на помаранчевому тлі біологічної небезпеки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.