Графическое программирование

Возможности 12.06.2019
Возможности

Визуальное программирование - способ создания программы для ЭВМ путём манипулирования графическими объектами вместо написания её текста. Визуальное программирование часто представляют как следующий этап развития текстовых языков программирования. Наглядным примером может служить утилита Визуальный Pascal или Microsoft Visual Studio , где редактируются графические объекты и одновременно отображается соответствующий текст программы. В последнее время визуальному программированию стали уделять больше внимания - в связи с развитием мобильных сенсорных устройств (КПК, планшеты). Визуальное программирование в основном используется для создания программ с графическим интерфейсом для операционных систем с графическим интерфейсом пользователя. Среда визуального программирования позволяет написать Веб-приложение для браузеров. Среда визуального программирования позволяет создать консольное приложение (программа без графического интерфейса и без вывода сообщений в консоль) для программирования микроконтроллеров, программируемых микросхем.

Необходимо различать:

  • графический язык программирования - который прежде всего язык программирования (со своим синтаксисом)
  • визуальные средства разработки - как правило, под ними подразумевают средства проектирования интерфейсов или какую либо CASE -систему для быстрой разработки приложений или SCADA -систему.

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

  • языки на основе объектов, когда визуальная среда программирования предоставляет графические или символьные элементы, которыми можно манипулировать интерактивным образом в соответствии с некоторыми правилами;
  • языки, в интегрированной среде разработки которых на этапе проектирования интерфейса применяются формы, с возможностью настройки их свойств. Примеры: Delphi и C++ Builder фирмы Borland , С# , MS Access , C++ посредством использования wxSmith в составе свободной кроссплатформенной среды разработки Code::Blocks .
  • языки схем, основанные на идее «фигур и линий», где фигуры (прямоугольники, овалы и т. п.) рассматриваются как субъекты и соединяются линиями (стрелками, дугами и др.), которые представляют собой отношения. Пример: UML .

Графические, или визуальные, языки программирования [ | ]

  • App Inventor - Cреда визуальной разработки android-приложений, требующая от пользователя минимальных знаний программирования.
  • Sketchware - Среда визуальной разработки приложений для Android.
  • Дракон-схемы - графический язык программирования, используется для программирования в ракетно-космической технике («Буран », «Морской старт », «Тополь »). Существует бесплатный Дракон-редактор. Этот язык имеет наиболее строгое теоретическое обоснование.
  • Язык последовательных функциональных схем SFC (Sequential Function Chart) - графический язык программирования широко используется для программирования промышленных логических контроллеров PLC .
  • HiAsm - это язык и среда разработки приложений, которая позволяет создавать приложения, управляя их моделью с помощью интуитивно понятного графического интерфейса HiAsm .
  • В SFC программа описывается в виде схематической последовательности шагов, объединённых переходами.
  • - язык релейно-контактных схем.
  • FBD - язык Функциональных блоковых диаграмм.
  • Язык CFC (Continuous Flow Chart) - ещё один высокоуровневый язык графического программирования. CFC - это дальнейшее развития языка FBD. CFC был специально создан для проектирования систем управления непрерывными технологическими процессами.
  • Язык «G» системы LabVIEW - один из самых распространенных языков разработки программ, работающих с некомпьютерным оборудованием.
  • VisSim - это визуальный язык программирования предназначенный для моделирования динамических систем , а также проектирования, базирующегося на моделях, для встроенных микропроцессоров .
  • Скретч - это визуальная объектно-ориентированная среда и язык программирования для обучения школьников младших и средних классов.
  • Блокли - это библиотека для создания среды визуального программирования, которая может быть встроена в произвольное веб-приложение.
  • Кибор - Интегрированная среда создания бот программ автоматизации. Обладает визуальным инструментом для построения программ с помощью блок схем. Для визуального программирования требуется минимум навыков программирования.
  • Verge3D Puzzles - основанный на Блокли фреймворк для программирования интерактивных 3D-приложений, работающих в браузере.

Программирование. Графика Pascal-Паскаль

    Формирование изображения на экране

    Работа с графикой в Паскале

    Константы, определяющие графический режим

    Некоторые процедуры для работы с графикой

Основные понятия графики

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

Пример растра и изображения, построенного на нем:

На рисунке вы видите сильно увеличенную картинку, на самом же деле элементарные точки , из которых состоит изображение, или пиксели , должны быть очень маленькими, чтобы глаз воспринимал картинку как единое целое. Пиксель (Pixel ) – сокращение от Picture Element (элемент рисунка).

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

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

Итак, на растровом устройстве отображения любая фигура состоит из множества точек пикселей. Естественно, положение каждой точки изображения задано координатами X и Y. Координаты – целые числа, они задают номера колонки и строки растра и не зависят от физического размера экрана. Оси координат направлены следующим образом: горизонтальная ось X направлена слева направо; вертикальная ось Y направлена сверху вниз; верхний левый угол имеет координаты (0,0).

Очевидно, что запись изображения требует хранения информации о положении множества точек, для каждой из которых должен быть задан цвет. Цветное изображение получается смешиванием трех основных цветов – красного, зеленого и синего. Такая модель представления цвета называется моделью RGB (Red - Green - Blue). Управляя интенсивностью компонентов, можно получить различные оттенки и степени интенсивности цвета. В частности, для получения градаций серого надо взять интенсивности трех основных цветов равными друг другу.

В современных SVGA мониторах предусмотрено, как правило, по 2 6 =64 уровня интенсивности каждого из основных цветов, таким образом, в целом можно получить (2 6) 3 =262144 цвета. Для представления большего числа цветов необходим больший объем памяти. Один бит может кодировать два цвета: 1 – белый, 0 – черный. Два бита могут хранить 2*2=4 цветовых комбинации, 4 бита – 16, 8 бит – 256, 16 бит – 65536, 32 бита – 4294967296.

Если для каждой точки задавать уровни красного, зеленого и синего цветов, то потребуется достаточно большой объем памяти для хранения информации об изображении. Для сокращения объема памяти используются палитры. При этом ограничиваются некоторым количеством цветов, например, 16 или 256, каждому из цветов присваивается номер (соответственно, от 0 до 15 или от 0 до 255), и при записи изображения используют именно этот код. «Точка цвета номер 5». Информация о палитре, то есть данные, сколько красного, зеленого и синего нужно взять для получения «цвета номер 5», хранится и используется отдельно от записи изображения.

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

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

Чтобы избежать указанных проблем, изобрели так называемый векторный способ кодирования изображений.

Векторный способ представления графики заключается в том, что геометрические фигуры, кривые и прямые линии, составляющие рисунок, хранятся в памяти компьютера в виде математических формул и геометрических абстракций: круг, квадрат, эллипс и т.п. Для каждого примитива существуют свои характерные параметры. Например, для отрезка – это координаты концов; для окружности – координаты центра и радиус. Т.е. размеры, кривизна, местоположение элементов изображения хранятся в виде числовых коэффициентов. Благодаря этому появляется возможность масштабировать изображения, поворачивать, подвергать любым другим геометрическим преобразованиям с помощью простых математических операций, в частности, простым умножением параметров на коэффициент масштабирования. При этом качество изображения не меняется.

Формирование изображения на экране

Из книги Румянцева Дмитрия, Монастырского Леонида «Путь программиста: Опыт созидания личности программиста». – М.: «Издательский Дом ИНФРА-М», 2000.

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

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

Видеопамять и похожа, и в то же время не похожа на RAM . Обычная память соединена с центральным процессором специальным устройством, которое называется шина данных. Не останавливаясь подробнее на конструкции шины данных, скажем лишь, что это просто пакет проводов, количество которых кратно двум. Можно сказать, что чем больше проводов в пакете, тем быстрее происходит обмен данными между процессором и памятью. Современные Pentium -машины имеют 32-разрядную шину, т.е. процессор может сразу читать 4 байта из памяти (и столько же в нее записывать). Разрядность шины данных – одно из самых узких мест в конструкции компьютера.

Видеопамять, как и любая другая память, соединена с процессором шиной данных. Но видеопамять, кроме того, подключена к специальной электронной схеме, которая на основе данных, хранящихся в видеобуфере, формирует изображение на экране. Физически экранное изображение обновляется 60 раз в секунду – с такой частотой упомянутая электронная схема осуществляет сканирование видеобуфера. Поэтому любое изменение состояния видеобуфера практически мгновенно (с точки зрения человека, смотрящего на экран) приводит к изменению изображения на экране.

Электронная схема, сканирующая видеобуфер и преобразующая двоичные числа в видеосигнал, называется адаптером видеодисплея или просто видеоадаптером .

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

Этот способ называется растровым сканированием . Изображение «рисуется» тщательно сфокусированным электронным лучом. Поток электронов «бомбардирует» экран, покрытый специальным светящимся веществом – люминофором. Места, в которые ударяются электроны, начинают фосфоресцировать. В каждой точке свечение затухает приблизительно в течение нескольких сотых долей секунды, поэтому необходимо постоянно повторять «бомбардировку» поверхности экрана. Это задача специального устройства – электронной пушки. Наводчик электронной пушки (специальное электронное устройство) рассматривает весь экран как последовательность множества линий. Он «простреливает» последовательно каждую линию – слева направо, точка за точкой.

Движение луча по экрану происходит с огромной скоростью. Чтобы изображение, которое воспринимает человек, не было мерцающим, весь цикл – от первой до последней строки – должен быть закончен за 1/60 секунды (или еще быстрее). Следовательно, за секунду происходит не менее 60 проходов луча по всему экрану, строка за строкой. Такая схема формирования изображения называется растром . После того, как луч доходит до последней точки последней строки (до правого нижнего угла экрана), он мгновенно по диагонали переносится в начало первой строки экрана (левый верхний угол), и процесс повторяется.

Формирование цветного изображения осуществляется не одним, а тремя электронными лучами (красным, зеленым и синим), перемещающимся по экрану одновременно. Три луча подсвечивают сразу три элемента экрана, расположенных на очень незначительном угловом расстоянии друг от друга, поэтому человеческий глаз воспринимает эти три элемента как одну точку. Благодаря различной интенсивности свечения каждой из трех точек и эффекту аддитивного смешения трех цветов такая составная точка может иметь любой цветовой оттенок. Качество изображения тем выше, чем меньше расстояние между двумя отдельными точками. В современных мониторах расстояние между точками не превышает 0.25–0.26 мм.

Вернемся к видеоадаптеру. Помимо всего прочего, он должен подавать специальные синхронизирующие сигналы электронной пушке для правильного формирования изображения на экране. Первый синхронизирующий сигнал – V -сигнал – подается для начала сканирования экрана; второй сигнал – H -сигнал – для начала сканирования очередной строки. Кроме того, видеоадаптер должен управлять интенсивностью сканирующего луча. Интенсивность луча может меняться при прохождении каждой растровой точки, а значит можно произвольно менять и интенсивность свечения точки.

Существует два принципиально разных способа указания интенсивности свечения пикселя.

Первый применяется в так называемых цифровых мониторах. В этом случае для каждой точки монитору подается информация об ее интенсивности в виде двоичного числа. Используя аддитивную модель, передавая два бита для каждого цвета (красный, зеленый и синий), из которых формируется цвет точки, можно получить 64 цвета (4*4*4). Однако при увеличении количества цветов нужно увеличивать и количество битов для каждого цвета (т.е. количество проводов для каждого цвета).

Поэтому конструкторы мониторов, в конце концов, отказались от цифровой схемы и пришли к аналоговой. При этой схеме сигналы V и H остаются по-прежнему цифровыми, а сигналы о трех составляющих цвета становятся аналоговыми и поступают по трем проводам. На каждом проводе поддерживается напряжение от 0 до 1 вольта с плавным переходом из одного состояния в другое. Ноль вольт на проводе указывает на отсутствие свечения, 1 вольт – на максимальное свечение. При такой схеме каждый из трех цветов условно может принимать бесконечное число оттенков. Следовательно, таким образом можно задавать десятки миллионов цветов.

Работа с графикой в Паскале

Инициализация графического режима. Множество графических процедур и функций среды программирования Pascal собраны в модуле Graph . Для подключения библиотеки графических функций и процедур необходимо подключить модуль к вашей программе строкой Uses graph ;

Взаимодействие программы и видеосистемы в графических режимах обеспечивают драйверы. Драйверы собраны в файлах, имеющих расширение BGI: CGA.BGI, EGAVGA.BGI, HERC.BGI, IBM 8514.BGI, ATT.BGI, PC 3270.BGI и др. Драйвер – это специальная программа, осуществляющая управление тем или иным техническим средством ПК. Графический драйвер управляет графическим адаптером в графическом режиме.

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

Для инициализации графического режима используется процедура:

InitGraph(var Driver, Mode: integer; Path:string);

где Driver – переменная типа integer , определяющая тип графического драйвера; Mode – переменная того же типа, задающая режим работы графического адаптера; Path – выражение типа string , содержащее путь доступа к файлу драйвера.

Таблица 1. Константы, определяющие графический режим.

Графический драйвер

Константа режима

Растр

Палитра

Число страниц

Значение

Значение

Выбор драйвера автоматически


Пример фрагмента программы, где инициализируется графический режим

Program primer ; Uses graph ; Var D , m: integer ; {переменные для установки драйвера и режима работы} Begin D:=9; M:=2; InitGraph (d , m,‘здесь нужно указать путь к драйверу EGAVGA.BGI’}

Наиболее простой способ выбора графического драйвера и режима – автоматический (detect ).

Пример фрагмента программы, где инициализируется графический режим

Program primer ; Uses graph ; Var D , m: integer ; {переменные для установки драйвера и режима работы} Begin D:= detect ; InitGraph (d , m , ‘здесь нужно указать путь к драйверу EGAVGA . BGI ’}

Проверка результата инициализации графического режима. Для проверки успешности инициализации графического режима существует функция GraphResult , которая имеет тип результата integer , в котором закодирован результат последнего обращения к графическим процедурам. Если ошибка не обнаружена, значением функции будет 0, в противном случае – отрицательное число, имеющее следующий смысл:

    GrOk =0 ; {нет ошибок}

    GrInitGraph =-1 {не инициирован графический режим}

    GrNotDetect =-2 {не определен тип драйвера}

    GrFileNotFind =-3 {не найден графический драйвер}

    GrInvalidDriver =-4 {неправильный тип драйвера}

    GrNoLoadMem =-5 {нет памяти для размещения драйвера}

    GrNoScanMem =-6 {нет памяти для просмотра областей}

    GrNoFloodMem =-7 {нет памяти для закраски областей}

    GrFontNotFound =-8 {не найден файл со шрифтом}

    GrNoFontMem =-9 {нет памяти для размещения шрифта}

    GrInvalidMode =-10 {неправильный графический режим}

    GrError =-11 {общая ошибка}

    GrIOError =-12 {ошибка ввода-вывода}

    GrInvalidFont =-13 {неправильный формат шрифта}

    GrInvalidFontNum =-14 {неправильный номер шрифта}

Завершение работы графического режима. Завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы экрана процедура CloseGraph .

Запомните! Любая программа, использующая графический режим, будет иметь одну и ту же структуру:

    определение графического драйвера;

    установка графического режима;

    инициализация графического режима;

    построения;

    закрытие графического режима .

Напишем заготовку типовой программы работы с графикой:

Пример заготовки к графическому режиму.

Program primer ; Uses graph ; Var D , m: integer: {переменные для установки драйвера, режима} Begin D:= detect; InirGraph(d,m, ‘ путь к драйверу ’); If GrapfResult =0 then {если инициализация прошла успешно} begin <описание всех ваших построений> closeGraph ; end else writeln (‘произошла ошибка при инициализации графики’); end .

Некоторые процедуры для работы с графикой

Установка цвета.

Драйвер EGAVGA . BGI позволяет использовать 16 цветов. Каждому цвету присвоен код – целое число, которое используется процедурами и функциями.

Таблица 2. Константы цветов

Имя константы

Номер цвета

Темно-синий

Темно-зеленый

Бирюзовый

Фиолетовый

Коричневый

LightGray

Светло-серый

DarkGray

Темно-серый

LightBlue

LightGreen

Светло - зеленый

LightCyan

Светло-бирюзовый

LightRed

LightMagenta

Малиновый

Цвет выводимых в графическом режиме на экран линий и символов можно задать процедурой SetColor(color: word);

аргумент которой – целое число от 0 до 15 или имя одной из приведенных выше констант.

Установка цвета действует на те линии и тексты, которые выводятся после ее вызова, но не меняет цвет линий и символов, выведенных на экран ранее. Таким образом, процедуру SetColor следует вызывать каждый раз перед выбором нового цвета. Если цвет не установлен, то используется белый цвет.

Установка цвета фона.

Чтобы установить цвет фона для всего экрана, используется процедура:

SetBkColor(color: word);

Если процедура установки цвета фона не вызвана, экран будет черным.

Установка указателя вывода

Процедура MoveTo (x,y:integer) перемещает указатель в точку с координатами x, y.

Процедура MoveRel (dx, dy: integer) перемещает указатель на dx, dy пикселей относительно последнего положения.

Функции GetX и GetY возвращают координаты x, y указателя вывода.

Установка точки

Процедура PutPixel (x, y: integer; color: word) устанавливает точку с координатами (x, y) и закрашивает ее указанным цветом color .

Функция GetPixel (x, y: integer): word возвращает значение цвета, в который окрашена точка с координатами (x, y).

Рисование линий

Процедура Line (x1, y1, x2, y2: integer) вычерчивает линию между двумя точками экрана с координатами (x1, y1) и (x2, y2).

Процедура LineTo (x, y: integer) вычерчивает линию от последнего положения указателя до точки с координатами (x, y).

Окружность, эллипс, дуга, сектор

Процедура Circle (x, y: integer; r: word) вычерчивает окружность радиуса r с центром в точке с координатами (x, y).

Процедура Arc (x, y, ugol_begin, ugol_end, r: integer) вычерчивает дугу окружности радиуса r с центром в точке с координатами (x, y). Параметры ugol_begin и ugol_end задают угловые координаты начала и конца дуги. Отсчет углов ведется против часовой стрелки. Значения угловых координат задается в градусах.

Процедура Ellips (x, y: integer; ugol_begin, ugol_end, rx, ry: word) вычерчивает эллипс или дугу эллипса с центром в точке с координатами (x, y). Параметры ugol_begin и ugol_end задают угловые координаты начала и конца дуги. Параметры rx и ry определяют горизонтальный и вертикальный радиусы эллипса.

Процедура PieSlice (x, y: integer; ugol_begin, ugol_end, r: word) вычерчивает сектор окружности радиуса r с центром в точке с координатами (x, y). Параметры ugol _begin и ugol_end

SetFillStyle (о ней чуть позже).

Процедура Sector (x, y: integer; ugol_ begin, ugol_ end, rx, ry: word) вычерчивает сектор эллипса с центром в точке с координатами (x, y) и горизонтальным радиусом rx , вертикальным - ry . Параметры ugol_begin и ugol_end задают угловые координаты начала и конца сектора.

Сектор может быть закрашен в соответствии со стилем, заданным процедурой SetFillStyle .

Прямоугольник; закрашенный прямоугольник; параллелепипед

Процедура Rectangle (x1, y1, x2, y2: integer) вычерчивает контур прямоугольника. Параметры x1, y1 задают положение левого верхнего угла, x2, y2 – правого нижнего.

Процедура Bar (x1, y1, x2, y2: integer) вычерчивает закрашенный прямоугольник. Параметры x1, y1 задают положение левого верхнего угла, x2, y2 – правого нижнего. Стиль и цвет заливки определяется процедурой SetFillStyle .

Процедура Bar3 D (x1, y1, x2, y2: integer; глубина: word; граница: boolean) вычерчивает параллелепипед. Параметры x1, y1 задают положение левого верхнего угла, x2, y2 – правого нижнего угла ближней грани. Параметр глубина задает расстояние между передней и задней гранями в пикселях. Параметр граница определяет, нужно ли вычерчивать верхнюю границу задней грани параллелепипеда. Стиль и цвет заливки ближней грани определяется процедурой SetFillStyle .

Вывод текста в графическом режиме.

Процедура OutText (text: string) выводит строку символов text от текущей позиции указателя вывода и перемещает указатель в точку, расположенную за последним выведенным символом.

Структура RAM DAC


Информация в видеобуфере хранится в байтах. Каждый байт может определять цвет одного или несколько пикселов.

Для видеобуфера , где хранятся атрибуты изображения, применяются специальные микросхемы, которые имеют 2 входных канала:

1. Для регенерации изображения (адаптер только считывает информацию);

2. Для записи изображения.

Оба канала действуют параллельно и независимо.

Функции видеоконтроллера : (формирование сигналов горизонтальной и вертикальной синхронизации, счетчик адресов видеобуфера, формирует форму и позицию курсора).

Некоторые универсальные языки программирования могут иметь стандартную поддержку графики. Например, язык Pascal имеет возможность создавать несложные графические приложения. Для программирования графики на языке Pascal существует модуль Graph, при помощи процедур которого можно рисовать изображения.

var GraphDriver,GraphMode: integer;

InitGraph(GraphDriver,GraphMode, ‘’);

<процедуры и функции для рисования>

Это было удобно при MS DOS, где основным режимом был текстовый. С появлением Windows основным режимом стал графический.

При программировании графических приложения под Windows, используя обработчик события WM_PAINT или OnPaint (последнее - если используется какой-нибудь объектный каркас для Windows-приложения), нельзя рисовать долго, поскольку программа на время его работы блокируется. А если рисовать в других обработчиках, то нарисованное стирается при следующей перерисовке окна.

С появлением языка Pascal ABC, в котором графическая библиотека подключается крайне просто, многие проблемы были решены. В этом языке графическое приложение похоже на обычную программу, в которой подключается графический модуль GraphABC и в блоке операторов после begin end можно писать графические команды.

<процедуры и функции для рисования>

По умолчанию графический экран PasсalABC содержит 640 точек по горизонтали и 400 точек по вертикали. Начало отсчета – левый верхний угол. При запуске такой программы возникает специальное графическое окно, и все рисование происходит именно на нем. Изображение на нем не пропадает при перерисовке, программа не окажется заблокированной на время рисования и можно рисовать сколь угодно долго и не сложно осуществлять анимацию.

Например, программа для рисования узора:

var x,y:integer;

for x:=0 to WindowWidth-1 do

for y:=0 to WindowHeight-1 do

SetPixel(x,y,RGB(2*x-y,x-3*y,x+y));

Например, программа цифровых часов:

uses GraphABC,Utils;



Var x0,y0:integer;

s1,s2,s3:string;

SetWindowCaption("My program");

SetWindowSize(500,100);

SetFontName("Arial");

SetFontStyle(fsBoldItalic);

SetFontSize(70);

x0:= (WindowWidth - TextWidth("00: 00: 00 ")) div 2;

y0:= (WindowHeight - TextHeight("00: 00: 00 ")) div 2;

t:= CurrentDateTime;

//s:= string.Format("{0:d2}:{1:d2}:{2:d2}",t.Hour,t.Minute,t.Second);

str(t.Hour:2,s1);

str(t.Minute:2,s2);

str(t.Second:2,s3);

TextOut(x0,y0,s1+" : "+s2+" : "+s3+" ");

Возможности модуля растровой графики GraphABC практически совпадают с графическими возможностями Borland Delphi. Процедуры и функции рисования и установки параметров рисования аналогичны методам и свойствам класса TCanvas в Delphi. Например, вместо свойства Canvas.Brush.Color используется пара: процедура SetBrushColor(color) и функция BrushColor.

Модуль GraphABC представляет собой простую графическую библиотеку и предназначен для создания несобытийных графических и анимационных программ в процедурном и частично в объектном стиле. Рисование осуществляется в специальном графическом окне, возможность рисования в нескольких окнах отсутствует. Кроме этого, в модуле GraphABC определены простейшие события мыши и клавиатуры, позволяющие создавать элементарные событийные приложения. Основная сфера использования модуля GraphABC - обучение.

Модуль GraphABC основан на графической библиотеке GDI+, но запоминает текущие перо, кисть и шрифт, что позволяет не передавать их в качестве параметров при вызове графических примитивов. К свойствам пера, кисти и шрифта можно получать доступ как в процедурном, так и в объектном стиле. Например, для доступа к цвету текущего пера используется процедура SetPenColor(c) и функция PenColor, а также свойство Pen.Color.

В модуле GraphABC можно управлять самим графическим окном и компонентом GraphABCControl, на котором осуществляется рисование. По умолчанию компонент GraphABCControl занимает всю клиентскую часть графического окна, однако, на графическое окно можно добавить элементы управления, уменьшив область, занимаемую графическим компонентом (например, так сделано в модулях Robot и Drawman).

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

Режим блокировки рисования на экране (LockDrawing) позволяет осуществлять прорисовку лишь во внеэкранном буфере, после чего с помощью метода Redraw восстанавливать все графическое окно. Данный метод используется для ускорения анимации и создания анимации без мерцания.

Модуль GraphABC содержит константы, типы, процедуры, функции и классы для рисования в графическом окне. Они подразделяются на следующие группы:

1. Графические примитивы.

2. Действия с цветом.

3. Действия с пером.

4. Действия с кистью.

5. Действия со шрифтом.

6. Действия с рисунками.

7. Действия с графическим окном.

8. Задание режимов вывода

Наиболее используемые графические процедуры и функции.

1. Управление экраном.

SetWindowWidth(w). Устанавливает ширину графическогоокна;

SetWindowHeight(h) -Устанавливает высоту графическогоокна;

2. Графические примитивы.

Точка SetPixel(x,y,color). Закрашиваетодин пиксел с координатами (x,y) цветом color. Например, SetPixel(300,200,clred).

Линии Line(x1,y1,x2,y2). Рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2). Например, line(100,50,500,250).

Процедура MoveTo(x,y). Передвигает невидимое перо к точке с координатами (x,y). Эта процедура обычно работает в паре с процедурой LineTo(x,y).

Процедура LineTo(x,y). Рисует отрезок от текущего положения пера до точки (x,y). Координаты пера при этом также становятся равными (x,y).

Прямоугольник Rectangle(x1,y1,x2,y2). Рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2). Например, Rectangle(50,50,200,200).

Процедура Polygon(А, n) строит ломаную линию по n точкам, координаты которых заданы в массиве А элементов типа Point.

Процедура Polyline(А, n) строит замкнутую ломаную линию по n точкам, координаты которых заданы в массиве А элементов типа Point.

Окружность Circle(x,y,r). Рисует окружность с центром в точке (x,y) и радиусом r. Например, Circle(500,200,100).

Дуга окружности Arc(x,y,r,a1,a2). Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки). Например, Arc(300,250,150,45,135);

3. Некоторые используемые цвета

Random(16777215) – случайный цвет из всей палитры цветов Паскаля

Функция RGB(r,g,b) возвращает целое значение, являющееся кодом цвета, который содержит r красную, g зеленую и b синюю составляющие (r, g и b – целые в диапазоне от 0 до 255, причем, 0 соответствует минимальной интенсивности, 255 – максимальной). Например, RGB(Random(255),Random(255),Random(255)), где функция Random(х) возвращает случайное целое в диапазоне от 0 до x-1.

Процедура цвет линии SetPenColor(color) устанавливает цвет пера, задаваемый параметром color. Например, setpencolor(clred).

Процедура заливка цветом FloodFill(x,y,color) заливает область одного цвета цветом color, начиная с точки (x,y). Например, Rectangle(50,50,200,200); FloodFill(100,100,clBlue)

4. Шрифты.

Процедура procedure SetFontName(name: string) устанавливает наименование шрифта.

Процедура procedure SetFontStyle(style: integer); - устанавливает стиль шрифта.

Процедура procedure SetFontSize(sizesz: integer); - устанавливает размер шрифта в пунктах.

Процедура procedure SetFontColor(color: integer); - устанавливает цвет шрифта.

Процедура procedure TextOut(x, y, s) выводит строку s в позицию (x,y). Точка (x,y) задает верхний левый угол прямоугольника, который будет содержать текст из строки s).

Например,

SetFontName("Arial");

SetFontStyle(fsBoldItalic);

SetFontSize(40);

SetFontColor(RGB(Random(255),Random(255),Random(255)));

Расширенный перечень графических процедур и функций.

Графические примитивы.

procedure SetPixel(x,y,color: integer); - закрашивает один пиксел с координатами (x,y) цветом color.

function GetPixel(x,y): integer; -возвращает текущее значение цвета для пиксела с координатами (x,y).

procedure MoveTo(x,y: integer); - передвигает невидимое перо к точке с координатами (x,y); эта функция работает в паре с функцией LineTo(x,y).

procedure LineTo(x,y: integer); - рисует отрезок от текущего положения пера до точки (x,y); координаты пера при этом также становятся равными (x,y).

procedure Line(x1,y1,x2,y2: integer); - рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2).

procedure Circle(x,y,r: integer); - рисует окружность с центром в точке (x,y) и радиусом r.

procedure Ellipse(x1,y1,x2,y2: integer); - рисует эллипс, заданный своим описанным прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2).

procedure Rectangle(x1,y1,x2,y2: integer); - рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).

procedure RoundRect(x1,y1,x2,y2,w,h: integer); - рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.

procedure Arc(x,y,r,a1,a2: integer); - рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).

procedure Pie(x,y,r,a1,a2: integer); - рисует сектор окружности, ограниченный дугой (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure Chord(x,y,r,a1,a2: integer); - рисует фигуру, ограниченную дугой окружности и отрезком, соединяющим ее концы (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure TextOut(x,y: integer; s: string); - выводит строку s в позицию (x,y) (точка (x,y) задает верхний левый угол прямоугольника, который будет содержать текст из строки s).

procedure FloodFill(x,y,color: integer); - заливает область одного цвета цветом color, начиная с точки (x,y).

procedure FillRect(x1,y1,x2,y2: integer); - заливает прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2), цветом текущей кисти.

procedure Polygon(var a; n: integer); строит ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

procedure Polyline(var a; n: integer); -строит замкнутую ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

Цветовые константы и функции для работы с цветом

Модуль GraphABC содержит константы и функции для работы с цветами. Тип ColorType, описывающий цвет, определен следующим образом:

type ColorType=integer; - стандартные цвета задаются символическими константами:

Для работы с цветами используются следующие функции.

function RGB(r,g,b: integer): ColorType; - возвращает целое значение, являющееся кодом цвета, который содержит красную, зеленую и синюю составляющие с интенсивностями r, g и b соответственно (r, g и b – целые в диапазоне от 0 до 255, причем, 0 соответствует минимальной интенсивности, 255 – максимальной).

function GetRed(color: ColorType): integer; - выделяет красную составляющую из цвета color (целое в диапазоне от 0 до 255);

function GetGreen(color: ColorType): integer; - выделяет зеленую составляющую из цвета color (целое в диапазоне от 0 до 255);

function GetBlue(color: ColorType): integer; - выделяет синюю составляющую из цвета color (целое в диапазоне от 0 до 255).

Действия с пером

function PenX: integer;

function PenY: integer; - возвращают текущие координаты пера.

procedure SetPenColor(color: integer); - устанавливает цвет пера, задаваемый параметром color.

function PenColor: integer; - возвращает текущий цвет пера.

procedure SetPenWidth(w: integer); - устанавливает ширину пера, равную w пикселам.

function PenWidth: integer; - возвращает текущую ширину пера.

procedure SetPenStyle(ps: integer); - устанавливает стиль пера, задаваемый параметром ps.

function PenStyle: integer; - возвращает текущий стиль пера.

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

psSolid Сплошная линия (установлено по умолчанию)

psDash Штриховая линия

psDot Пунктирная линия

psDashDot Штрихпунктирная линия

psDashDotDot Линия, чередующая штрих и два пунктира

psClear Отсутствие линии

procedure SetPenMode(m: integer); - устанавливает режим пера, задаваемый параметром m.

function PenMode: integer; - возвращает текущий режим пера. Режим пера определяет, как цвет пера взаимодействует с цветом поверхности.

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

pmCopy – обычный режим; при рисовании цвет поверхности заменяется цветом пера;

pmNot – режим инвертирования; при рисовании цвет поверхности инвертируется (становится негативным), а цвет пера при этом игнорируется.

Действия с кистью

procedure SetBrushColor(color: integer); - устанавливает цвет кисти, задаваемый параметром color.

function BrushColor: integer; - возвращает текущий цвет кисти.

procedure SetBrushPicture(fname: string); - устанавливает в качестве образца для закраски кистью образец, хранящийся в файле fname, при этом текущий цвет кисти при закраске игнорируется.

procedure ClearBrushPicture; - очищает рисунок-образец, выбранный для кисти.

procedure SetBrushStyle(bs: integer); - устанавливает стиль кисти, задаваемый параметром bs.

function BrushStyle: integer; - возвращает текущий стиль кисти.

Стили кисти задаются следующими именованными константами:

bsSolid bsCross bsClear bsDiagCross
bsHorizontal bsBDiagonal bsVertical bsFDiagonal

Действия со шрифтом

procedure SetFontColor(color: integer); - устанавливает цвет шрифта.

function FontColor: integer; - возвращает текущий цвет шрифта.

procedure SetFontSize(sz: integer); - устанавливает размер шрифта в пунктах.

function FontSize: integer; - возвращает текущий размер шрифта в пунктах.

procedure SetFontName(name: string); - устанавливает наименование шрифта.

function FontName: string; - возвращает текущее наименование шрифта.

По умолчанию установлен шрифт, имеющий наименование MS Sans Serif. Наиболее распространенные шрифты – это Times, Arial и Courier New. Наименование шрифта можно набирать без учета регистра.

procedure SetFontStyle(fs: integer); - устанавливает стиль шрифта.

function FontStyle: integer; - возвращает текущий стиль шрифта.

Стили шрифта задаются следующими именованными константами:

fsNormal – обычный;

fsBold – жирный;

fsItalic – наклонный;

fsBoldItalic – жирный наклонный;

fsUnderline – подчеркнутый;

fsBoldUnderline – жирный подчеркнутый;

fsItalicUnderline – наклонный подчеркнутый;

fsBoldItalicUnderline – жирный наклонный подчеркнутый.

function TextWidth(s: string): integer; - возвращает ширину строки s в пикселях при текущих настройках шрифта.

function TextHeight(s: string): integer; - возвращает высоту строки s в пикселях при текущих настройках шрифта.

Действия с графическим окном

procedure ClearWindow; - очищает графическое окно белым цветом.

procedure ClearWindow(c: ColorType); - очищает графическое окно цветом c.

function WindowWidth: integer; - возвращает ширину графического окна.

function WindowHeight: integer; - возвращает высоту графического окна.

function WindowLeft: integer; - возвращает отступ графического окна от левого края экрана.

function WindowTop: integer; - возвращает отступ графического окна от верхнего края экрана.

function WindowCaption: string; - возвращает заголовок графического окна.

procedure SetWindowWidth(w: integer); - устанавливает ширину графического окна.

procedure SetWindowHeight(h: integer); - устанавливает высоту графического окна.

procedure SetWindowLeft(l: integer); - устанавливает отступ графического окна от левого края экрана.

procedure SetWindowTop(t: integer); - устанавливает отступ графического окна от верхнего края экрана.

procedure SetWindowSize(w,h: integer); - устанавливает ширину и высоту графического окна.

procedure SetWindowPos(l,t: integer); - устанавливает отступ графического окна от левого и верхнего края экрана.

procedure SetWindowCaption(s: string); - устанавливает заголовок графического окна.

procedure SetWindowTitle(s: string); - устанавливает заголовок графического окна. Синоним SetWindowCaption.

procedure SaveWindow(fname: string); - сохраняет содержимое графического окна в файл с именем fname.

procedure LoadWindow(fname: string); - выводит в графическое окно рисунок из файла с именем fname. Файл ищется вначале в текущем каталоге, а затем в каталоге PascalABC\Media\Images.

procedure FillWindow(fname: string); - заполняет графическое окно мозаикой из рисунка, содержащегося в файле с именем fname.

procedure FillWindow(n: integer); - заполняет графическое окно мозаикой из рисунка с описателем n.

procedure CloseWindow; - закрывает графическое окно.

function ScreenWidth: integer; - возвращает ширину экрана.

function ScreenHeight: integer; - возвращает высоту экрана.

procedure CenterWindow; - центрирует графическое окно по центру экрана.

procedure MaximizeWindow; - максимизирует графическое окно на экране.

procedure NormalizeWindow; - восстанавливает положение графического окна на экране.

Все размеры устанавливаются и возвращаются в пикселах.

Задание режимов вывода

procedure SetDrawingSurface(n: integer); - устанавливает в качестве канвы для рисования рисунок с описателем n. В результате весь графический вывод осуществляется не на экран, а на рисунок; настройки кисти, пера и шрифта также осуществляются для рисунка.

procedure SetDrawingSurface(p: Picture); - устанавливает в качестве канвы для рисования рисунок с описателем n. В результате весь графический вывод осуществляется не на экран, а на рисунок; настройки кисти, пера и шрифта также осуществляются для рисунка.

procedure RestoreDrawingSurface; - устанавливает в качестве канвы для рисования графическое окно.

procedure Redraw; - осуществляет перерисовку окна вывода при заблокированном выводе в графическое окно.

procedure LockDrawing; - блокирует вывод в графическое окно, осуществляя рисование только во внеэкранном буфере. Для перерисовки графического окна требуется вызвать процедуру Redraw. Если графический вывод перенаправлен в рисунок вызовом процедуры SetDrawingSurface, то не оказывает никакого воздействия на вывод.

procedure UnlockDrawing; - снимает блокировку вывода в графическое окно.

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

procedure UnlockScreenBuffer; - снимает блокировку вывода во внеэкранный буфер графического окна.

function DrawingIsLocked: boolean; - возвращает True, если вывод в графическое окно заблокирован, и False в противном случае.

procedure SetRedrawProc(procedure RedrawProc); - устанавливает пользовательскую процедуру для перерисовки содержимого графического окна, вызываемую автоматически в тот момент, когда требуется его перерисовка. В настоящее время используется в модуле ABCObjects для автоматической перерисовки всех графических объектов и фона.

Блокировка вывода в графическое окно с последующим вызовом Redraw используется для простейшего создания анимации без мерцания.

Богатые возможности Delphi и C++ Builder легко развиваются подключением других библиотек компонентов. В настоящее время существует множество различных библиотек для этих сред программирования, начиная от библиотек визуальных компонентов до мощных библиотек математического анализа. Особенный интерес при разработке программного обеспечения исследовательского оборудования представляет библиотека Component Works, разработанная американской фирмой National Instruments. Эта библиотека функционально повторяет библиотеку инструментов других продуктов этой компании - LabWindows/CVI и LabView, существенно расширяя спектр возможностей программ, созданных на Delphi или на C++ Builder.

Таким образом, средства визуального программирования, основанные на ООП - Borland Delphi и C++ Builder, благодаря скорости разработки программ и функциональным возможностям наиболее привлекательны для использования при разработке программного обеспечения исследовательского оборудования нового поколения практически в любой его части, а особенно в части программного обеспечения высшего уровня. Использование этих средств возможно и при разработке ответственных частей программного обеспечения, таких как программное обеспечение серверов, модули работы с сетью или модули управления оборудованием благодаря как возможности использования функций API в составе программы, так и возможностью написания программы с применением только функций API.

Средства графического программирования

Средства графического программирования занимают особое место в ряду средств разработки программного обеспечения. Для разработки программы с помощью средств графического программирования кроме некоторых навыков, как правило, не надо знать языков программирования, владеть методикой программирования в среде Windows и т. д. Все программирование производится на уровне структуры и алгоритма программы.

Изначально средства графического программирования были предназначены для упрощения доступа инженеров и научных работников, не знакомых с программированием, к разработке систем автоматизации. В основном, имелось в виду программное обеспечение для управления измерительным оборудованием и обработки результатов измерений. Но постепенно развитие графических средств программирования позволило существенно расширить сферу их применения вплоть до разработки программ мониторинга и управления производством или технологическими процессами. Особого прогресса в данной области добилась фирма National Instruments. Ее продукты LabView, LookOut и BridgeView следует рассмотреть отдельно.

LookOut представляет собой систему мониторинга и управления технологическими процессами: работа в реальном времени, поддержка большого количества стандартных измерительных и управляющих устройств, несколько уровней секретности и объявления нештатных ситуаций. Программная система в LookOut строится по принципу логической схемы, что оптимально для технологического процесса и абсолютно не приемлемо для более сложных задач (например, научных исследований), так как не позволяет строить сложные алгоритмы управления различными устройствами, осуществлять серьезную математическую обработку данных и многое другое. Поэтому для разработки программного обеспечения исследовательского оборудования LookOut непригоден.

LabView функционально ничем не уступает другим продуктам National Instruments (LabWindows/CVI или Component Works). LabView содержит подобные инструменты для создания интерфейса пользователя, работы с измерительным и управляющим оборудованием, математической обработки данных, работы в сети и т. д. К LabView также можно подключать программные модули, созданные в Других средах программирования, например, C++ или LabWindows/CVI. Программирование в LabView ведется на уровне Диаграмм. Диаграммы в LabView - это схемы алгоритмов. Основные элементы "алгоритмического языка" Lab View практически повторяют основные конструкции языка программирования Си.

При наличии определенных навыков создание достаточно сложной программы на LabView занимает у разработчика времени примерно на два порядка меньше, чем разработка такой же программы, например, на C++. Однако, основу LabView составляет runtime-engine, подобный аналогичному средству в LabWindows/CVI. Но в LabView оно выполняет значительно больше задач, благодаря чему LabView является практически самой быстрой и самой надежной системой в своем классе.

Однако LabView при всей своей привлекательности предназначена для создания небольших измерительно-управляющих систем, работающих в реальном времени, и не предназначена для разработки мощных, развитых программных комплексов, а тем более системного программного обеспечения, так как для этого LabView слишком громоздкая и медленная система. При создании подобных систем LabView будет проигрывать программам, созданным на C++, как по скорости работы, так и по необходимым компьютерным ресурсам. Поэтому LabView не подходит для создания программного обеспечения исследовательского оборудования.

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

Операционные системы

Операционные системы разделяют на два основных класса: ОС общего назначения и ОС реального времени (ОС РВ), хотя в последнее время границы между ними заметно стираются - многие задачи реального времени успешно решаются современными версиями систем общего назначения.

Операционные системы общего назначения Применительно к задачам автоматизации наиболее популярны такие ОС как Windows 3.1/95/NT, HP-UX, Solaris, MacOS, UNIX. Все они являются многозадачными системами и, в основном, используются в решении задач автоматизации с централизованным управлением, когда в системе имеется конкретная управляющая ЭВМ. Для ОС общего назначения характерна единая среда, используемая как для разработки прикладных программ, так и для их исполнения. Операционные системы общего назначения по сравнению с ОС РВ дешевле, проще в использовании и отладке приложений.

Операционные системы реального времени. Основными преимуществами систем реального времени по сравнению с ОС общего назначения являются:

· гарантированное время реакции системы на запросы и прерывания от внешних устройств при возникновении непредвиденных ситуаций;

· разделение среды разработки прикладного ПО и среды его исполнения.

ОС РВ предназначены, как правило, для применения в распределенных многопроцессорных системах с децентрализованным управлением, поэтому они дороже и сложнее в использовании. Среди наиболее известных ОС РВ можно назвать следующие системы: OS-9/OS-9000, VxWorks, LynxOS, VMEexec.

Средства разработки баз и хранилищ данных

Естественные языки, хотя и интересны во многих аспектах, совершенно не подходят для описания алгоритмов. Поэтому не удивительно, что алгоритмы значительно лучше описываются на алгоритмическом языке.

Алгоритмический язык, “понятный” компьютеру, называется языком программирования высокого уровня, или просто языком программирования. В дальнейшем будем иметь в виду именно такое применение, но несколько расширим понятие и будем считать язык программирования действительно “языком

высокого уровня”, если не только компьютер, но так же и человек может понимать его по возможности эффективно и просто. Мы не будем требовать, чтобы язык был легко читаемым для всех. Математические символы непонятны большинству восьмилетних детей, но без них не могут обойтись математики и инженеры. Таким же образом и языки программирования совсем не обязательно должны быть понятными для всех, но они совершенно необходимы профессиональным программистам. Здесь мы будем применять язык Си не только потому, что он достаточно распространен, но главным образом из-за его высокого качества. Для программирования на языке Си нужно быть очень аккуратным, на языке Си логические ошибки приводят к синтаксическим ошибкам гораздо реже, чем, например, на языке Паскаль. Поэтому такие логические ошибки в программе на языке Си могут привести к неправильным результатам или к выводу сообщений о технических ошибках, которые могут оказаться совершенно непонятными. Другими словами, ошибки могут привести к непредсказуемым результатам. Это постоянно следует иметь в виду при программировании на языке Си. При написании программ всегда желательно, чтобы они были легко читаемыми, но это совершенно другой аспект. Люди, которые сами не используют этот язык, полагают, что программы на языке Си воспринимаются с трудом. Но с проблемой читаемости всегда очень сложно. Если одна строка программы на языке Си соответствует десяти строкам программы на языке Бейсик, то несерьезно утверждать, что одну строку языка Си труднее прочитать, чем десять строк языка Бейсик. Если попытаться разобраться в короткой программе на языке Си, заранее предполагая, что она простая, поскольку короткая, то можно очень быстро разочароваться. Об этом нельзя забывать при чтении примеров в этой книге: очень короткие программы на языке Си могут быть совсем не тривиальными и даже интересными!

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

(кликните для просмотра скана)

Программа содержит обращения к четырем графическим подпрограммам:

initgr инициирует графический вывод;

move перемещает перо (реальное или фиктивное) в точку с координатами ху у;

draw вычерчивает отрезок прямой линии из текущей позиции пера в точку с координатами х, у;

endgr выполняет заключительные операции по выводу оставшейся информации из выходного буфера.

В языке Си для обозначения технических терминов “процедура” или “подпрограмма” применяется термин “функция”. Обращение к функции записывается обязательно с парой круглых скобок, даже если аргументы отсутствуют. Перед обращениями к функциям move и draw обязательно должно стоять обращение к функции Аналогично вслед за последним обращением к функции move или draw должно стоять обращение к функции endgr. Обе функции, обеспечивают перемещение реального или фиктивного пера в точку с координатами х, у причем при работе функции перо перемещается в поднятом положении, а при работе функции в опущенном. Все упомянутые четыре функции не относятся к языку Си. Это внешние функции, после компиляции любой программы они должны быть добавлены к ней с помощью редактора связей. Если эти программы недоступны непосредственно, то они могут быть выражены через обращения к другим доступным графическим подпрограммам.

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

быть преобразован для пересылки на различные устройства, такие как перьевой плоттер, матричное печатающее устройство, или на упомянутый ранее графический терминал. Все эти устройства будут хорошо работать, если диапазоны изменения координат х и у будут удовлетворять условиям То есть точка с координатами х, у располагается на расстоянии х дюймов справа от оси у и на расстоянии у дюймов над осью х. Иначе говоря, начало О системы экранных координат располагается в нижнем левом углу экрана. Те читатели, которым это почему-либо не нравится, могут внести любые изменения в систему координат, особенно после изучения данной книги! Кроме того, в главе 2 будет рассмотрена возможность задания границ рисунка более элегантным способом.

Графическое изображение на рис. 1.1 состоит из 50 квадратов. Сначала вычерчивается квадрат затем на стороне выбирается точка А такая, что Аналогичным образом вычисляется положение точек на сторонах квадрата соответственно. После этого точкам присваиваются имена и процедура повторяется.



Рекомендуем почитать

Наверх