8

Кривая дракона на 1С. Занимательные алгоритмы. 1С-Антистресс программирование

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

Кривая дракона на 1С. Занимательные алгоритмы. 1С-Антистресс программирование 1с:предприятие 8, Антистресс, Программирование, Алгоритм, Кривая, Гифка, Длиннопост

&НаКлиенте

Перем Цвета, 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С можно всё. Я проверял.