|
Элементарная графика на БЕЙСИКе - раскладка экрана. Раскладка алфавитно-цифрового экрана. Раскладка экрана в графике высокого разрешения. Раскладка экрана цветовых атрибутов. Основные проблемы при работе с графикой.
|
1.2 РАСКЛАДКА ЭКРАНА
1.2.1. Раскладка алфавитно-цифрового экрана.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Выше мы сказали, что на экране может быть до 22-х символь-
ных рядов. Это не совсем так. На самом деле на полном экране
может быть конечно до 24-х символьных рядов, но если Вы работа-
ете на БЕЙСИКе, то подчиняетесь той программе-интерпретатору,
которая "зашита" в ПЗУ компьютера, а она использует нижние 2
ряда для собственных сообщений к Вам. Это могут быть сообщения
об ошибках или более приятное сообщение "O.K." о том, что все в
порядке. Эти нижние два ряда называют системным окном, а верх-
ние 22 строки - Главным экраном.
-----------------------------------------¬
¦ ¦
¦ Главный экран ¦
¦ ¦
¦ (22 символьных ряда) ¦
¦ ¦
¦ ¦
¦ ¦
+----------------------------------------+
¦ Системное окно (2 символьных ряда) ¦
L-----------------------------------------
Рис. 1
Вот поэтому-то и получается, что при работе на БЕЙСИКе Вам
доступны только 22 символьных ряда или 176 точек по вертикали
при работе с графикой.
Если бы Вы работали в машинном коде, то могли бы отклю-
читься от ПЗУ компьютера и тогда могли бы использовать все 24
символьных ряда или 192 точки по вертикали при работе с графи-
кой высокого разрешения, но при этом не смогли бы получать со-
общений от компьютера о ходе работы программы и любая ошибка
приводила бы либо к "зависанию" программы, либо к ее сбросу.
Возможен еще третий вариант, когда Вы работает в БЕЙСИКе,
но для ускорения тех или иных операций над экраном применяете
свои процедуры, написанные в машинном коде, а потом опять воз-
вращаетесь в БЕЙСИК (такой подход мы рассмотрим в Главе 3). В
этом случае Вам также лучше оставить нижние 2 ряда в покое и не
трогать их.
Есть еще и четвертый подход, когда написанная Вами про-
грамма может быть полностью независимой от БЕЙСИКа и исполнена
в машинном коде, но для упрощения изображения графических при-
митивов (точек, линий, дуг, окружностей) Вы используете стан-
дартные процедуры из ПЗУ, вызывая их по известному Вам адресу
(приемы будут даны в Главе 2). В этом случае Вам лучше также не
вторгаться в системное окно, поскольку эти процедуры могут
проверять координаты позиции печати и не работать с тем, что
для них не предусмотрено.
Далее мы будем рассматривать экран состоящим как бы из
24-х рядов, помня, что на БЕЙСИКе нам доступны только 22.
0 ---------------------X------------¬
¦ X ¦
¦XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX¦ - РЯД
¦ X ¦
¦ X ¦
¦ X ¦
¦ X ¦
23 ¦ X ¦
L--------------------X-------------
0 ¦ 31
L-- СТОЛБЕЦ
Рис. 2
Итак, экран состоит из 24-х символьных рядов по 32 символа
в каждом. Ряды нумеруются сверху вниз от 0 до 23-го. С другой
стороны, мы можем считать, что экран состоит из 32-х столбцов,
которые нумеруются слева направо от 0 до 31-го. Таким образом,
позиция с координатами (0,0) для экрана с низким разрешением
находится в левом верхнем углу.
Поскольку в одном ряду можно расположить до 32-х символов,
то говорят, что в ряду содержится 32 знакоместа.
----T---T-----------T---T---------------------¬
¦ X ¦ X ¦...........¦ X ¦ ................... ¦
L---+---+-----------+---+----------------------
0 1 ¦ 31
L-- ЗНАКОМЕСТО
Рис. 3
Рассмотрим теперь, что же представляет из себя каждое зна-
коместо. Оно состоит из 8 линий по 8 точек в каждой. Эти точки
называют пикселами (PICture CELL).
----T---T---T---T---T---T---T---¬
¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ ------ ЛИНИЯ
+---+---+---+---+---+---+---+---+
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---+---+---+---+---+---+---+---+
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---+---+---+---+---+---+---+---+
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---+---+---+---+---+---+---+---+
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---+---+---+---+---+---+---+---+
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---+---+---+---+---+---+---+---+
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---+---+---+---+---+---+---+---+
¦ ¦ ¦ X ¦ ¦ ¦ ¦ ¦ ¦
L---+---+-T-+---+---+---+---+----
¦
L----- ПИКСЕЛ
Рис.4
Каждой линии каждого знакоместа на экране Вашего дисплея
соответствует один байт в оперативной памяти Вашего компьютера.
Таким образом, для того, чтобы запомнить всю информацию, содер-
жащуюся в одном знакоместе, необходимо затратить 8 байтов опе-
ративной памяти. С другой стороны, чтобы заполнить на экране
одно знакоместо, должно быть прочитано содержимое восьми байтов
памяти. Заметьте, что здесь мы уже не говорим ОПЕРАТИВНОЙ ПАМЯ-
ТИ, поскольку читать можно не только из нее, но и из ПЗУ, а
именно оттуда и берутся 8 байтов, когда на экране изображается
стандартный символ, например буква "A". Эти 8 байтов, из кото-
рых строится изображение символа, часто еще называют ШАБЛОНОМ
символа.
Если линия - это байт в памяти, то что же такое пиксел? Вы
наверное знаете, что байт состоит из восьми битов, каждый из
которых может быть включен или выключен (равен единице или ну-
лю). Поэтому каждому пикселу в линии соответствует один бит в
байте. Получается, что карта включения битов определяет рас-
кладку включенных пикселов в линии.
Если, например, байт равен 175, то его побитовая раскладка
такова:
128 64 32 16 8 4 2 1
----T---T---T---T---T---T---T---¬
¦ 1 ¦ 0 ¦ 1 ¦ 0 ¦ 1 ¦ 1 ¦ 1 ¦ 1 ¦
L---+---+---+---+---+---+---+----
175 = 128 + 32 + 8 + 4 + 2 + 1
Рис. 5
Совершенно естественно, что линия в знакоместе, которой
соответствует байт 175, будет иметь вид:
----T---T---T---T---T---T---T---¬
¦ X ¦ ¦ X ¦ ¦ X ¦ X ¦ X ¦ X ¦
L---+---+---+---+---+---+---+----
¦ ¦
Выключенный пиксел --- L-- Включенный пиксел
Рис. 6
Сравните Рис.5 и Рис. 6 и убедитесь в их соответствии.
Здесь мы столкнулись с интересной особенностью. Дело в
том, что для графических работ, в отличие от математических,
неважно, какое значение имеет байт, важна его побитовая рас-
кладка, то есть как бы обрабатываются они не в соответствии со
своими значениями, а в соответствии со своей конструкцией.
Обратите внимание на интересное обстоятельство, связанное
с особенностью шаблонов стандартных символов. Дело в том, что
для того, чтобы текст на экране хорошо читался, между символами
должны быть какие-то зазоры. Поэтому в знакоместе 8 X 8 правая
колонка пикселов у символов как правило выключена. А это зна-
чит, что во всех линиях правый пиксел выключен и в соответству-
ющих им байтах самый младший бит равен нулю (см.рис.5). Если же
этот бит равен нулю, то байт будет иметь только четное значе-
ние. Поэтому, если при просмотре машинного кода фирменных про-
грамм Вы найдете последовательность из нескольких сотен четных
байтов, то можно почти уверенно предположить, что здесь распо-
ложены шаблоны шрифтового набора. Совсем нетрудно написать
БЕЙСИК-программу для поиска, скажем, пятидесяти встретившихся
подряд четных байтов и быстро определить, где может находиться
шрифт (в этом случае нулевой байт тоже условно отнесем к
четным).
Остался еще неисследованным вопрос о том, какой цвет имеет
включенный пиксел и какой цвет имеет на экране пиксел, который
выключен. Укажем пока только, что включенный пиксел имеет цвет
INK, а выключенный - цвет PAPER и вернемся к этому вопросу,
когда будем заниматься цветом.
1.2.2. Раскладка экрана в графике высокого разрешения.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Тридцать два знакоместа по ширине экрана дают 256 (32 X 8)
пикселов - такова ширина экрана в "высокой" графике.
Двадцать четыре ряда по восемь пикселов в каждом знакомес-
те дают нам 192 пиксела по вертикали, но поскольку нижние две
строки в БЕЙСИКе недоступны, то считают, что предельный размер
по вертикали равен 22 X 8 = 176 пикселов.
За начало отсчета принимают левый нижний угол Главного эк-
рана (обратите внимание на слово "Главного", то есть системное
окно отбрасывается).
175 -----------------------------------------¬
¦ . ¦
¦ . Главный экран ¦
¦ . ¦
¦ . (176 точек по вертикали, ¦
¦ . 256 точек по горизонтали) ¦
¦ . ¦
0 ¦ . .................................... ¦
+----------------------------------------+
¦ Системное окно (2 символьных ряда) ¦
L- --
0 255
Рис. 7
Таким образом, точка с координатами (0,0), если они заданы
в пикселах, определяет левый нижний угол Главного экрана. Тот
факт, что вертикальная координата в знакоместах отсчитывается
сверху вниз, а в пикселах - наоборот снизу вверх иногда приво-
дит к путанице начинающих программистов, впрочем с набором пра-
ктики это быстро проходит.
В заключение этого параграфа давайте для справки прикинем
сколько байтов оперативной памяти необходимо для хранения пик-
сельного (монохромного - без цвета) изображения всего экрана.
Если на каждое знакоместо нам необходимо восемь байтов, то на
экранный ряд - 32 X 8 = 256 байтов, а на весь экран - 24 X 256
= 6144 байта.
1.2.3. Раскладка экрана цветовых атрибутов.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Еще одной особенностью "Синклер"-совместимых компьютеров
является необычный подход К.Синклера к вопросам, связанным с
цветом. Дело в том, что если каждую точку красить в свой цвет,
то оперативной памяти компьютера уже ни на что хорошее не
останется. Поэтому им было принято гениальное решение - цвет
сделать с низким разрешением. То есть для каждого знакоместа
возможен только один цвет INK (для включенных пикселов) и один
цвет PAPER (для выключенных). Иначе говоря, Вы не можете иметь
в одном знакоместе более двух цветов одновременно. Что же это
дало?
Поскольку всего возможно только 8 цветов, то для задания
цвета INK в одном знакоместе достаточно трех битов:
Таблица 1
--------------------------------------------------¬
¦ 0 = 000 - черный BLACK ¦
¦ 1 = 001 - синий BLUE ¦
¦ 2 = 010 - красный RED ¦
¦ 3 = 011 - пурпурный MAGENTA ¦
¦ 4 = 100 - зеленый GREEN ¦
¦ 5 = 101 - голубой CYAN ¦
¦ 6 = 110 - желтый YELLOW ¦
¦ 7 = 111 - белый WHITE ¦
L--------------------------------------------------
Цвета были выбраны отнюдь не случайно, а исходя из тех
соображений, что на экране черно-белого телевизора они должны
во-первых хорошо различаться, как разные оттенки серого, а
во-вторых, их яркость от черного до белого должна постепенно
возрастать.
Точно так же для задания 8 цветов PAPER нам тоже доста-
точно трех битов на одно знакоместо. Если теперь каждому знако-
месту отвести по одному байту для хранения параметров цвета (а
в байте 8 битов), то остается еще пара свободных битов, один из
которых отдан признаку яркости (BRIGHT), а другой - признаку
мигания (FLASH). Таким образом, для каждого знакоместа может
быть установлен свой цвет INK, свой цвет PAPER и свои режимы
BRIGHT и FLASH. Эти четыре параметра называют цветовыми
AТРИБУТАМИ.
Использование атрибута BRIGHT эквивалентно расширению
палитры цветов в два раза, то есть компьютер имеет как бы 16
цветов. Оценим теперь расход памяти на цветовые атрибуты:
24 ряда по 32 знакоместа = 768 байтов - совершенно ничтож-
ный расход памяти для такого богатства красок, которое мы не-
редко видим в хороших игровых программах.
После выхода первых "Спектрумов" не было пределов востор-
женным отзывам. Добиться имитации многоцветной графики высокого
разрешения с таким ничтожным расходом памяти - это великое
достижение (за которым конечно скрывается иллюзия, т.к. цвет
не имеет высокого разрешения, а только имитирует его за счет
высокого разрешения пиксельной графики).
Общий расход памяти на весь экран с цветом составляет:
6144 + 768 = 6912 байтов, - что очень и очень немного по
сравнению с машинами конкурентов.
За этим фактом быстро открылась еще одна особенность. По-
скольку процессор имеет ограниченную скорость работы, то обслу-
жить (перестроить) экран он может тем быстрее, чем меньшую па-
мять имеет экранная область и потому фирмы, выпускающие про-
граммное обеспечение, легко смогли освоить динамическую графику
и добиться превосходных по тем временам успехов в анимации
изображений (так на Западе называют мультипликацию).
Итак, каждый байт атрибутов соответствует одному знакомес-
ту экрана и несет информацию о цветах INK, PAPER и признаках
BRIGHT и FLASH. При этом побитовая раскладка этих параметров в
байте выглядит так:
Номер бита 7 6 5 4 3 2 1 0
г===T===T===T===T===T===T===T===¬
Параметр ¦ F ¦ B ¦ P ¦ P ¦ P ¦ I ¦ I ¦ I ¦
L===¦===¦===¦===¦===¦===¦===¦===-
Рис. 8
1.2.4. Основные проблемы при работе с графикой.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Конечно же самая главная проблема при работе с графикой -
где взять художественный талант и творческое вдохновение но,
здесь мы Вам помочь ничем не сможем - сами их не имеем, так что
на первых порах будем считать, что у Вас все это есть, а если и
нет, то попробуем обойтись без них, заменив творческое вдохно-
вение на кропотливый поиск методом проб и ошибок. Мы же остано-
вимся на чисто программистских проблемах, связанных с графикой.
1. Быстродействие. Работа с графикой требует быстрой пе-
реброски значительных объемов информации (килобайтов) из одних
участков оперативной памяти в другие. Здесь Вам поможет приме-
нение процедур, записанных в машинном коде или прямое обращение
к процедурам, содержащимся в ПЗУ.
2. Вторая проблема - ограниченный объем памяти компьютера.
Так как графические изображения требуют больших объемов памяти,
приходится решать и этот вопрос. Есть приемы по борьбе с этой
проблемой. Во-первых, стараются использовать для графики не
весь экран, а только его часть (необходимую и достаточную для
достижения поставленной задачи). Во-вторых, стараются по-воз-
можности шире применять вычислительные процессы для создания
графических образов - в этом случае графическое изображение не
хранится в памяти для выдачи его в нужное время на экран, а
строится по заданному алгоритму (векторная графика) именно в
тот момент, когда это надо. В-третьих, когда все-таки надо хра-
нить десятки изображений, ранее подготовленных в графическом
редакторе, применяют методы компрессии при сохранении рисунка и
декомпрессии при выдаче его на экран.
3. Третья проблема является чисто программистской. Она
состоит в том, что надо хорошо знать как структура экрана
соответствует структуре оперативной памяти. Грубо говоря, надо
знать какие адреса в памяти каким координатам на экране
соответствуют. А поскольку координаты могут быть заданы в
знакоместах или в пикселах, то фактически эту проблему надо
решать дважды, а если еще добавить цветовые атрибуты, то и
трижды.
Однако, знать это соответствие еще не достаточно. Надо еще
знать методы и приемы, с помощью которых компьютер может рас-
считать эти адреса по заданным координатам, надо знать приемы и
алгоритмы, с помощью которых данные извлекаются из недр опера-
тивной памяти и распределяются по этим адресам.
К счастью, если Вы работаете в БЕЙСИКе, то забивать себе
этим голову не надо. Смело давайте команду PRINT AT, PLOT x,y,
DRAW... и т.п. и интерпретатор БЕЙСИКа, "зашитый" в ПЗУ, сам
рассчитает, что нужно в какие ячейки памяти заслать, чтобы Вы
на экране получили то, что хотите. Совсем иное дело, если Вы
будете работать в машинных кодах - тогда читайте вторую и тре-
тью главы этой книги, а пока вернемся к БЕЙСИКу.
|