Построение прямоугольников и ломаных




Для построения прямоугольника достаточно вызвать процедуру

Rectangle(Х1, Y1, Х2, Y2: Integer),

которая изобразит на экране прямоугольник с диагональю (X1, Y1) — (X2, Y2). Для рисования квадрата надо выбрать высоту прямоугольника так, чтобы она равнялась произведению ширины на коэффициент сжатия изображения (см. разд. 19.4.2).

Чтобы построить фигуры с большим количеством вершин (в том числе и незамкнутые), можно воспользоваться процедурой

DrawPoly(NumPoints: Word; VAR PolyPoints)

Она позволяет рисовать на экране дисплея любую ломаную, заданную набором координат некоторого множества точек. Это может быть как сложная геометрическая фигура, так и табличная математическая функция. Параметр NumPoints — это количество точек ломаной (заметим, что если необходимо нарисовать замкнутый многоугольник с N вершинами, то значение NumPoints должно быть на единицу больше числа N, а координата (N+1)-й точки должна быть такой же, как координата первой). Под бестиповым параметром PolyPoints понимается какая-либо переменная, состоящая из наборов двухкомпонентных записей. Поля каждой записи должны содержать координаты X и Y очередной точки. В модуле Graph введен такой тип:

TYPE

PointType = RECORD

X, Y: Integer { координаты точки }

END; {430}

Обычно набор точек организуется как массив из записей типа PointType (и именно к такой структуре приводится значений параметра Poly Point при работе процедуры DrawPoly). Пример построения графика функции с помощью процедуры DrawPoly приведен на рис. 19.14.

USES Graph; { подключен модуль Graph } {$I initgraf.pas} { процедура инициализации } CONST Pi = 3.14151828; * { константа Pi (замещает функцию) } Pi2 = 2*Pi; { различные производные от Pi... } Pi001 = 0.01*Pi; VAR angle: Real; sine_func: Array[1..201] of PointType; {массив точек } maxy, i: Integer; BEGIN GrInit; { инициализация графики } maxy:= GetMaxY div 2; { середина экрана по оси Y } angle:= 0.0; { задание стартовых значений } i:= 0; { счетчик точек в sine_func } repeat { цикл заполнения sine_func } Inc(i); sine_func[i].x:= Round(100*angle) + 10; sine_func[i].y:= Round(100*Sin(angle)) + maxy; angle:= angle + Pi001; until angle > Pi2; DrawPoly(i,sine_func); { рисование графика синуса } ReadLn; { пауза до нажатия ввода } CloseGraph { закрытие графики } END.

Рис. 19.14

С помощью DrawPoly можно вывести график части функции. Для этого достаточно указать при передаваемом массиве номер n первого рассматриваемого элемента (т.е. точки), а в первом параметре — количество рассматриваемых точек, начиная с n-й, например

DrawPoly(20, sine_func[100]);

Такой вызов выведет ломаную по точкам с номерами 100, 101,..., 119.

При выводе количества точек, соизмеримого со значением GetMaxX, и при несплошном стиле линии может оказаться, что шаг между соседними точками соответствует ширине пробела между пунктиром. В итоге линия может вообще не проявиться на экране. Надо либо уменьшить число точек, либо избрать сплошной тип линии. {431}

Управление цветами и шаблонами заливки (заполнения)

Здесь будут рассмотрены процедуры, управляющие цветовой гаммой изображения на дисплее, что не только определяет степень разборчивости и привлекательности изображения, но и в конечном итоге может влиять на физиологическое состояние пользователя. Для создания программ, не вызывающих усталости у человека, необходимо знать начала цветовой теории или, как ее еще называют, «цветовой гармонии».

Немного о цветах

Говоря о цветах, профессионалы пользуются специфической терминологией (рис. 19.15). Хроматические цвета — это все, кроме белого, черного и серых. Нейтральные цвета (белый, черный и серые) называются ахроматическими.

┌────────┐

┌───────────┐ ┌──────────┤ белый │

│Ахроматические │ │ └─────┘

│ цвета ├───────┤ ┌─────┐

└───────────┘ ├──────────┤черный│

│ └─────┘

│ ┌─────┐

└──────────┤ серый │

└─────┘

┌───────┐ ─┐

┌───────────┐ ┌──────────┤ красный │ │

│Хроматические │ │ └───────┘ │

│ цвета ├───────┤ ┌───────┐ │

└───────────┘ ├──────────┤ жёлтый │ │ четыре базовых

│ └───────┘ │ цвета,

│ ┌───────┐ │ различаемых

├──────────┤ зелёный │ │ человеческим

│ └───────┘ │ глазом

│ ┌───────┐ │

├──────────┤ синий │ │

│ └───────┘ ┘

│ ┌ ─ ─ ─ ─ ┐

├ ─ ─ ─ ─ ─ ─ ─ ┤

│ └ ─ ─ ─ ─ ┘

┌ ─ ─ ─ ─ ┐

└ ─ ─ ─ ─ ─ ─ ─ ┤

└ ─ ─ ─ ─ ┘

Рис. 19.15

Очень важным является понимание различия между цветовым тоном, светлотой и насыщенностью цвета. Цветовой тон отличает один хроматический цвет от другого определенным тоном пигмента — {432} краски. Он является основным признаком, эффективно используемым в так называемых цветовых треугольниках или кругах (рис. 19.16), которые могут быть применены для создания различных видов цветовых сочетаний, производящих индивидуальные (эмоциональный и физиологический) эффекты и визуальное воздействие. Цветовые тона разделяются на теплые и холодные: теплые тона — это красные, желтые, оранжевые и т.д.; холодные тона — это зеленые и синие.

Рис. 19.16

Под светлотой цвета обычно понимается его яркость.

Насыщенностью цвета называют относительную серость или чистоту цвета. Например, оранжевый — сильно насыщенный, а рыжевато-коричневый — слабо насыщенный. Насыщенность часто называют интенсивностью.

Цветовое колесо, показанное на рис. 19.16, получается из стандартного цветового круга. Цветовой круг создан четырьмя базовыми цветовыми тонами, воспринимаемыми человеческим глазом: красным, желтым, зеленым и синим. Восприятие совокупности цветных точек как единого целого (хорошо известное свойство зрения) используется в кинескопах дисплеев ПЭВМ, Базовые цвета в триадах точек люминофора — красный (red), синий (blue), зеленый (green) — могут смешиваться в определенных пропорциях (это имеет место в RGB-дисплеях). При этом можно получить практически все существующие в природе цветовые тона.

Правильный подбор цветовой комбинации на экране называют гармонией.

Аналоговая гармония — это комбинация цветовых тонов, которые являются соседними в цветовом круге (рис. 19.17). В зависимости от {433} стороны цветового круга она передает ощущение тепла или холода. Наиболее полными являются аналоговые гармонии, построенные на таких цветах, как оранжевый, фиолетовый и желто-зеленый.

Рис. 19.17

Дополняющая гармония разделяется на так называемую прямую и разделенно-дополняющую. Прямая гармония — это совокупность цветов, которые прямо противостоят друг другу в цветовом круге (рис. 19.18). Например, красно-зеленая гамма — это прямая гармония. Она обычно создает впечатление сильного удара, импульса.

Рис. 19.18

Составная гармония формируется комбинацией цветов, которые расположены в вершинах треугольника, вписанного в цветовой круг. Составная гармония называется также троичной гармонией. Красно-желто-синяя комбинация — это типичный пример троичной гармонии.

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

Цвет/Белый/Черный = Цветовая смесь

Наглядно она представлена на рис. 19.19. {434}

────────────────────── ШКАЛА БЕЛОГО ──────────────────────

┌───────┐ │

┌────────┤ белый │ │

┌────────┤ │ 0/100/0 │ │

│ │ 10/90/0 ├───────┤ Ш

┌────────┤ 25/75/0 │ │ 0/90/0 │ К

│ ├────────┼────────┤ │ А

┌────────┤ 50/50/0 │ 45/50/5 │ 20/75/5 ├───────┤ Л

│ Чистый ├────────┼────────┤ │ │ А

│ цвет │ │ ├────────┤ │

│ 100/0/0 │ 75/20/5 │ 60/30/10 │ 40/45/15 │ 0/75/25 │ С

│ ├────────┼────────┼────────┤ │ Е

└────────┤ │ │ ├───────┤ Р

│ 90/8/10 │ 60/20/20 │ 40/30/30 │ 0/50/50 │ О

└────────┼────────┼────────┤ │ Г

│ 75/0/25 │ ├───────┤ О

└────────┤ 50/0/50 │ 0/0/100 │ │

└────────┤ чёрный │ │

└───────┘ │

────────────────────── ШКАЛА ЧЕРНОГО ──────────────────────

Рис. 19.19

Человеческий глаз может точно распознавать девять оттенков серого между чисто-белым и чисто-черным (рис. 19.20).

Чисто чёрный
 
 
 
 
 
 
 
 
 
Чисто белый

0%
15%
35%
50%
65%
75%
85%
90%

95%
98%
100%
Белый
Чёрный
100%
85%
65%
50%
35%
25%
15%
10%
5%

2%
0%

Рис. 19.20

Задание типа заливки

В модуле Graph предусмотрены процедуры, с помощью которых можно заполнить (залить) определенным «узором» любую замкнутую область изображения. Вид «узора» задается так называемым шаблоном заливки. В Турбо Паскале предопределен ряд стандартных шаблонов, но кроме того, имеется возможность конструировать собственные.

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

               
               
               
               
               
               
               
               
3%
               
               
               
               
               
               
               
               
6,25%
               
               
               
               
               
               
               
               
12,5%
               
               
               
               
               
               
               
               
0%

На этом рисунке изображены типовые матрицы 8x8, используя которые можно создать полутоновые изображения любыми двумя {435}

               
               
               
               
               
               
               
               
25%
               
               
               
               
               
               
               
               
37,5%
               
               
               
               
               
               
               
               
50%
               
               
               
               
               
               
               
               
62,5%

 

               
               
               
               
               
               
               
               
87,5%

 

               
               
               
               
               
               
               
               
75%
               
               
               
               
               
               
               
               
100%
               
               
               
               
               
               
               
               
93%

 

 

Рис. 19.21

цветами. Тип переменной для задания матрицы заполнения объявлен в модуле Graph как массив:

TYPE

FillPatternType: Array [1..8] of Byte

Таким образом, каждую матрицу можно представить, как показано на рис. 19.22.

Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7 Byte 8

7 6 5 4 3 2 1 0

               
               
               
               
               
               
               
               

 

Рис. 19.22 {436}

Если рассмотреть первую строку в шаблоне 25%-го заполнения, то получится 01000100 в двоичной системе счисления (68 в десятеричной или $44 в шестнадцатиричной). Следующая строка — 00010001 в двоичной (17 в десятеричной или $11 в шестнадцатеричной) и т.д. В результате мы можем получить константу

CONST

Fill_25: FillPatternType =

($44, $17, $44, $17, $44, $17, $44, $17)

Подобные константы можно задать для любого из шаблонов с рис. 19.21. Если программы должны работать на ПЭВМ с монохромным дисплеем (MDA, Hercules), то наличие разных по яркости шаблонов заполнения может скомпенсировать отсутствие цветных возможностей у монитора.

19.5.2.2. Назначение шаблона заполнения (заливки). Оно производится процедурой

SetFillStyte(Pattern: Word; Color: Word)

где параметр Pattern определяет вид шаблона заливки, a Color — его цвет. Все разрешенные значения параметра Pattern предопределены в модуле Graph в виде констант:

CONST

EmptyFill = 0 { сплошная заливка цветом фона }

SolidFill = 1 { сплошная заливка текущим цветом }

LineFill = 2 { заливка типа === }

LtSlashFill = 3 { заливка типа /// }

SlashFill = 4 { заливка жирными линиями типа /// }

BkSlashFill = 5 { заливка жирными линиями типа \\\ }

LtBkSlashFill = 6 { заливка типа \\\ }

HatchFill = 7 { заливка редкой штриховкой }

XHatchFill = 8 { заливка частой штриховкой }

InterleaveFill =9 { заливка прерывистой линией }

WideDotFill = 10 { заливка редкими точками }

CloseDotFill = 11 { заливка частыми точками }

UserFill = 12 { заливка, определенная программистом }

Наиболее интересна здесь константа UserFill. Она используется для определения типа заливки, который предварительно был задан в программе. Для задания своего нового шаблона необходимо воспользоваться процедурой

SetFillPattern(PattMatrix: FillPatternType; Color: Word)

передав ей в параметре PattMatrix матрицу шаблона заливки и указав цвет параметром Color. Эта процедура по действию, вообще говоря, {437} аналогична SetFillStyle, но устанавливает только «самодельные» шаблоны. Процедура SetFillStyle удобнее, особенно в приложениях деловой графики (гистограммы, круговые диаграммы и т.п.). Задавая хотя бы раз новый шаблон, мы автоматически связываем его со значением UserFill и далее можем манипулировать всеми тринадцатью шаблонами. Если же задать UserFill, не определив перед этим новый шаблон, то функция GraphResult возвратит значение -11 (grError) и все установки вида шаблона и цвета останутся прежними. По умолчанию устанавливается шаблон SolidFill и цвет с номером, максимальным для текущего графического режима.

Несколько слов о назначении цвета при заливке. В обеих процедурах назначения шаблона переменная Color определяет цвет, которым исполняется шаблон. Цвет фона при этом остается неизменным. Это создает некоторые трудности при создании цветовой смеси. Например, цвет фона обычно задается черным (Black), а требуется создать 50%-ю смесь коричневого и синего цветов. Казалось бы, просто: рисуем фигуру, заливаем ее сплошным коричневым и потом заливаем ее 50%-м шаблоном синего. Однако после этих операций получится фигура, залитая чисто синим 50%-и яркости. Дело в том, что процедуры заливки в Турбо Паскале реализованы, на наш взгляд, не очень корректно (чего нельзя сказать о реализации этих процедур в системе Quick Pascal фирмы Microsoft): там, где в двоичном коде шаблона стоят единицы, процедуры ставят точки цвета Color, а там, где нули, — вместо того чтобы ничего не рисовать, они ставят точки цвета текущего фона. Выход из этой ситуации может быть найден с помощью средств, описанных в разд. 19.5. «Управление палитрой».

19.5.2.3. Анализ шаблона заполнения. Рассмотрим процедуры получения информации о текущих установках шаблонов заливки. Так, процедура

GetFillSettings(VAR FillType: FillSettingsType)

возвращает в переменной FillType предопределенного типа

TYPE

FillSettingsType = RECORD

Pattern: Word; { шаблон }

Color: Word; { цвет }

END;

номер шаблона из списка, представленного при описании процедуры SetFillStyle (поле Pattern), и цвет, которым наносится этот шаблон (поле Color). Если значение поля Pattern оказалось равным UserFill, {438} то для получения подробной информации следует вызвать процедуру

GetFillPattern(VAR PattMatrix: FillPatternType)

возвращающую в переменной типа FillPatternType матрицу последнего определенного пользователем шаблона.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: