Кривая дракона на 1С. Занимательные алгоритмы. 1С-Антистресс программирование
По мотивам статьи на хабре "Реверс-инжиниринг 128-битного дракона".
Программа рисует кривую дракона, вид фрактальной кривой.
Конкретный данный вариант алгоритма известен тем, что энтузиаст смог уместить его в исполнимый файл под MS-DOS размером всего 16 байт.

&НаКлиенте
Перем Цвета, X, Y, counter, flag, МасштабВывода;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Цвета = Новый Массив;
Цвета.Добавить(Новый Цвет(0, 0, 0));
Цвета.Добавить(Новый Цвет(0, 0, 128));
Цвета.Добавить(Новый Цвет(0, 128, 0));
Цвета.Добавить(Новый Цвет(0, 128, 128));
Цвета.Добавить(Новый Цвет(128, 0, 0));
Цвета.Добавить(Новый Цвет(128, 0, 128));
Цвета.Добавить(Новый Цвет(128, 128, 0));
Цвета.Добавить(Новый Цвет(192, 192, 192));
Цвета.Добавить(Новый Цвет(128, 128, 128));
Цвета.Добавить(Новый Цвет(0, 0, 255));
Цвета.Добавить(Новый Цвет(0, 255, 0));
Цвета.Добавить(Новый Цвет(0, 255, 255));
Цвета.Добавить(Новый Цвет(255, 0, 0));
Цвета.Добавить(Новый Цвет(255, 0, 255));
Цвета.Добавить(Новый Цвет(255, 255, 0));
Цвета.Добавить(Новый Цвет(255, 255, 255));
ШиринаХолста = 900;
ВысотаХолста = 700;
МасштабВывода = 0.25;
Холст.Область(, 1,, ШиринаХолста*МасштабВывода).ШиринаКолонки = 0.5;
Холст.Область(1,, ВысотаХолста*МасштабВывода).ВысотаСтроки = 2.75;
Холст.Область(1, 1, ВысотаХолста*МасштабВывода, ШиринаХолста*МасштабВывода).ЦветФона = Новый Цвет(0, 0, 0);
X = 255;
Y = 0;
counter = 16;
flag = false;
КонецПроцедуры
&НаКлиенте
Процедура ШагРисованияДракона()
Для Сч = 1 По 5000 Цикл
if (flag) then
counter = counter + 17;
else
counter = counter + 16;
endif;
flag = counter > 255;
counter = counter % 256;
if (flag) then
Y = Y - (X + 1);
else
Y = Y - X;
endif;
flag = (Y % 2 <> 0);
Y = Цел(Y / 2);
if (flag) then
Y = Y + 256;
endif;
if (X < 0 and Y < 0) then
flag = true;
elsif (X >= 0 and Y >= 0) then
flag = false;
else
flag = Макс(X, Y) >= АБС(Мин(X, Y));
endif;
X = Y + X;
putPixel(X, Y, counter);
КонецЦикла;
ПодключитьОбработчикОжидания("ШагРисованияДракона", 0.5, Истина);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция АБС(Икс)
Если Икс >= 0 Тогда
Возврат Икс;
Иначе
Возврат -Икс;
КонецЕсли;
КонецФункции
&НаКлиенте
Функция putPixel(x, y, colorIndex)
Цвет = Цвета[colorIndex % 15];
Холст.Область((y+351)*МасштабВывода, (x+201)*МасштабВывода).ЦветФона = Цвет;
КонецФункции
&НаКлиенте
Процедура НарисоватьДракона(Команда)
ШагРисованияДракона();
КонецПроцедуры
&НаКлиенте
Процедура Останов(Команда)
ОтключитьОбработчикОжидания("ШагРисованияДракона");
КонецПроцедуры
1C:Предприятие 8
385 постов4.1K подписчиков
Правила сообщества
В 1С можно всё. Я проверял.