Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

5. Работа с монитором в текстовом режиме

   Монитор современного компьютера может работать в двух режимах: текстовом и графическом. В языке программирования Quick Basic предусмотрены способы вывода информации на экран в обоих режимах.

   Рассмотрим, что и каким образом можно выводить на экран в текстовом режиме.

   По умолчанию Quick Basic работает с монитором в текстовом режиме. В этом режиме на экран можно вывести все символы, которые есть на клавиатуре, и символы псевдографики. В текстовом режиме экран имеет 25 строк, в каждой строке 80 позиций (однако, с помощью оператора WIDTH 40 можно получить 40 “широких” позиций) для вывода символом, следовательно, максимальное количество символов, которое можно разместить на экране в текстовом режиме, равно 2000=25х80.

5.1.Управление цветом в текстовом режиме

   Оператор COLOR цвет_символа, цвет_фона устанавливает цвет выводимого символа и цвет фона под символом.

   Цвет символа - это число от 0 до 15, т.е. символ может быть выведен на экран одним из 16 цветов.

   Цвет фона - это число от 0 до 7.

   Если оператора COLOR в программе нет совсем, то Quick Basic по умолчанию устанавливает цвет 7 (белый) для символа и цвет 0 (черный) для фона.

   Каждый цвет - это комбинация трех основных цветов - красного, зеленого и синего. Каждый цвет может выводиться с низкой или высокой интенсивностью (яркостью).

Красный Зеленый Синий Обычный Яркий

0

0

0

 

0 - черный

 

8 – серый

0

0

1

 

1 - синий

 

9 - ярко-синий

0

1

0

 

2 - зеленый

 

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

0

1

1

 

3 - голубой (точнее, циан)

 

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

1

0

0

 

4 - красный

 

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

1

0

1

 

5 - фиолетовый

 

13 - ярко-фиолетовый

1

1

0

 

6 - коричневый

 

14 - желтый

1

1

1

 

7 - белый

 

15 - ярко-белый

   Составим таблицу цветов. Наличие в цвете какой-либо цветовой компоненты будем отмечать единицей, а ее отсутствие - нулем.

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

   Пример: обычный красный - 4; мигающий - 20.

   Задание. Загрузите программу PRG.BAS и сделайте полоски разных цветов.

 

5.2. Псевдографика

   Некоторые символы не так-то просто вывести на экран просто потому, что их нет на клавиатуре. Это, в частности, относится к символам псевдографики.

   Псевдографика - это символы, с помощью которых можно рисовать линии, рамки и другие графические изображения в текстовом режиме. Символы псевдографики отличаются от обычных символов тем, что занимают всю ширину (высоту) места, отведенного символу на экране. Поэтому они, будучи поставлены рядом, сливаются и образуют непрерывные линии.

   Чтобы вывести на экран символ, отсутствующий на клавиатуре, нужно нажать клавишу Alt и, не отпуская ее, другой рукой набрать код символа (число от 0 до 255). (Некоторые драйверы клавиатуры имеют режим набора псевдосимволов.)

   Приведем коды некоторых символов.

Одинарная рамка: Двойная рамка:

 

   Задача. Вывести на экран таблицу символов.

   Решение. С помощью функции CHR$ получим символ по его коду:

символ = CHR$(число)

и сразу выведем его на экран оператором PRINT. Чтобы все символы поместились на экране, расположим их в виде таблицы 16х16. Пронумеруем строки и столбцы таблицы числами от 0 до 15. Тогда код символа, стоящего на пересечении i-ой строки и j-го столбца, равен значению 16*i + j. Организуем вывод таблицы по строчкам:


CLS
FOR i = 0 TO 15
‘Выводим строку таблицы
   FOR j = 0 TO 15
      kod = 16*i + j
      LOCATE i + 5, 2* j + 5
      PRINT CHR$(kod)
   NEXT j
NEXT i

   Запишем программу под именем TABL.BAS и выполним ее. На экране появится таблица, однако некоторые места в ней останутся пустыми - для этих кодов нет графического представления. Но это не значит, что ими нельзя воспользоваться в программе! Так, например, при выполнении оператора PRINT CHR$(7) раздается звуковой сигнал, PRINT CHR$(12) очищает экран, PRINT CHR$(13) переводит курсор на новую строку и т.д.

   Конечно, чаще всего, те же действия можно выполнить “стандартными” операторами: BEEP - звуковой сигнал, CLS - очистка экрана, перевод строки делается автоматически после вывода на экран (если только в конце оператора PRINT не стоит точка с запятой для подавления перевода строки!). Иногда знание кода символа необходимо. Невозможно, например, вывести оператором PRINT текст, содержащий кавычки, так как последние воспринимаются как ограничители. Чтобы вывести на экран фразу: “Смотрите фильмы в кинотеатре “Космос”!” следует написать

PRINT “Смотрите фильмы в кинотеатре”; CHR$(34);“Космос”; CHR$(34); “!”

или

PRINT “Смотрите фильмы в кинотеатре”+ CHR$(34) +“Космос”+ CHR$(34) + “!”

   Вернемся к программе TABL.BAS. Поскольку вывод символа с кодом 12 эквивалентен оператору CLS, то с экрана сотрется изображения предыдущих символов, и мы их не увидим (разве что заметим, как что-то мелькнуло на экране). Вставим, поэтому, проверку условия: код символа не равен 12 (Так как знака “не равен” нет на клавиатуре, то он изображается двумя символами: <> или ><).


CLS
FOR i = 0 TO 15
   ‘Выводим строку таблицы
   FOR j = 0 TO 15
      kod = 16*i + j
      IF kod <> 12 THEN
         LOCATE i + 5, 2* j + 5
         PRINT CHR$(kod)
      END IF
   NEXT j
NEXT i

   Задания. Пользуясь символами псевдографики “нарисуйте” на экране рамку, лестницу, флаг, забор и т.д.

 

6. Работа с монитором в графическом режиме

   В графическом режиме минимальным элементом, который можно вывести на экран, является не символ, а пиксель. Пиксель (точка экрана) представляет собой крошечный прямоугольник, размеры которого зависят от установленного графического режима. Верхняя левая точка экрана имеет координату (0,0), ось ОХ направлена вправо, ось ОY – вниз, т.е. чем ниже на экране расположена точка, тем больше ее координата по оси OY..

   Оператор SCREEN номер режима переводит режим работы экрана из текстового в графический с заданным номером. Если оператор SCREEN не указан, то подразумевается текстовый режим. Текстовый режим имеет номер 0, поэтому, если нужно из графического режима перейти в текстовый, следует использовать SCREEN 0. Иногда при возврате из графического режима (например, из SCREEN 7) символы текста становятся широкими. Вернуть им нормальные размеры можно только оператором WIDTH 80.Графические режимы различаются разрешением (количеством “точек”) экрана и количеством возможных цветов.

   Например, SCREEN 7 устанавливает разрешение экрана в 320 точек по горизонтали и 200 точек по вертикали. Положение произвольной точки на экране задается двумя числами (x, y) в экранной системе координат. От декартовых координат эта система отличается тем, что ось Oy направлена вниз, а не вверх.

В графическом режиме на экран кроме символов можно выводить и геометрические фигуры: точки, линии, прямоугольники, окружности и т.д. Замкнутые фигуры можно закрашивать.

6.1. Рисование точек и линий

   Оператор PSET (x, y)[, цвет] закрашивает точку экрана заданным цветом.

   Оператор LINE (x1, y1)-(x2, y2)[, цвет] рисует отрезок, соединяющий на экране точки с координатами (x1, y1) и (x2, y2)

   Оператор LINE - (x2, y2)[, цвет] рисует отрезок, соединяющий последнюю выведенную на экран точку с точкой (x2, y2).

Цвет в этих операторах задается числом от 0 до 15. Если цвет в графических операторах не указан, то все линии рисуются белым цветом. (О том, какие могут быть цвета в различных графических режимах, мы поговорим позже.)

   Пример. Соединить точки (20, 45) и (38, 144).

  Первый способ: LINE (20, 45)-(38, 144)
  Второй способ: PSET (20, 45)
    LINE -(38, 144)

   Задание. Построить на экране треугольник, четырехугольник, пятиугольник; нарисовать домик. Записать программу “Домик” в файл HOUSE.BAS.

 

6.2. Прямоугольники и квадраты

   Рисовать домик отдельными линиями - не самый рациональный способ. Легко увидеть, что домик представляет собой прямоугольник с крышей из двух отрезков. (Так рисуют домик почти все, кроме гениальных фантазеров и профессиональных художников.) А нарисовать прямоугольник можно одним оператором

LINE (x1, y1)-(x2, y2), [цвет], B

   Этот оператор рисует рамку-прямоугольник со сторонами, параллельными границам экрана. Точки (x1, y1) и (x2, y2) суть две вершины прямоугольника, расположенные по одной из его диагоналей. Если параметр цвет отсутствует, то будет нарисована белая рамка. (Но “лишняя” запятая должна остаться!)

   Поскольку точки экрана представляют собой маленькие прямоугольнички, то попытка нарисовать квадрат оператором

LINE (20, 20)-(120, 120), , B

потерпит неудачу. Высота этого “квадрата” окажется больше, чем ширина, хотя обе стороны содержат одинаковое число пикселей. Уменьшим число точек в высоте “квадрата” в 1.2 раза (для SCREEN 1!) или во столько же раз увеличим ширину “квадрата” - только тогда мы получим истинный квадрат. Поправочный коэффициент назовем “коэффициентом вытянутости” пикселя.

   Оператор LINE (x1, y1)-(x2, y2), [цвет], BF рисует такой же, но закрашенный прямоугольник.

   Задача. Нарисовать на экране пирамиду из 10 ступенек-прямоугольников.

   Решение. Воспользуемся тем, что пирамида имеет осевую симметрию. Расположим ось пирамиды посредине экрана. Пронумеруем прямоугольники сверху вниз числами от 1 до 10. Очевидно, что значения x1, y1, x2, y2 зависят от номера прямоугольника. В силу симметрии, чтобы получить x1, нужно от 160 вычесть что-то, а чтобы получить x2 - прибавить столько же.

   Составим вспомогательную табличку.

Номер
ступеньки

x1

x2
1 160 - 10 160 + 10
2 160 - 20 160 + 20
3 160 - 30 160 + 30
... ... ...
10 160 - 100 160 + 100

   Легко заметить, что номер ступеньки-прямоугольника и величина добавки связаны зависимостью

добавка = 10*номер.

   Если обозначить через k номер ступеньки, получим формулы для вычисления x1 и x2:

x1 = 160 - 10*k

x2 = 160 + 10*k

   Значения y1 и y2 также зависят от номера и высоты ступеньки h, где h - некоторая заранее заданная величина (например, h = 10):

y1 = 40 + h*k

y2 = y1 + h

   Теперь можно составить программу.


SCREEN 7
h = 10
FOR k = 1 TO 10
   x1 = 160 - 10*k
   x2 = 160 + 10*k
   y1 = 40 + h*k
   y2 = y1 + h
   LINE (x1, y1)-( x2, y2), , B
NEXT k

   Задание. Запишите программу под именем PIRAMIDA.BAS. Измените высоту, ширину, цвет ступенек. Составьте пирамиду из закрашенных прямоугольников; из закрашенных прямоугольников с рамкой другого цвета.

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

6.3. Окружности и дуги

   Оператор CIRCLE (x, y), радиус[, цвет] рисует окружность заданного радиуса и цвета с центром в точке (x, y). Если вся окружность на экране не поместится, то будет нарисована только ее часть. Радиус окружности задается в пикселях, но такое количество пикселей укладывается только по горизонтали. Размер вертикального радиуса (в пикселях) зависит от номера графического режима.

   Задача. Нарисовать несколько концентрических окружностей (“мишень”).

Решение.

SCREEN 7
FOR r = 5 TO 65 STEP 5
   CIRCLE (160, 100), r, 3
NEXT r

   Задание. Запишите программу под именем MISHEN.BAS. Сделайте шаг в цикле равным 3, 2, затем 1 (но не 0, так как программа “зациклится”!). Объясните возникающий при этом эффект. Измените положение “мишени” на экране так, чтобы ее часть ушла за экран. Введите зависимость положения центра окружности от ее радиуса. Поэкспериментируйте с несколькими разноцветными “мишенями”.

   Тем же оператором можно нарисовать и дугу, только дополнительно потребуется задать значения начального и конечного углов дуги:

CIRCLE (x, y), радиус, [цвет], нач_угол, кон_угол

   Если поместить в точку (x, y) начало математической системы координат, то начальный и конечный углы откладываются от оси Ox в направлении против часовой стрелки.

   Начальный угол может быть больше конечного, но принцип рисования дуги останется прежним.

   Углы дуги должны задаваться в радианах. Поскольку это не всегда удобно, автор рекомендует переводить градусы в радианы каждый раз, как это потребуется. Коэффициент пропорциональности QR вычисляется по формуле QR = p/180, где p » 3.14159265358 всем известная константа. Конечно, можно использовать и конкретное значение коэффициента: QR » 0.0174329252.

   Пример. Изобразите на листе бумаги, что получится на экране после выполнения программы:


SCREEN 7
QR = 0.0174329252
CIRCLE (100, 50), 60, 2, 270*QR, 0
CIRCLE (220, 50), 60, 2, 180*QR, 270*QR
CIRCLE (100, 150), 60, 2, 0, 90*QR
CIRCLE (220, 150), 60, 2, 90*QR, 180*QR

   Правильность ответа проверьте на компьютере.

   Замечание. Математики рассматривают как положительные, так и отрицательные углы. В операторе CIRCLE также могут использоваться отрицательные значения для начального и конечного углов, однако здесь знак минус “сообщает”, что следует не только нарисовать дугу, но и провести один или оба радиуса. Измените предыдущую программу, посмотрите, что получится на экране. Учтите, что с точки зрения Quick Basic’а “отрицательный” нуль ничем не отличается от обычного, поэтому замените его очень маленьким отрицательным числом, например, - 0.001.

 

   Задания для самостоятельной работы

Составьте программы, которые выводят на экран следующие картинки:

 

6.4. Графические режимы

   SCREEN 1 - это устаревший графический режим, используемый в Quick Basic только для совместимости с некоторыми мониторами. В этом режиме доступны одновременно только 4 цвета (включая цвет фона). Одному и тому же номеру соответствуют разные цвета в зависимости от выбранной палитры:

Номер цвета Палитра №1 Палитра №2

1

голубой (3)

зеленый (2)

2

фиолетовый (5)

красный (4)

3

белый (7)

коричневый (6)

   Оператор COLOR в этом режиме имеет свой особый синтаксис:

COLOR цвет_фона, номер_палитры

   Выбор цвета фона намного богаче - он может быть любым из 16 основных цветов (от 0 до 15).

   По умолчанию SCREEN 1 устанавливает первую палитру.

   SCREEN 2 задает разрешение 640 точек по горизонтали на 200 точек по вертикали. В этом графическом режиме возможны только два цвета - черный и белый, заданные “раз и навсегда”. Использование оператора COLOR в этом режиме некорректно и вызовет сообщение об ошибке “Illegal function call” (“Недопустимый вызов функции”).

   Высота пикселя в этом режиме больше его ширины в 2.4 раза.

SCREEN 7 задает разрешение 320 точек по горизонтали на 200 точек по вертикали, следовательно, “коэффициент вытянутости” пикселя, как и в SCREEN 1 равен 1.2..

   В этом и следующих режимах оператор COLOR управляет цветом линий, цветом фона экрана и цветом символов текста. Можно указывать цвет рисования и в каждом графическом операторе (если цвет пропущен, то линия рисуется цветом, заданным в операторе COLOR, а если нет и оператора - то ярко-белым цветом). Оператор COLOR имеет следующий вид:

COLOR цвет_линии, цвет_фона

   Цвет линии - число от 0 до 15, цвет фона - число от 0 до 7. Заданные параметры распространяются и на текстовый вывод, но в отличие от текстового режима нельзя вывести на экран мигающие символы. Кроме того, изменение цвета фона действует и на уже выведенный текст!

   SCREEN 8 задает разрешение 640 точек по горизонтали на 200 точек по вертикали (“коэффициент вытянутости” = 2.4), а SCREEN 9 - 640 точек по горизонтали на 350 точек по вертикали. Точное значение “коэффициента вытянутости“ в SCREEN 9 равно 48/35. что практически равно 1.37.

   Для мониторов типа VGA и SVGA возможны и другие графические режимы. Чаще всего используются режим SCREEN 12 с разрешением 640 точек по горизонтали на 480 точек по вертикали, в котором “коэффициент вытянутости” в точности равен 1. Однако в этом режиме в операторе COLOR указывается только один параметр - цвет линии (символа). Цвет фона оператором не задается!

   Задание. Загрузите программу PIRAMIDA.BAS и посмотрите результат выполнения в рассмотренных графических режимах. Сделайте ступеньки пирамиды разных цветов. Подпишите рисунок (используйте оператор COLOR для задания цвета фона и символов текста).

 

6.5. Закраска произвольной области

   Если на экране нарисована замкнутая кривая, то область внутри нее можно закрасить. Также можно закрасить и область, оставшуюся снаружи от кривой. Для этого используется оператор

   PAINT (x, y), цвет_закраски, цвет_границы

   Точка (x, y) должна попасть внутрь области, подлежащей закрашиванию.

   Если граница области “дырявая”, то краска выльется за пределы области, даже если дырка всего в один пиксель. То же самое произойдет, если граница области содержит по недосмотру кусочек другого цвета - для оператора PAINT это все равно что дырка.

   Пример. Нарисовать флаг Японии - красный круг на белом фоне.

 


‘--------- Флаг Японии ---------
SCREEN 7
LINE (10, 10)-(100, 50), 15, BF
CIRCLE (55, 30), 20, 12
PAINT (55, 30), 12, 12

   Задание. Нарисовать флаги предложенных ниже стран или любой другой страны.

   Чтобы упростить построение сложного контура, можно составить его из нескольких простых. Например, крест на флаге Швеции сделать из двух закрашенных прямоугольников, серп на флаге Турции - из двух кругов, один из которых закрасить белым, а другой, меньший, красным.

   При закраске окружности в качестве начальной точки для оператора PAINT удобно брать центр окружности, в других случаях, особенно при закраске маленьких областей, легко промахнуться мимо области. Чтобы проконтролировать расположение начальной точки, заменим оператор PAINT оператором PSET(x, y). Убедимся в том, что точка (x, y) попала в нужное место, и после этого вернем оператор PAINT на свое законное место.

 


[ Назад | Оглавление | Далее ]









helloworld.ru © 2001-2021
Все права защищены
Rambler's Top100