Генерируемая ASCII-графика в 1С::Журнал СА 9.2018
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
О журнале
Журнал «БИТ»
Информация для ВАК
Звезды «СА»
Подписка
Где купить
Авторам
Рекламодателям
Магазин
Архив номеров
Вакансии
Игры
Контакты
   

  Опросы

Какие курсы вы бы выбрали для себя?  

Очные
Онлайновые
Платные
Бесплатные
Я и так все знаю

 Читать далее...

1001 и 1 книга  
13.03.2019г.
Просмотров: 78
Комментарии: 0
DevOps для ИТ-менеджеров

 Читать далее...

13.03.2019г.
Просмотров: 82
Комментарии: 0
Запуск и масштабирование DevOps на предприятии

 Читать далее...

13.03.2019г.
Просмотров: 66
Комментарии: 0
Kubernetes в действии

 Читать далее...

13.03.2019г.
Просмотров: 61
Комментарии: 0
Внедрение Splunk 7

 Читать далее...

24.12.2018г.
Просмотров: 1120
Комментарии: 0
Python. Разработка на основе тестирования

 Читать далее...

Друзья сайта  

Форум системных администраторов  

sysadmins.ru

 Генерируемая ASCII-графика в 1С

Архив номеров / 2018 / Выпуск №9 (190) / Генерируемая ASCII-графика в 1С

Рубрика: Разработка /  Изучаем «1С»   | Дополнительные материалы

Кирилл Ткаченко КИРИЛЛ ТКАЧЕНКО, инженер 1-й кат., ФГАОУ ВО «Севастопольский государственный университет», tkachenkokirillstanislavovich@gmail.com

Генерируемая ASCII-графика в 1С

Рассматривается программа на языке 1С, позволяющая генерировать ASCII-изображение известного религиозного символа. Приводятся алгоритм, исходный код, результаты работы

Генерируемая ASCII-графика в 1СИзучение алгоритмических языков программирования должно начинаться с наиболее простых примеров. В частности, необходимо уделить особое внимание базовым элементам языка, таким как операторы цикла и условные операторы. Безих знания во многих случаях невозможно будет правильно и полноценно программировать. Поэтому кажется разумным уделить особое внимание им. Необходимо совместить как рассмотрение указанных операторов, так и манипулирование графикой в текстовом режиме, для которой стоит продолжить рассмотрение.

Одним из видов современного искусства является ASCII-графика [1]. В основном ASCII-графика играет вспомогательную, оформительскую, служебную роль. Несомненным ее преимуществом является возможность применения такой графики без наличия графических средств отображения информации. Например, построение изображений для сохранения их в текстовые файлы и вывода на печать. Для примера такого изображения можно выполнить текстовую генерацию религиозного символа, известного под названием Инь и Ян [2].

Генерация начнется с описания функциональных соотношений, которые ограничивают окружности, входящие в этот символ. Всего в символ входит пять окружностей, которые изображены на рис. 1.

Рисунок 1. Иллюстрация для формул

Рисунок 1. Иллюстрация для формул

Стоит отметить, что в отличие от общепринятой декартовой системы координат на рис. 1 и далее для удобства компьютерных расчетов предполагается, что условно верхняя полуось y содержит отрицательные величины (y < 0), в то же самое время нижняя – положительные (y > 0).

Также в дальнейшем полагается, что рисунок генерируется на некотором двумерном текстовом поле, ячейки которого имеют целочисленные координаты (xy).

Согласно [3] уравнение окружности с центром в точке (x0,y0) и радиусом R имеет вид:

(1)

На основании (1), чтобы определить принадлежность точки окружности и кругу с центром в точке (x0,y0) и радиусом R необходима истинность выражения:

(2)

Наибольшая окружность получает номер 1, средние – 2 и 3, наименьшие – 4 и 5. Из рис. 1 следует, что для всех окружностей координаты x одинаковы:

(3)

С другой стороны, координаты y разнятся:

(4)

Очевидно, что радиусы окружностей равны, соответственно:

(5)

Удобно ввести формулу по (2) для определения принадлежности точки окружности и кругу с центром в точке (x0,y0) и радиусом R:

(6)

На основании (1)-(6) можно определить цвет ячейки двумерного текстового поля с координатами (xy):

ЦветЯчейки ← Если ПринадлежитКругу(x,y,x04,y04,R4) Тогда ЧЕРНЫЙ
ИначеЕсли ПринадлежитКругу(x,y,x05,y05,R5) Тогда БЕЛЫЙ
ИначеЕсли ПринадлежитКругу(x,y,x01,y01,R1) Тогда
    Если ПринадлежитКругу(x,y,x02,y02,R2) Тогда БЕЛЫЙ
    ИначеЕсли ПринадлежитКругу(x,y,x03,y03,R3) Тогда ЧЕРНЫЙ
    ИначеЕсли x<0 Тогда БЕЛЫЙ
    Иначе ЧЕРНЫЙ
    КонецЕсли
Иначе ПУСТО
КонецЕсли

Подставив в этот алгоритм значения (3)-(5), получаем:

ЦветЯчейки ← Если ПринадлежитКругу(x,y,0,yI,RII) Тогда ЧЕРНЫЙ
ИначеЕсли ПринадлежитКругу(x,y,0,yI,RII) Тогда БЕЛЫЙ
ИначеЕсли ПринадлежитКругу(x,y,0,0,R) Тогда
    Если ПринадлежитКругу(x,y,0,yI,RI) Тогда БЕЛЫЙ
    ИначеЕсли ПринадлежитКругу(x,y,0,yI,RI) Тогда ЧЕРНЫЙ
    ИначеЕсли x<0 Тогда БЕЛЫЙ
    Иначе ЧЕРНЫЙ
    КонецЕсли
Иначе ПУСТО
КонецЕсли

По этому алгоритму уже возможно формировать ячейки двумерного текстового поля и, соответственно, приступить к написанию программы, которая для выполнения расчетов будет располагаться в модуле управляемого приложения.

Вначале определяется служебная функция, которая возвращает квадрат аргумента:

Функция КвадратЧисла(x)
    Возврат x * x;
КонецФункции

Затем определяется функция, определяющая принадлежность точки с координатами (xy) окружности и кругу с центром в точке (x0,y0) и радиусом Радиус:

Функция ПринадлежитКругу(x, y, x0, y0, Радиус)
    Возврат КвадратЧисла(x – x0) + КвадратЧисла(y – y0) <= КвадратЧисла(Радиус);
КонецФункции

Расчет ведется по формулам (2), (6).

Непосредственное построение ASCII-рисунка происходит в функции ИньЯн. Единственный аргумент этой функции – Радиус – это радиус большой окружности. Функция начинается с определения переменных:

Функция ИньЯн(Радиус)
    Перем ЦВЕТ_БЕЛЫЙ, ЦВЕТ_ЧЕРНЫЙ, ЦВЕТ_ПУСТО;
    Перем x, y;
    Перем РадI, РадII;
    Перем yI, yII;
    Перем x2;
    Перем Рез;

В переменных ЦВЕТ_БЕЛЫЙЦВЕТ_ЧЕРНЫЙЦВЕТ_ПУСТО сохраняются символы, которые будут в результирующей строке играть роль цветной точки.

Переменные x и y – это счетчики циклов, указывающих координаты на поле рисунка.

Для хранения результатов целочисленного деления величины радиуса на 2 и на 6 служат РадI и РадII.

Центры средних и малых окружностей размещаются в yI и yII.

Результат целочисленного уменьшения координаты x в два раза помещается в x2.

Наконец, строка с ASCII-картинкой помещается в Рез.

Устанавливаются символы, соответствующие цветам ячейки:

    ЦВЕТ_БЕЛЫЙ = ".";
    ЦВЕТ_ЧЕРНЫЙ = "o";
    ЦВЕТ_ПУСТО = " ";

Рассчитываются радиусы средних и малых окружностей:

    РадI = Цел(Радиус / 2);
    РадII = Цел(Радиус / 6);

Определяются координаты y центров средних и малых окружностей:

    yI = -РадI;
    yII = РадI;

Результирующая выходная строка пуста:

    Рез = "";

По всем координатам y, которые могут принадлежать большей окружности и кругу:

    Для y = -Радиус По Радиус Цикл

По всем координатам y, которые могут принадлежать большей окружности и кругу, причем применяется масштабирование для учета распространенных соотношений сторон символов:

	Для x = -2 * Радиус По 2 * Радиус Цикл

Масштабирование отменяется:

	    x2 = Цел(x / 2);

Если точка принадлежит малому верхнему кругу, то устанавливается черный цвет:

	    Если ПринадлежитКругу(x2, y, 0, yI, РадII) Тогда
		Рез = Рез + ЦВЕТ_ЧЕРНЫЙ;

Если точка принадлежит малому нижнему кругу, то устанавливается белый цвет:

	    ИначеЕсли ПринадлежитКругу(x2, y, 0, yII, РадII) Тогда
		Рез = Рез + ЦВЕТ_БЕЛЫЙ;

Если точка принадлежит большому кругу:

	    ИначеЕсли ПринадлежитКругу(x2, y, 0, 0, Радиус) Тогда

И при этом принадлежит верхнему среднему кругу, то устанавливается белый цвет:

		Если ПринадлежитКругу(x2, y, 0, yI, РадI) Тогда
		    Рез = Рез + ЦВЕТ_БЕЛЫЙ;

И при этом принадлежит нижнему среднему кругу, то устанавливается черный цвет:

		ИначеЕсли ПринадлежитКругу(x2, y, 0, yII, РадI) Тогда
		    Рез = Рез + ЦВЕТ_ЧЕРНЫЙ;

Если же находится слева, то цвет нужно выставлять белый:

		ИначеЕсли x < 0 Тогда
		    Рез = Рез + ЦВЕТ_БЕЛЫЙ;

Если находится справа, то цвет черный:

		Иначе
		    Рез = Рез + ЦВЕТ_ЧЕРНЫЙ;
		КонецЕсли;

Иначе к результирующей строке добавляется символ пустой ячейки:

	    Иначе
		Рез = Рез + ЦВЕТ_ПУСТО;
	    КонецЕсли;

Внутренний цикл повторяется:

	КонецЦикла;

К результирующей строке добавляется терминатор и повторяется внешний цикл:

	Рез = Рез + ""
	    "";
    КонецЦикла;

Результат возвращается и функция завершается:

    Возврат Рез;
КонецФункции

Пользователю сообщаются результаты расчетов ASCII-рисунков для радиусов 8 и 16:

Сообщить(ИньЯн(8));
Сообщить(ИньЯн(16));

Схема соответствующего программе алгоритма приводится на рис. 2.

Рисунок 2. Схема алгоритма

Рисунок 2. Схема алгоритма

Полный текст программы доступен на сайте журнала http://samag.ru.

Результаты работы – см. рис. 3.

Рисунок 3. Результаты работы программы

Рисунок 3. Результаты работы программы

Полученные алгоритм и программа позволят глубже взглянуть на простейшие, элементарные управляющие конструкции языка 1С. Многократное повторение и использование этих важных конструкций позволит закрепить знание основ языка 1С.

  1. ASCII-графика // Википедия. URL: https://ru.wikipedia.org/wiki/ASCII-графика (дата обращения: 01.06.2018).
  2. Yin and yang // Rosetta Code. URL: http://rosettacode.org/wiki/Yin_and_yang (дата обращения: 26.05.2018).
  3. Окружность // Википедия. URL: https://ru.wikipedia.org/wiki/Окружность (дата обращения: 07.06.2018).

Ключевые слова: 1С, ASCII.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru