[an error occurred while processing this directive]

─PL63
─TM0
─HM2
─DH//-|P-//
│..................................................................<
─PE
               4    ГРАФИКА

               4.1   Использование цветов 

               4.1.1 Основы растровой графики

     До  сих  пор  мы  рассматривали  экран  дисплея  только  как
средство  для  вывода  символьной  (текстовой)   информации.   Но
изобразительные  возможности  ПЭВМ,  конечно,  гораздо  богаче  и
позволяют  выводить  на  экран  не   только   символьную,   но  и
графическую  информацию, использующую при этом  различные  цвета.
Для того,  чтобы  научиться  грамотно  пользоваться  всеми  этими
возможностями,  необходимо  представлять  себе каким образом ПЭВМ
модифицирует изображение на экране  и  вообще в каком виде в ПЭВМ
хранится та информация, которую мы наблюдаем на экране монитора.
     В отличие от телевизора, где  на  экран  все время выводится
новая  информация,  поступающая  с  телецентра, на экран монитора
ПЭВМ постоянно выводится информация из  экранной  памяти. То есть
все,  что  вы  видете на экране, является  образом  определенного
участка памяти компьютера.  Очевидно,  что  если  содержимое этой
памяти  будет оставаться неизменным, то и изображение  на  экране
меняться не будет. Значит, для того,  чтобы что-нибудь нарисовать
или  написать   на  экране,  необходимо  соответствующим  образом
изменить содержимое экранной памяти.
     Обьем памяти, отводимой под экран,  колеблется от 2К до 16К.
Чем больше обьем экранной памяти, тем  разнообразнее  может  быть
изображение.  Каким  же  образом  изображение на экране связано с
содержимым  экранной  памяти?  Изображение  на   экране  монитора
состоит из большого числа маленьких  прямоугольников,  называемых
пикселами  или просто точками. Каждая точка окрашена в свой цвет.
Экранная память  разделена поровну между всеми точками экрана и в
ней содержится информация  о,  так  называемом,  логическом цвете
каждой  точки.  Количество  точек  на  экране и  число  возможных
логических  цветов  для  каждой точки может  быть  различным,  но
ограничено сверху обьемом отводимой под экран памяти. 
     В  ПЭВМ  реализовано  восемь  различных   экранных  режимов,
которые  отличаются  числом  выводимых точек,  числом  логических
цветов  и  обьемом  требуемой   экранной  памяти.  Кроме  того  в
некоторых режимах имеется возможность  работать  как с текстовой,
так и с графической информацией, в  то время как остальные режимы
являются  чисто  текстовыми.  Информация  обо  всех  этих режимах
собрана в таблице (см. приложение II). Установить нужный экранный
режим можно с помощью команды MODE. 
     Рассмотрим  более  подробно организацию экранной  памяти  на
примере второго экранного  режима  (MODE2). Здесь экранная память
занимает 16К (16384 байт). Из таблицы видно, что на экране в этом
режиме  можно  изобразить  256 точек  по  горизонтали  и  256  по
вертикали  (всего 65536 точек).  Таким  образом  в  каждом  байте
экранной памяти содержится информация о четырех точках экрана, то
есть по два бита на точку. Два бита позволяют закодировать четыре
состояния точки экрана:
                          00  -  0
                          01  -  1
                          10  -  2
                          11  -  3 
      Каждая   комбинация   битов   определяет   логический  цвет
соответствующей  точки  экрана.  Таким  образом,  при разрешающей
способности  256  на 256 точек  экранная  память  объемом  в  16K
позволяет иметь только четыре различных цвета.

─PE10
        4.1.2 Логические цвета


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

          4.1.3 Цвет текста

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

             COLOUR <логический цвет> ,

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

            >MODE 1
            >COLOUR 1
            >COLOUR 130

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

            CLS

(CLS - это сокращение от  английских слов CLear Screen - очистить
экран).

─PE10
         4.1.4  Цвет графики

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

            GCOL <операция>,<логический цвет>

(GCOL - от английских слов  Graphics  COLour - графический цвет).
Второй операнд в этой команде используется также, как и в команде
для  текстового окна, т.е. устанавливает текущий логический цвет,
появление   операнда   <операция>   обеспечивает   дополнительные
возможности команды.  При  выводе  информации  в  текстовое  окно
cтарый   логический   цвет   определенных   точек  экрана  просто
заменяется  на  текущий логический цвет. При работе с графическим
окном  появляется  возможность  использовать  в  качестве  нового
логического цвета не  просто текущий цвет, а некоторую функцию от
старого  логического  цвета  точки   и  текущего  цвета.  Функция
устанавливается с помощью операнда <операция> :

    0 - <новый логический цвет>=<текущий логический цвет>
    1 - <новый>=<старый> OR  <текущий>
    2 - <новый>=<старый> AND <текущий>
    3 - <новый>=<старый> EOR <текущий>
    4 - <новый>= NOT <старый>

     Если установлена нулевая <функция>, то команда GCOL работает
аналогично команде COLOUR. Если установлена  <функция> четыре, то
в качестве нового логического цвета берется  цвет,  инверсный  по
отношению  к  старому.  В остальных трех случаях новый логический
цвет  определяется в результате  побитного  выполнения  одной  из
логических функций  (ИЛИ,  И, исключающее ИЛИ) с текущим и старым
логическими цветами.
     Для закраски графического окна используется команда

            CLG

(от английских слов CLear Graphics - очистить графику). Последний
оператор GCOL, относящийся к фону  графического окна,  определяет
каким   образом   будет  работать  эта  команда.  Проиллюстрируем
действие команд GCOL и CLG :

            >MODE 1
            >GCOL 0,129
            >CLG

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

            >GCOL 1,130
            >CLG

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

      старый логический     новый логический       преобразования
            цвет                 цвет

         0 - черный (00)      2 - зеленый(10)     00 ИЛИ 10 = 10
         1 - красный(01)      3 - синий  (11)     01 ИЛИ 10 = 11
         2 - зеленый(10)      2 - зеленый(10)     10 ИЛИ 10 = 10
         3 - синий  (11)      3 - синий  (11)     11 ИЛИ 10 = 11

     Таким  образом  красный  фон  станет   синим,   синие  буквы
останутся синими, а то, что было черным станет зеленым.

─PE  
           4.2    Вывод графической информации

           4.2.1  Координаты

     При выводе графической информации одним  из  самых  ключевых
моментов  является  понятие  текущего  положения точки на экране.
Здесь есть некоторая анология с  понятием текущей позиции курсора
при   выводе  текстовой  информации,  но  принципиальных  отличий
существенно больше. Как мы уже знаем, вывод графической инфомации
осуществляется   в   графическое   окно   экрана.  Независимо  от
разрешающей   способности   дисплея   и  (или)  экранного  режима 
положение  точки  на  экране   определется  двумя  целочисленными
координатами  0-1279 по горизантали (ось X), 0-1023  по вертикали
(ось Y),  начало  координат  предполагается  в левом, нижнем углу
экрана. Количество дискретных позиций точки на экране, задаваемых
с помощью координат, в общем случае  не   совпадает с количеством
определяемых   экранным   режимом  пикселов.  Это  несоответствие
разрешается  автоматической  процедурой  интерполяции при выводе.
Итак,  будем  считать, что  у  нас  имеется  привычная  декартова
система координат (оси  X,Y), в которой мы можем адресовать точку
целочисленными значениями Х (0-1279) и  Y (0-1023) и осуществлять
все графические построения. 
     Перейдем  непосредственно  к  рассмотрению операторов-команд
языка BASIC для вывода графической информации. 
  

─PE10
             4.2.2 Команды  MOVE И  DRAW

     Команда    MOVE   предназначена   для   перемещения   точки,
представляющей  собой по существу графический курсор или рисующий
элемент на  экране,  в  заданную  позицию  координат  Х,Y. Формат
команды:
                   MOVE X,Y ,

где Х,Y - координаты точки. 
     Перемещение графического курсора в указанную  позицию экрана
по  команде  MOVE  является  абсолютным,  т.е.   не   зависит  от
предшествующего положения, а также никак не отображается. Другими
словами  ПЭВМ  всегда  "знает",  где в  данный  момент  находется
графический курсор, но внешне его  текущее положение в отличии от
символьного на экране не иницируется. Например, по команде

                   >MOVE100,200 

графический курсор из текущей позиции  перемещается  в  позицию с
координатами Х=100, Y=200. Отметим, что изначально он находится в
позиции Х=0, Y=0 (начало координат).
     Команда  DRAW  позволяет провести на  экране  прямую  линию,
соединяющую текущее  положение  графического  курсора с позицией,
указанной в команде. Формат:
                   DRAW X,Y где X,Y - задаваемые координаты конца
линии,   начальные   координаты   которой   определяются  текущим
положением   курсора  (могут  быть  указаны  явно  предшествующей
командой MOVE).
     При   команде   DRAW   линия  проводится   текущим   цветом,
устанавливаемым командой GCOL (см. п. 4.1).
     Давайте в качестве примера изобразим  квадрат ориентировочно
в центре экрана красным цветом на  зеленом  фоне с использованием
команд MOVE и DRAW, в экранном режиме 1.  Это  делается с помощью
следующего фрагмента:

            10 MODE 1
            20 GCOL0,1:GCOL0,130
            30 CLG
            40 X0=500:Y0=430:H=200
            50 MOVE X0,Y0
            60 DRAW X0,Y0+H
            70 DRAW X0+H,Y0+H
            80 DRAW X0+H,Y0
            90 DRAW X0,Y0

     В  строке  20  устанавливаются текущие  логические  цвета  1
(красный) и 2 (зеленый)  для  вывода графической информации и для
фона  соответственно.  Оператор  CLG  в  строке   30   окрашивает
графическое  окно экрана в фоновый цвет.  В  строке  40  задаются
координаты левой  нижней  вершины  квадрата  или  база (X0,Y0), а
также сторона Н. Все размеры заданы в  используемом  масштабе для
введенной  системы  координат. Наконец, строки 50-90 осуществляют
непосредствыенный вывод изображаемого  квадрата на экран. Если вы
в качестве упражнения введете  этот  фрагмент  в  память  ПЭВМ  и
выполните  его,  подав команду RUN, то легко (для снятия сомнения
можно  воспользоваться обыкновенной  линейкой),  что  квадрат  на
экране строго  говоря,  не является геометрическим квадратом. Это
объясняется тем, что геометрический  шаг  вдоль координатных осей
X,Y в общем случае является неодинаковым, поэтому для изображения
настоящего  геометрического  квадрата  необходимо воспользоваться
процедурой   пересчета   с   учетом    геометрических    размеров
графического окна по горизонтали  и  вертикали, а также принятого 
масштаба (1280 по оси X и 1024 по оси Y).
     Теперь  давайте  усовершенствуем  нашу программу. Во-первых,
сделаем  ее  универсальной,  что  бы  она  могла  изображать  наш
условный  квадрат  в  любом   месте   экрана  и  любого  размера.
Во-вторых, заставим выведенный на  экран квадрат перемещаться при
нажатии произвольной клавиши, аналогично текстовому курсору.
     Для решения второй задачи воспользуемся уже знакомым приемом
(см.   п.3.4),   связанным   с   использованием    функции    GET                 
(ввод одного символа) для организации  паузы  в работе программы.
Перемещение  объекта  на экране реализуется путем выполнения двух
последовательных  операций -  "стирание"  изображения  в  текущей
позиции и  вывод этого же изображения в следующей позиции экрана.
Операция стирания в  свою  очередь  может  быть выполнена выводом
изображения объекта в том же месте цветом фона, после чего объект
становится  невидимым.  Таким  образом,  возникает  необходимость
несколько   раз   нарисовать     квадрат.    В   связи   с  этим,
последовательность   операторов,   предыдущего   фрагмента  50-90
оформляется в виде универсальной процедуры PROCQuadr.
     Итак,  поставленная  задача  в  целом   решается   следующей
программой:

          10 MODE 1
          20 GCOL 0,1:GCOL 0,130
          30 CLG
          40 COLOUR 1: COLOUR.130
          50 INPUT "введите координаты левого нижнего угла и
                      ширину квадрата"X0,Y0,H
          60 PROCQuadr (X0,Y0,H)
          70 REPEAT 
          80 A=GET
          90 GCOL 0,2
         100 PROCQuadr (X0,Y0,H)
         110 X0=X0+30
         120 IF X0>1280-H THEN Y0=Y0-30:X0=O
         130 IF Y0<0 THEN Y0=1024-H
         140 GCOL 0,1
         150 PROCQuadr (X0,Y0,H)
         160 UNTIL FALSE 
         170 END
         180 DEF PROCQuadr (X,Y,H)
         190 MOVE X,Y
         200 DRAW X,Y+H
         210 DRAW X+H, Y+H
         220 DRAW X+H+Y
         230 DRAW X,Y
         240 ENDPROC

     Оператор  50  осуществляет  запрос  и  ввод   значений  базы
(X0,Y0) и стороны квадрата (Н).  Для того, чтобы вводимые числа и
текст  запроса  были  красными  на  зеленом  фоне,  в  строке  40
устанавливается  оператором COLOUR основной и фоновый  цвета  для
текстового  окна   экрана.   Основная   часть   программы  70-160
представляет  собой   бесконечный   цикл   (выход  осуществляется
нажатием клавишы  РЕ),  в  котором  ожидается  ввод произвольного
символа (строка 80 с использованием функции GET),  а  реакцией на
этот  ввод  является  стирание  квадрата, т.е. закраска в фоновый
цвет  (строки  90-100)  и вывод  нового  изображения,  смещенного
вправо на тридцать точек (строки 110,140-150). Условные операторы
120-140  проверяют  не  выходит  ли  переносимое  изображение  за
пределы   графического   окна   экрана.   Если   правая   граница
достигается, осуществляется перевод изображения  вниз на 30 точек
и в крайнее левое положение, как бы переход к следующей строке по
аналогии с текстовым курсором -  оператор 120. Если же достигнута
нижняя граница окна, изображаемый квадрат перескакивает  в  самый
верх  (оператор  130).  Наконец,  собственно стирание и рисование
квадрата   осуществляется   универсальной   процедурой  PROCQuadr
(описание в строках 180-240).


─PE10
           4.2.3 Команда PLOT

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

                     PLOT K,X,Y  ,

             где K - целочисленный параметр, задающий конкретную
                     функцию команды PLOT;
               Х,У - определяют следующее положение графического
                     курсора.
     Возможные значения параметра К делятся на несколько групп по
8 значений в каждой группе.

     Основная группа (значения К в диапазоне 0-7):
   К=0. Перемещение графического курсора в  точку, смещенную на X
и Y относительно текущего положения курсора.
   К=1. Проведение прямой линии в  точку,  смещенную  на  X  и  Y
относительно текущего положения курсора, цветом установленным для
графики.  
   К=2.  Та же самая функция,  что  и  при К=1, только цвет линии
образуется  следующим  образом:  цвет  тех  точек, через  которые
проходит линия меняется на логически инверсный.  
   К=3. То же самое, что  и при К=1 только цвет линии совпадает с
установленным  фоновым.  Такой  режим  удобен  для "закрашивания"
определенных элементов, имеющихся на экране изображения.   
   К=4. Перемещения курсора в точку с координатами Х,У в принятой
системе   координат,  т.е.  команда  PLOT   при   К=4   полностью
эквивалентна по реализуемой функции команде MOVE X,Y.  
   К=5.   Проведение  прямой  линии текущим  цветом,  соединяющей
текущую точку с задаваемой  абсолютными координатами Х,У. При К=5
команда PLOT полностью эквивалентна DRAW X,Y.  
   К=6.  То же, что и  при  К=5,  только цвет получается, как при
К=2.  
   К=7.  То же, что и при К=5, только фоновым цветом. 

     Другие  группы  также  представляют  собой  последовательные
восемь   значений  параметра  К.  Для  каждого  значения  функция
аналогична,  в  смысле  интерпретации  X,Y и использования цвета,
соответствующей  по последовательному номеру К  функции  основной
группы.
   К=8-15. Все линии проводятся без  отображения  последней, т.е.
задаваемой  явно  в  команде PLOT, точки. Внешне  на  экране  это
практически не заметно. Очевидно,  что  команды PLOT 0,X,Y и PLOT
8,X,Y  совершенно одинаковы, так как не  связаны  с  изображением
линий, а  только  вызывают  всегда невидимое перемещение курсора.
Эта общая закономерность распространяется и  на  все  последующие
группы для значений К, соответствующих К=0 и К=4. 
   К=16-23. Линии изображаются пунктиром. 
   К=24-31. Линии изображаются пунктиром и  без  последней  точки
(совмещаются способы изображения двух предыдущих групп). 
   К=64-71.  Линии не проводятся вообще,  а  изображаются  только
точки,  задаваемые   в  команде  PLOT.  При   этом  значения  Х,У
интерпретируются  так  же  как  для  соответствцющих  значений  К
основной  группы.Данный   способ  изображения  является  наиболее
удобным для изображения кривых линий.                      
   К=80-87.  Это  очень  интересный  и   полезный  способ  вывода
графического изображения. Для него характерно,  что,  на  ряду  с
выводом  прямых  линий  как  и  в основной группе, осуществляется
"закраска"   тем   же   цветом   треугольной  области.  Вершинами
"закрашенного"   треугольника   являются:  точка,   задаваемая  в
команде PLOT, а также текущее и предыдущее положение графического
курсора. Данная группа функций команды PLOT обеспечивает наиболее
простой   и   часто  использцемый  способ  "закраски"  (например,
различным цветом) произвольных подобластей графического окна (см.
один из примеров применения команды PLOT).
   К=96-103.  Построение  залитого  прямоугольника  с диагональю,
заданной точкой из команды PLOT и текущим положением курсора.
   К=128-135. Заливка области.
   В 0-м и 4-м режимах для залитых фигур и заливки области вместо
цветов используются фактуры с номерами от 0 до 15.


─PE10
          4.2.4. Примеры использования команды   P L O T

     Рассмотрим примеры использования команды PLOT.  Прежде всего
отметим, что ни одна из рассмотренных  команд  не  позволяет явно
изображать  кривые.  Однако  с помощью команд DRAW и PLOT имеется
принципиальная   возможность   вывода   на   экран   графического
изображения произвольной кривой, задаваемой  координатами лежащих
на ней точек. При этом  кривая  может  изображаться  либо  в виде
кусочно-линейной  аппроксимации,  (команды  DRAW  и  PLOT),  либо
отдельными точками (команда PLOT). В обоих случаях при достаточно
большом  количестве  точек  (мелкий шаг вдоль одной из координат)
выводимое изображение внешне практически не отличается от кривой.
      Далее  приводим  фрагмент  программы,  осуществляющей вывод
окружности красным цветом на зеленом  фоне произвольного  радиуса
(R)  с  произвольным  расположением  центра  (X0,Y0).   При  этом
используется второй способ вывода, т.е. точками.  Программа также
запрашивает число разбиений N вдоль оси X.  Работая  с программой
непосредственно  на  ПЭВМ  вы  сможете  оценить  как  влияет N на
качество изображения и время вывода. 

            10 MODE 1
            20 CCOL 0,1:GCOL 0,130
            30 COLOUR 1:COLOUR 130
            40 CLG   
            50 INPUT X0,Y0,R,N
            60 R2=R^2
            70 H=(2*R/N)
            80 FOR J=1 TO 2
            90 FOR I=0 TO N 
           100 IF J=1 THEN X=X0-R+I*H :
               Y=Y0+SQR(R2-(X-X0)^2) ELSE X=X0+R-I*H:
               Y=Y0-SQR(R2-(X-X0)^2)
           110 PLOT 69,X,Y
           120 NEXT I: NEXT J

     В данном фрагменте Н -  шаг  вдоль  оси Х, когда Х пробегает
значения от 0 до N вдоль диаметра окружности.  В основу алгоритма
положено  каноническое  уравнение  окружности  ,  из  которого по
заданному   значению   Х   находится   координата   У.  Знак  (+)
соответствует  верхней  полуокружности  (в  программе J=1-внешний
цикл, строка 80), а (-)-нижней (в программе J=2). При J=1 текущая
координата Х пробегает значения (внутренний цикл по I, строка 90)
слева направо и при этом  выводится верхняя полуокружность, а при
J=2  Х  изменяется  справа  налево  (обратное  направление),  что
соответствует  нижней полуокружности.  Вывод точек осуществляется
в двойном  цикле  командой  PLOT  69,  Х,Y  которая соответствует
основной  функции  команды  5  для группы значений К=64-71 (вывод
только точек). Основное время процессора  при  выполнении данного
фрагмента  на  ПЭВМ  будет  расходоваться  на вычислнение текущих
значений Y для каждой выводимой точки  с  использованием операций
возведения  в степень и встроенной функции извлечения квадратного
корня. Можно предложить другой более "быстрый" вариант программы,
основанный    на    использовании    симметричности    окружности
относительно проходящих через центр осей. Достаточно вычислять по
формуле координаты  Y  только  в пределах одного квадранта, а для
остальных   трех   получать   соответствующие   точки  зеркальным
отображением:

           10 MODE 1
           20 GCOL 0,1: GCOL 0,130 
           30 COLOUR 1:COLOUR 130
           40 CLG 
           50 INPUT X0,Y0,R,N
           60 R2=R^2
           70 H=R/N
           80 FOR I=0 TO N
           90 X=X0-R+I*H:Y=Y0+SQR(R2-(X-X0)^2)
          100 PLOT 69,X,Y
          110 NEXT I
          120 END
[an error occurred while processing this directive]