Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Попов_1.doc
Скачиваний:
6
Добавлен:
25.04.2019
Размер:
668.16 Кб
Скачать

2.10. Работа с графикой

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

0 черный

1 голубой

2 зеленый

3 бирюзовый

4 красный

5 розовый

6 коричневый

7 белый

8 серый

9 ярко-голубой

10 ярко-зеленый

11 ярко-бирюзовый

12 ярко-красный

13 ярко-розовый

14 желтый

15 ярко-белый

УСТАНОВЛЕНИЕ ГРАФИЧЕСКОГО РЕЖИМА ЭКРАНА

осуществляется оператором

SCREEN режим

Здесь режим – номер экранного режима. В настоящее время широко используются графические адаптеры SVGA, для которых обычен режим номер 12 с разрешением 640 точек по горизонтали и 480 точек по вертикали, т.е. возможна адресация по оси Y от 0 до 479, по оси Х от 0 до 639. В дальнейшем мы будем использовать оператор выбора графического режима в форме SCREEN 12.

Непосредственно после оператора SCREEN графический курсор устанавли­вается в центр экрана – в нашем случае в точку 320,240. Аналогичный результат получается после применения оператора CLS.

ОПЕРАТОРЫ ВЫВОДА ГРАФИЧЕСКИХ ПРИМИТИВ

Оператор

PSET/PRESET [STEP] (x,y) [,цвет]

рисует точку на экране в позиции X,Y указанным цветом. Если задан параметр STEP, координаты берутся как смещение относительно текущего положения графического курсора, иначе – они интерпретируются как абсолютные коор­динаты. Если цвет не указан, оператор PSET, использует текущий основной цвет. PRESET работает также, но если цвет не указан, то используется цвет фона (удобно для стирания уже выведенных точек). Если координаты точки находятся вне экрана, то никаких действий не производится и сообщений об ошибке не выдается.

Оператор

CIRCLE [STEP] (x,y), радиус [, цвет]

рисует окружность с центром в точке X,Y заданным радиусом и цветом. STEP – указывает на то, что используются относительные координаты.

Примеры:

'окружность радиусом 100 с центром в точке с координатами 50, 50 цвета 4

CYRCLE (50, 150),100,4

CYRCLE STEP(0,0),5 'окружность радиусом 5 с центром в текущей точке

Оператор

LINE [[STEP](x1,y1)] – [STEP](x2,y2) [, [цвет] [B[F]]]

рисует линию или прямоугольник с начальными координатами x1,y1 и конечными – x2,y2. Если используется ключ В – рисуется прямоугольник с координатами левого верхнего угла х1, у1 и нижнего правого – х2, у2. Если использованы ключи BF – прямоугольник закрашивается. Параметр STEP указывает на относительные координаты.

Примеры:

LINE –(50, 50) 'линия от текущей точки до точки 50,50

LINE –STEP(50, 50) 'линия от текущей точки до точки,

'отстоящей от х и у на 50 и 50 пикселей

LINE (25, 25)–STEP(50, 50),5,BF 'прямоугольник с координатами левой верхней точки 25,25 и правой нижней –75, 75, закрашенный цветом 5

Универсальный оператор рисования

DRAW символьное_выражение

позволяет выполнять действия по перемещению, масштабированию, вращению и раскрашиванию образов.

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

B – предписывает двигаться, но не рисовать;

N – двигаться, рисовать, вернуться в исходную точку.

Команды перемещения

Un,Dn,Ln,Rn – Вверх, вниз, влево, вправо (рис. 2.10.1).

En,Fn,Gn,Hn – По диагонали в направлении: вверх вправо, вниз вправо, вниз влево, вверх влево.

Mx,y – Абсолютное или относительное движение. Если х или у имеет знак (+ или –), движение осуществляется относительно текущей точки, т.е. значения х и у будут прибавлены к значениям соответствующих текущих координат (или вычтены из них). Если знаков нет, движение будет абсолютным из текущей точки в точку с указанными координатами.

Команды трансформации

A n – Установка угла поворота n. Значение n находится в пределах от 0 до 3, где 0=0°, 1=90°, 2=180°, и 3=270°. Размеры фигур, повернутых на угол 90° или 270° масштабируются в отношении 4/3 к их размерам в углах 0° или 180°.

TA n – Поворачивает изображение на угол n градусов. Значение n находится в пределах от -360 до 360. Если n>0, то поворот производится против часовой стрелки, иначе – по часовой.

C n – Установка цвета n.

S n – Определяет масштаб, согласно которому уменьшаются/увеличиваются дли­ны отрезков, вычерчиваемых, следующими в строке командами пере­мещения (U,D,L,R,М). Масштабный коэффициент n находится в пределах от 1 до 255. Истинное значение масштабного коэффициента вычисляется как n/4. По умолчанию n=4, что соответствует коэффициенту 1/4.

P n,m – Установка цвета нарисованной фигуры: n – цвет содержимого окра­шен­ной области, m – цвет границ.

Пример. Построить шестиугольник, начиная с точки 100,100 (рис.2.10.2).

DRAW "bm100,100 r20 f20 d20 g20 l20 h20 u20 e20"

Пример. Нарисовать фигуру “колесо с касательными” (рис. 2.10.3).

SCREEN 12

FOR I = 0 TO 360 STEP 5

DRAW "nu80ta"+STR$(I)+"u5" 'касательная

SLEEP 'пауза для просмотра

NEXT

Пример. Нарисовать фигуру (схематическую “восьмерку” рис.2.10.4), изображенную справа. Ее левый верхний угол находится в точке 40,80. Ширина 60 пикселей, высота – 140. Внутренние прямоугольники имеют размер 20 на 40.

Операторы, формирующие изображение приведены ниже.

DRAW "bm40,80" ‘переход в левый верхний угол (40,80)

DRAW "r60d140l60u140" ‘большой прямоугольник

DRAW "bm+20,+20r20d40l20u40" ‘верхнее “окно”

DRAW "bm+0,+60r20d40l20u40" ‘нижнее “окно”

Последовательность действий иллюстрирует рис.2.10.5. Элементарные шаги пронумерованы. Так, номер 1 соответ­ствует команде r60; 2 – d140; 3 – l60; 4 – u140; 5 – bm+20, +20; 6 – r20; 7 – d40; 8 – l20; 9 – u40 и т.д. Отдельные действия разнесены по разным операторам только для наглядности. Возможно их объединение, как показано ниже

DRAW "r60d140l60u140 bm+20,+20r20d40l20u40m+0,+60r20d40l20u40"

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

Оператор

PAINT [STEP] (x,y)[,[цвет_заполнения][,цвет_рамки]]

дает возможность закрасить ограниченную площадь цветом заполнения. Если цвет заполнения не задан, используется цвет фона. Закрашивание начи­нается с точки с абсолютными (или относительными – STEP) координатами X,Y. Точка может быть указана внутри фигуры (раскрашивается фигура) или вне ее (раскрашивается фон), но не на границе. Если цвет рамки не указан, рамка окрашивается в цветом заполнения.

ФОРМИРОВАНИЕ ОКОН

Оператор

VIEW (Xн,Yн)-(Xк,Yк)[,[цвет_окна] [,цвет_рамки]]

позволяет выделить определенную часть экрана (окно), в которой в дальней­шем будут воспроизводиться все графические объекты. Им определяются размер и положение окна графического вывода на экране монитора. Если VIEW выполняется без аргументов, окном вывода будет весь экран.

Параметры оператора:

Xн,Yн – координаты левого верхнего угла окна (в пикселях).

Xк,Yк – координаты правого нижнего угла окна.

цвет окна – цвет фона окна (если не указан, окно не закрашивается).

цвет рамки – цвет рамки окна.

Оператор

WINDOW [SCREEN] (Xmin,Ymin)–(Xmax,Ymax)

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

Здесь

Xmin,Ymin – минимальные значения физических координат выводимого на экран объекта.

Xmax,Ymax – максимальные значения физических координат.

SCREEN – определяет направление координат. По умолча­нию, вывод производится в декартовых координатах (рис.2.10.6а) с обычным направлением оси Y (вверх). Если использован параметр SCREEN, Y направляется вниз (рис.2.10.6б).

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

Пример. Положим нам нужно вывести на экран график функции Y=SinX, для Х, изменяющегося в диапа­зоне от 0 до 20. Программа вывода приведена ниже, график на рис.2.10.7.

SCREEN 12

VIEW (25, 10)-(600, 435),,1 ‘формируется окно вывода с экранными

‘координатами (в пикселях): х=25, у=10 на х=600, у=435

Xmin = 0: Xmax = 20 ‘масштабирование (заданы крайние

Ymin = -1: Ymax = 1 ‘значения Х =[0,20] и Y=[-1.1])

WINDOW (Xmin,Ymin)-(Xmax,Ymax) ‘задаются физические координаты

FOR x=0 TO 20 STEP .01 ‘генерация значений Х от 0 до 20 с шагом 0.01

PSET (x, SIN(x)), 4 ‘вывод функции SinX

PSET (x, 0), 4 ‘одновременный вывод оси Х

NEXT

СОЗДАНИЕ ДИНАМИЧЕСКИХ ОБРАЗОВ осуществляется с помо­щью двух операторов (GET и PUT), сохраняющих образ в массиве и извлекающих его оттуда (рис.2.10.8).

Оператор

GET [STEP](X1,Y1) – [STEP](X2,Y2) [,массив]

позволяет сохранить графическое изображение в массиве чисел.

Здесь:

X1,Y1,X2,Y2 – координаты левого верхнего и правого нижнего углов прямоугольной области экрана.

STEP – параметр, указывающий, что координаты берутся относительно послед­ней нарисованной точки.

массив – имя числового массива для записи изображения. Размер массива в байтах определяется по формуле: 4+INT(((Х2–Х1+1)+7)/8)*4*((Y2–Y1)+1)

Оператор

PUT [STEP] (X,Y), массив [,действие]

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

Здесь:

X,Y – координаты левого верхнего угла прямоугольника, в котором будет размещаться изображение.

STEP – параметр, указывающий, что координаты берутся относительно теку­щего положения курсора

массив – имя массива с изображением.

действие – параметр, позволяющий накладывать образ на экран с созданием специальных эффектов (по умолчанию – XOR):

PSET – Каждая точка имеет запомненный в массиве цвет.

PRESET – Выдается инверсное (негативное) изображение образа.

AND – Выводимое изображение накладывается на существующее. Точки, имеющие одинаковый цвет, сохраняются, остальные цвет меняют.

OR – В результате наложения получается образ, являющийся результатом применения логического ИЛИ.

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

Рассмотрим несколько более интересных примеров.

Пример. Составим программу вывода шести концентрических окруж­ностей с координатами центра в центре экрана (точка: 320, 240), последо­вательно раскрашенных в цвета с первого по шестой (рис.2.10.9).

SCREEN 12

FOR i = 1 TO 6 ‘цикл рисования шести окружностей

‘круг с центром в точке 320,240, радиусом 25i с цветом линии 1

CIRCLE (320, 240), i*25,1

‘закрашивание цветом i объекта, замкнутого относительно точки

PAINT (320+i*25-1,240), i,1 ‘с координатами 320+i*25-1, 240

NEXT

Как видим, программа очень несложна. Сделаем пояснения только к раскрашиванию. Здесь координата Y остается постоянной (240). Координата Х меняется таким образом, чтобы точка находилась внутри очередной окружности, хотя бы на один пиксель отступя от края (320+i*25-1).

Пример. Составим программу вывода текущего време­ни в формате ЧЧ-ММ-СС. Вывод цифр времени будем осуществлять большими “рисованными” символами (как, например, на рис.2.10.10).

SCREEN 12

t$ = " "

DO 'бесконечный цикл опроса времени

'если нажата какая-то клавиша

IF INKEY$<>"" THEN END 'завершение программы

IF t$<>TIME$ THEN 'если время изменилось

CLS 'экран очищается

t$ = TIME$ 'запоминается новое время

END IF

FOR i=1 TO 8 'перебор цифр времени

x$=MID$(TIME$, i, 1) 'выделение очередного символа времени

‘позиционирование точки начала рисования:

IF i = 1 THEN DRAW "bm40,80" 'позиция первой цифры часов

IF i = 2 THEN DRAW "bm110,80"

'тире часы-минуты

IF i = 3 THEN DRAW "bm185,80bm+0,+60r20d20l20u20"

IF i = 4 THEN DRAW "bm220,80" 'позиция первой цифры минут

IF i = 5 THEN DRAW "bm295,80"

'тире минуты-секунды

IF i = 6 THEN DRAW "bm370,80bm+0,+60r20d20l20u20"

IF i = 7 THEN DRAW "bm405,80" 'позиция первой цифры секунд

IF i = 8 THEN DRAW "bm475,80"

'вывод символов времени:

IF x$="1" THEN DRAW "r40d120r20d20l60u20r20u100l20u20"

IF x$="2" THEN DRAW "r60d80l40d40r40d20l60u80r40u40l40u20"

IF x$="3" THEN DRAW "r60d140l60u20r40u40l20u20r20u40l40u20"

IF x$="4" THEN DRAW "r20d60r20u60r20d140l20u60l40u80"

IF x$="5" THEN DRAW "r60d20l40d40r40d80l60u20r40u40l40u80"

IF x$="6" THEN DRAW

"r60d20l40d40r40d80l60u140bm+20,+80r20d40l20u40”

IF x$="7" THEN DRAW "r60d60g30d50l20u50e30u40l40u20"

IF x$="8" THEN DRAW

"r60d140l60u140 bm+20,+20r20d40l20u40bm+0,+60r20d40l20u40"

IF x$="9" THEN DRAW

"r60d140l60u20r40u40l40u80bm+20,+20r20d40 l20u40"

IF x$="0" THEN DRAW "r60d140l60u140bm+20,+20r20d100l20u100"

NEXT

LOOP

Здесь в переменную t$ заносится символьное значение времени с помощью функции TIME$. В бесконечном цикле производится опрос нажатия клавиши. Нажатие любой клавиши является сигналом завершения программы (IF INKEY$<>"" THEN END). Если в очередном цикле произошло изменение значения времени, экран очищается и запоминается новое время. Далее прос­матриваются все восемь символов строки времени. Первая группа операторов IF в зависимости от номера символа, фиксирует текущие координаты в нужном месте экрана. Следующая группа операторов IF выводит уже изображение нужного символа, начиная с этой точки.

Пример. Составим программу, отобража­ющую стрелочный секундомер (только секун­дную стрелку). В левом верхнем углу экрана (рис.2.10.11) отоб­разим уже в числовом виде текущее время и число секунд от начала работы программы. Для вычисления абсолютного числа прошедших секунд (DS) из текущего времени (TIME$) извлекаются две цифры часов и умножаются на 360, плюс число минут, умноженных на 60, плюс просто число секунд (переменная S). Это значение является точкой отсчета для секундомера, который работает три минуты (180 секунд) от запуска программы. Важным является преобразование числа секунд в угол поворота стрелки. Заметим, что одна минута равна шести градусам и отсчет градусов идет от горизонтальной оси, а минут – от вертикальной, т.е. следует отнять 90 градусов.

Программа стрелочного секундомера

SCREEN 12

CIRCLE (320,240),205 'рисование окружности

'число секунд от 0 часов до пуска программы

s=VAL(MID$(TIME$,1,2))*360 +

VAL(MID$(TIME$,4,2))*60+VAL(MID$(TIME$,7,2))

ds=0 ‘число секунд

LOCATE 3, 2: PRINT "Секунд: "

FOR i = s TO s+180 'цикл на три минуты (i – секунды)

LOCATE 2, 2: PRINT TIME$ 'вывод текущего времени

LOCATE 4, 2: PRINT USING "###"; ds 'вывод числа секунд

t$ = TIME$ 'запоминание времени

g=(i*6-90) MOD 360 'преобразование числа секунд в угол поворота

'рисование стрелки

DRAW "c7ta-"+STR$(g)+"r200 nh30 ng30 bm320,240"

WHILE t$ = TIME$: WEND 'пауза до изменения времени

ds=VAL(MID$(TIME$, 1,2))*360+VAL(MID$(TIME$,4,2))*60

+VAL(MID$(TIME$, 7, 2)) - s

'стирание старой стрелки

DRAW "c0ta-"+STR$(g)+"r200 nh30 ng30 bm320,240"

NEXT

Пример. Составить программу вычерчивания линии при нажатии соответствующих навигационных клавиш (клавиш со стрелками и диагональных клавиш – Home, End, PgUp, PgDn). Кроме того, в правой части экрана следует отобразить текущие координаты точки. Для выхода из программы использовать клавишу Enter. Результат работы программы может быть например таким, как показано на рис.2.10.12.

Программа приведена ниже. Сначала здесь изображается прямоугольник, в котором разрешено двигаться точке, и курсор устанавливается в исходное положение. Затем организуется цикл вывода. Внутри него командой SLEEP создается состояние ожидания для фиксации нажатия клавиш. Если нажатие произошло, проверяется длина кода. Если она равна двум (LEN(a$)=2), значит была использована управляющая клавиша. Далее выясняется ее код. Если это клавиша Enter (код 13), осуществляется выход из цикла и работа программы прекращается. Если это клавиша со стрелкой, например стрелкой вниз (код 80), соответствующая координата (Y) увеличивается на 1 пиксель и формируется новое значение команды перемещения (переменная z$). Однако, прежде чем выполнить графическую операцию, проверяется положение но­вых координат относительно установленных пределов вывода (здесь для Y это 0-200, для Х – 0-300). Если новая точка находится внутри прямоуголь­ника, выполняется команда рисования (DRAW z$), иначе возвращаются старые координаты. В конце цикла в позиции 1,55 выводятся текущие координаты точки.

SCREEN 12

LINE (0, 0)-(300, 200), , B

x=10: y=100: PSET(x y) 'переход в начальную точку рисования

DO

SLEEP

a$=INKEY$ 'запоминание кода нажатой клавиши

IF LEN(a$) = 2 THEN 'если нажата управляющая клавиша

IF ASC(a$) = 13 THEN EXIT DO 'если нажата Enter – выход

'проверка нажатия навигационных клавиш

k = ASC(RIGHT$(a$, 1)) 'выявление кода второго символа

y1 = y: x1 = x 'запоминание старых координат

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

IF k=80 THEN y=y+1: z$="d" 'движение вниз

IF k=72 THEN y=y-1: z$="u" 'движение вверх

IF k=75 THEN x=x-1: z$="l" 'движение влево

IF k=77 THEN x=x+1: z$="r" 'движение вправо

IF k=73 THEN x=x+1: y=y-1: z$="e" 'движение вверх вправо

IF k=81 THEN x=x+1: y=y+1: z$="f" 'движение вниз вправо

IF k=71 THEN x=x-1: y=y-1: z$="h" 'движение вверх влево

IF k=79 THEN x=x-1: y=y+1: z$="g" 'движение вниз влево

'проверка выхода за установленные пределы

IF y>0 AND y<200 AND x>0 AND x<300 THEN

DRAW z$ 'точка внутри области - вывод прямой

ELSE 'иначе

y=y1: x=x1: 'возврат к старым координатам и сигнал

END IF

LOCATE 1,55

PRINT "X=";x;"Y=";y 'вывод текущих координат

END IF

LOOP