[an error occurred while processing this directive]
─PL63 ─LS1 ─SRP 66 ─TM0 ─HM2 ─DH//-|P-// ─LM5 │..................................................................< 4 ГРАФИКА 4.1 Использование цветов 4.1.1 Основы растровой графики До сих пор мы рассматривали экран дисплея только как средство для вывода символьной (текстовой) информации. Но изобразительные возможности ПЭВМ, конечно, гораздо богаче и позволяют выводить на экран не только символьную, но и графическую информацию, использующую при этом различные цвета. Для того, чтобы научиться грамотно пользоваться всеми этими возможностями, необходимо представлять себе каким образом ПЭВМ модифицирует изображение на экране и вообще в каком виде в ПЭВМ хранится та информация, которую мы наблюдаем на экране монитора. В отличие от телевизора, где на экран все время выводится новая информация, поступающая с телецентра, на экран монитора ПЭВМ постоянно выводится информация из экранной памяти. То есть все, что вы видете на экране, является образом определенного участка памяти компьютера. Очевидно, что если содержимое этой памяти будет оставаться неизменным, то и изображение на экране меняться не будет. Значит, для того, чтобы что-нибудь нарисовать или написать на экране, необходимо соответствующим образом изменить содержимое экранной памяти. Обьем памяти, отводимой под экран, колеблется от 1К до 20К. Чем больше обьем экранной памяти, тем разнообразнее может быть изображение. Каким же образом изображение на экране связано с содержимым экранной памяти? Изображение на экране монитора состоит из большого числа маленьких прямоугольников, называемых пикселами или просто точками. Каждая точка окрашена в свой цвет. Экранная память разделена поровну между всеми точками экрана и в ней содержится информация о, так называемом, логическом цвете каждой точки. Количество точек на экране и число возможных логических цветов для каждой точки может быть различным, но ограничено сверху обьемом отводимой под экран памяти. В ПЭВМ реализовано восемь различных экранных режимов, которые отличаются числом выводимых точек, числом логических цветов и обьемом требуемой экранной памяти. Кроме того в некоторых режимах имеется возможность работать как с текстовой, так и с графической информацией, в то время как остальные режимы являются чисто текстовыми. Информация обо всех этих режимах собрана в таблице (см. приложение II). Установить нужный экранный режим можно с помощью команды MODE. Рассмотрим более подробно организацию экранной памяти на примере пятого экранного режима (MODE5). Здесь экранная память занимает 10К (10240 байт). Из таблицы видно, что на экране в этом режиме можно изобразить 160 точек по горизонтали и 256 по вертикали (всего 40960 точек). Таким образом в каждом байте экранной памяти содержится информация о четырех точках экрана, то есть по два бита на точку. Два бита позволяют закодировать четыре состояния точки экрана: 00 - 0 01 - 1 10 - 2 11 - 3 Каждая комбинация битов определяет логический цвет соответствующей точки экрана. Таким образом, при разрешающей способности 160 на 256 точек экранная память объемом в 10K позволяет иметь только четыре различных цвета. Рассмотрим теперь второй экранный режим (MODE2). Здесь количество точек такое-же как и в пятом режиме, но на экран тратится в два раза больше памяти - 20К. Теперь на каждую точку отводится уже не два, а четыре бита, что позволяет иметь до 16 различных цветов. Аналогично устроены и другие экранные режимы кроме одного, который устанавливается по умолчанию при включении ПЭВМ - режима телетекста (MODE7). Обьем экранной памяти в этом режиме меньше 1К, но несмотря на это в нем доступно большое количество цветов и возможности псевдографики. В этом режиме при выводе информации на экран используются специальные аппаратные средства. Подробнее об этом режиме можно узнать из специальной литературы. Мы в дальнейшем будем рассматривать только экранные режимы с MODE0 по MODE6. ─PE 4.1.2 Логические и физические цвета Рассмотрим теперь какие возможности для вывода информации на экран имеются в Бейсике. Всю информацию, выводимую на экран, принято делить на графическую и текстовую. В соответствии с таким делением на экране всегда присутствуют два, так называемых, окна (графическое и текстовое) предназначенные для вывода информации соответствующего типа. По умолчанию каждое из окон занимает весь экран, т.е. одно наложено на другое, но вы можете изменить как размеры окон, так и их взаимное расположение. Рассмотрим пока только вопросы, касающиеся цвета. В каждом экранном режиме в вашем распоряжении имеется несколько логических цветов. Каждая точка экрана имеет свой логический цвет, соответствующий содержимому экранной памяти. Вы можете указать компьютеру каким физическим, т.е. реальным цветом изображать на экране точки, имеющие одинаковый логический цвет. Поясним это на небольшом примере. Установите какой-нибудь экранный режим, кроме MODE7. Экран закрасился черным цветом. Это произошло потому, что при смене экранного режима весь экран заполняется точками с нулевым логическим цветом, а этот логический цвет по умолчанию выводится черным. Следующая команда указывает компьютеру, что нулевой логический цвет следует выводить красным: >VDU 19,0,1;0; после исполнения этой команды все, что было черным, станет красным. Формат этой команды, устанавливающей соответствие между физическими и логическими цветами, следующий: VDU 19,<логический цвет>,<физический цвет>;0; Номера физических цветов указаны в таблице 1 (см. приложение III). Команда VDU предназначена для передачи параметров определенной подпрограмме операционной системы. В зависимости от значения параметров эта подпрограмма выполняет разнообразные действия. Например, VDU 7 заставляет компьютер издать короткий звуковой сигнал, VDU 14 устанавливает постраничный режим вывода на экран, а VDU 65 просто печатает на экран символ "A". ─PE * 4.1.3 Цвет текста В каждый момент времени в ПЭВМ назначены, так называемые, текущие логические цвета для вывода текстовой и графической информации, а так же текущие логические цвета для фона в графическом и текстовом окнах. Все команды, осуществляющие вывод информации или закраску фона, используют именно эти текущие логические цвета. Текущие логические цвета, устанавливаемые автоматически при смене экранного режима, и соответствующие им физические цвета указаны в таблице 2 (см. приложение III). Для выбора текущего логического цвета в текстовом окне используется команда COLOUR <логический цвет> , причем, если вы хотите изменить текущий логический цвет фона, то к номеру нужного логического цвета, указываемому в команде, надо прибавить 128. Вот несколько примеров >MODE 1 >COLOUR 1 >COLOUR 130 Первая команда устанавливает первый экранный режим, вторая выбирает первый логический цвет, которому по умолчанию соответствует красный физический для вывода текста и, наконец, третья команда выбирает второй логический цвет, которому соответствует желтый, для фона. Теперь все символы будут выводиться красным цветом на желтом фоне. Для закраски текстового окна текущим цветом фона используется команда CLS (CLS - это сокращение от английских слов CLear Screen - очистить экран). ─PE 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 Таким образом красный фон станет белым, белые буквы останутся белыми, а то, что было черным станет желтым. 4.2 Вывод графической информации 4.2.1 Координаты При выводе графической информации одним из самых ключевых моментов является понятие текущего положения точки на экране. Здесь есть некоторая анология с понятием текущей позиции курсора при выводе текстовой информации, но принципиальных отличий существенно больше. Как мы уже знаем, вывод графической инфомации осуществляется в графическое окно экрана. Независимо от разрешающей способности дисплея и (или) экранного режима положение точки на экране определется двумя целочисленными координатами 0-1279 по горизантали (ось X), 0-1023 по вертикали (ось Y), начало координат предполагается в левом, нижнем углу экрана. Количество дискретных позиций точки на экране, задаваемых с помощью координат, в общем случае не совпадает с количеством определяемых экранным режимом пикселов. Это несоответствие разрешается автоматической процедурой интерполяции при выводе. Итак, будем считать, что у нас имеется привычная декартова система координат (оси X,Y), в которой мы можем адресовать точку целочисленными значениями Х (0-1279) и Y (0-1023) и осуществлять все графические построения. Перейдем непосредственно к рассмотрению операторов-команд языка BASIC для вывода графической информации. 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, в экранном режиме 5. Это делается с помощью следующего фрагмента: 10 MODE 5 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 5 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 представляет собой бесконечный цикл (выход осуществляется нажатием клавишы ESCAPE), в котором ожидается ввод произвольного символа (строка 80 с использованием функции GET), а реакцией на этот ввод является стирание квадрата, т.е. закраска в фоновый цвет (строки 90-100) и вывод нового изображения, смещенного вправо на тридцать точек (строки 110,140-150). Условные операторы 120-140 проверяют не выходит ли переносимое изображение за пределы графического окна экрана. Если правая граница достигается, осуществляется перевод изображения вниз на 30 точек и в крайнее левое положение, как бы переход к следующей строке по аналогии с текстовым курсором - оператор 120. Если же достигнута нижняя граница окна, изображаемый квадрат перескакивает в самый верх (оператор 130). Наконец, собственно стирание и рисование квадрата осуществляется универсальной процедурой PROCQuadr (описание в строках 180-240). 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. При этом значения Х,У интерпретируются так же как для соответствцющих значений К основной группы.Данный способ изображения является наиболее удобным для изображения кривых линий. К=72-79. Принципиально другой способ отображения. Из задаваемой в команде PLOT точки проводятся горизонтальные линии влево и вправо, пока не встретится цвет, отличный от цвета фона. Если все графическое окно окрашено в текущий фоновый цвет, то линия будет пересекать его слева направо. Такой способ отображения может оказаться полезным, например, когда требуется "заштриховать" часть экрана, ограниченную некоторым контуром. Для этого заданная область предварительно окрашивается в некоторый уникальный для имеющегося изображения цвет. Этот цвет устанавливается текущим цветом фона. После "штриховки" окраску можно "убрать". Не будем дальше вдаваться в подробности програмной реализации процедур "штриховки", "закраски" и т.д., ограничившись лишь идеей использования возможностей данной группы значений парамера К. К=80-87. Это очень интересный и полезный способ вывода графического изображения. Для него характерно, что, на ряду с выводом прямых линий как и в основной группе, осуществляется "закраска" тем же цветом треугольной области. Вершинами "закрашиванмого" треугольника являются: точка, задаваемая в команде PLOT, а также текущее и предыдущее положение графического курсора. Данная группа функций команды PLOT обеспечивает наиболее простой и часто использцемый способ "закраски" (например, различным цветом) произвольных подобластей графического окна (см. один из примеров применения команды PLOT). К=88-95. Данная группа анологична группе значений К=72-79. Отличается лишь в том, что горизонтальная линия проводится только вправо от задаваемой точки и проходит только через область, окрашенную в цвет, отличный от фонового. 4.2.4. Примеры использования команды P L O T Рассмотрим примеры использования команды PLOT. Прежде всего отметим, что ни одна из рассмотренных команд не позволяет явно изображать кривые. Однако с помощью команд DRAW и PLOT имеется принципиальная возможность вывода на экран графического изображения произвольной кривой, задаваемой координатами лежащих на ней точек. При этом кривая может изображаться либо в виде кусочно-линейной аппроксимации, (команды DRAW и PLOT), либо отдельными точками (команда PLOT). В обоих случаях при достаточно большом количестве точек (мелкий шаг вдоль одной из координат) выводимое изображение внешне практически не отличается от кривой. Далее приводим фрагмент программы, осуществляющей вывод окружности красным цветом на желтом фоне произвольного радиуса (R) с произвольным расположением центра (X0,Y0). При этом используется второй способ вывода, т.е. точками. Программа также запрашивает число разбиений N вдоль оси X. Работая с программой непосредственно на ПЭВМ вы сможете оценить как влияет N на качество изображения и время вывода. 10 MODE 5 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 5 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]