- •Оглавление
- •2.6. Модульное программирование
- •2.8. Численные методы анализа
- •2.1. Элементы языка
- •Мантисса e порядок
- •2.2. Операторы языка
- •Input [приглашение ;/,] список_вводимых_переменных
- •Операторы управления
- •If логическое_условие then оператор
- •If логическое_условие goto метка_оператора
- •If логическое_условие then оператор else оператор
- •I f логическое_условие then
- •2.3. Организация ветвлений
- •Input “Укажите х”, X
- •15 ? “Неверно”
- •2.4. Организация циклов
- •Программа к задаче 9
- •Input "Введите числа X и y", X, y
- •2.5. Работа с массивами
- •Input "Введите число вкладчиков и процент ",n,p
- •2.6. Модульное программирование
- •2.7. ОбРаботка Символьных данных
- •Пример. ?instr(”Саша”,”а”),instr(3,”Саша”,”а”) Результат: 2,4
- •2.8. Численные методы анализа
- •Input “Введите левую и правую границы a и в ”, a, b,
- •Input “Введите допустимую погрешность e ”, e
- •2.9. Выявление нажатия клавиш
- •2.10. Работа с графикой
- •2.11. Работа с дисковыми файлами
- •Тесты по курсу
- •Литература
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