Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lb3_Графика

.pdf
Скачиваний:
9
Добавлен:
21.03.2015
Размер:
313.28 Кб
Скачать

Логические выражения. Графика

ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ. ИСПОЛЬЗОВАНИЕ ГРАФИКИ

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

Средства рисования в Delphi

Рисование в Delphi не представляет больших сложностей. При разработке проекта в распоряжении программиста находится полотно (холст) – свойство Canvas, карандаш (свойство Реn), кисть (свойство Brush) и шрифт (свойство TFont). Свойством Canvas обладают компоненты:

форма (класс TForm);

таблица (класс TSringGrid);

растровая картинка (класс Timage);

принтер (класс TPrinter).

При рисовании компонента, обладающего свойством Canvas, сам компонент

рассматривается как прямоугольная сетка, состоящая из отдельных точек, называемых пикселями. Положение пикселя характеризуется его вертикальной (X) и горизонтальной (Y) координатами. Левый верхний пиксель имеет координаты (0,0). Вертикальная координата возрастает сверху вниз, горизонтальная слева направо. Общее количество пикселей по вертикали определяется свойством Height, по горизонтали свойством Width. Каждый пиксель может иметь свой цвет. Для доступа к любой точке полотна используется свойство Pixels[X,Y]:TColor. Это свойство определяет цвет пикселя полотна с координатами

X (integer), Y (integer).

Изменить цвет любого пикселя полотна можно с помощью следующего оператора присваивания:

Компонент.Canvas.Pixels[X,Y]:=Color;

где Color переменная или константа типа TColor. В Delphi определены следующие константы цветов (табл. 1.).

Таблица 1. Значение свойств Color

Константа Цвет

clBlack Черный

clMaroon Каштановый

clGreen Зеленый

clOlive Оливковый

clNavy Темно-синий

clPurple Розовый

clTeal Лазурный

clGray Серый

Константа Цвет

clSilve Серебристый

clRed Красный

clLime Салатовый

clBlue Синий

clFuchsia Ярко-розовый

с1Aqua Бирюзовый

clWhite Белый

Цвет любого пикселя можно получить с помощью оператора присваивания:

Color:=Компонент.Canvas.Pixels[X,Y];

где Color переменная типа TColor.

Полоз М.И.

1

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

Класс цвета точки TColor определяется как длинное целое longint. Переменные этого типа занимают в памяти четыре байта. В шестнадцатеричной системе класс TColor представляет собой диапазон $80000000..$7FFFFFFF . Четыре байта переменных этого типа содержат информацию о долях синего (В), зеленого (G) и красного (R) цветов и устроены следующим образом: $00BBGGRR. Доля каждого цвета может меняться от 0 до 255.

Для рисования используются методы класса TCanvas, позволяющие изобразить фигуру (линию, сектор и т.д.) или вывести текст в графическом режиме, и три класса, определяющие инструменты вывода фигур и текстов:

TFont (шрифты);

ТРеn (карандаш, перо);

TBrush (кисть).

Рассмотрим инструменты TFont, TPen, TBrush.

Класс TFONT

Можно выделить следующие свойства объекта Canvas.TFont:

1.Name (тип string) – имя используемого шрифта.

2.Size (тип integer) – размер шрифта в пунктах (points). Пункт единица измерения

размера

шрифта,

используемая

в

полиграфии.

Один

пункт

равен 1/72 дюйма.

 

 

 

 

 

3.

Style стиль начертания символов, который может быть нормальным, полужирным

(fsBold), курсивным (fsltalic), подчеркнутым (fsUnderline) и перечеркнутым (fsStrikeOut).

Свойство Style является множеством, что позволяет комбинировать необходимые стили. Например, оператор программы, устанавливающий стиль «полужирный курсив» выглядит так:

Объект.Canvas.Font.Style:=[fsltalic,fsBold]

4.Color (тип TColor) – цвет символов.

5.Charset (тип 0..255) – набор символов шрифта. Каждый вид шрифта, определяемый его именем, поддерживает один или более наборов символов. В табл. 2 приведены некоторые возможные значения Charset.

Таблица 2. Возможные значения Сharset

Константа

Значение

Описание

 

 

 

ANSI_CHARSET

0

Символы ASCII

 

 

 

 

 

Задается по умолчанию. Шрифт выбирается только по его

DEFAULT_CHARSET

1

имени Name и размеру Size. Если описанный шрифт

недоступен в системе, то Windows заменит его другим

 

 

 

 

шрифтом

 

 

 

SYMBOL_CHARSET

2

Стандартный набор символов

 

 

 

MAC_CHARSET

77

Символы Macintosh

 

 

 

GREEC_CHARSET

161

Греческие символы

 

 

 

RUSSIAN_CHARSET

204

Символы кириллицы

 

 

 

 

 

Включает диакритические знаки (знаки, добавляемые к

EASTEUROPE_CHARSET

238

буквам и характеризующие их произношение) для восточно-

 

 

европейских языков

Полоз М.И.

2

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

Класс TPEN

Карандаш (перо) используется как инструмент для вычерчивания точек, линий, контуров геометрических фигур. Рассмотрим основные свойства объекта Canvas.TPen:

Соlоr (тип TColor) – определяет цвет линий;

Width (тип Integer) – позволяет указать толщину линии в пикселях;

Style дает возможность выбрать вид линии. Это свойство может принимать

значения, указанные в табл. 3.

Таблица 3. Вид линии

Значение

Описание

 

 

psSolid

Сплошная линия

 

 

psDash

Штриховая линия

 

 

psDot

Пунктирная линия

 

 

psDashDot

Штрих-пунктирная линия

 

 

psDashDotDot

Линия, чередующая штрих и два пунктира

 

 

psClear

Отсутствие линии

 

 

Mode определяет, каким образом взаимодействуют цвета пера и полотна. Выбор значения Mode позволяет получать различные эффекты. Возможные значения Mode приведены в табл. 4. По умолчанию вся линия вычерчивается цветом, определяемым значением Pen.Color. Однако можно определять инверсный цвет линии по отношению к цвету фона. Это гарантирует, что независимо от цвета фона (даже если цвет линии и фона одинаков) линия будет видна.

Таблица 4. Возможные значения свойства Mode

 

Режим

Операция

Цвет пикселя

 

 

 

 

 

pmBlack

Black

Всегда черный

 

 

 

 

 

pmWhite

White

Всегда белый

 

 

 

 

 

pmNop

Неизменный

 

 

 

 

 

pmNot

Not Screen

Инверсный цвет по отношению к цвету фона

 

 

 

 

 

pmCopy

Pen

Цвет, указанный в свойстве Color пера Pen (по умолчанию)

 

 

 

 

 

pmNotCopy

Not Pen

Инверсия цвета пера

 

 

 

 

 

pmMergePenNot

Pen or Not Screen

Дизъюнкция цвета пера и инверсия цвета фона

 

 

 

 

 

pmMaskPenNot

Pen and Not Screen

Конъюнкция цвета пера и инверсного цвета фона

 

 

 

 

 

pmMergeNotPen

Not Pen or Screen

Дизъюнкция цвета фона и инверсного цвета пера

 

 

 

 

 

pmMaskNotPen

Not Pen and Screen

Конъюнкция цвета фона и инверсного цвета пера

 

 

 

 

 

pmMerge

Pen or Screen

Дизъюнкция цвета пера и цвета фона

 

 

 

 

 

pmNotMerge

Not (Pen or Screen)

Инверсия режима pmMerge

 

 

 

 

 

pmMask

Pen and Screen

Конъюнкция цвета пера и цвета фона

 

 

 

 

 

pmNotMask

Not (Pen and Screen)

Инверсия режима pmMask

 

 

 

 

 

pmXor

Pen xor Screen

Операция xor над цветом пера и цветом фона

 

 

 

 

 

pmNotXor

Not (Pen xor Screen)

Инверсия режима pmXor

 

 

 

 

Полоз М.И.

 

3

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

Класс TBRUSH

Кисть (Canvas.Brush) используется методами, обеспечивающими вычерчивание замкнутых фигур для заливки. Кисть обладает двумя основными свойствами:

Color (тип TColor) – цвет закрашивания замкнутой области;

Style стиль заполнения области. Это свойство может принимать следующие значения (рис. 5).

Таблица 5. Стили заполнения области

Значение

Описание

 

 

bsSolid

Сплошная заливка

 

 

bsCross

Прямая решетка

 

 

bsHorizontal

Параллельные горизонтальные линии

 

 

bsVertical

Параллельные вертикальные линии

 

 

bsBDiagonal

Параллельные диагональные линии, направленные вниз

 

 

bsFDiagonal

Параллельные диагональные линии, направленные вверх

 

 

bsDiagCross

Косая решетка

 

 

bsClear

Заливка отсутствует

 

 

Класс TCANVAS

Как было отмечено выше, основным инструментом для рисования графики является класс Canvas. Рассмотрим наиболее часто используемые методы класса Canvas.

Procedure MoveTo(X, Y:lnteger);

Метод MoveTo изменяет текущую позицию пера на позицию, заданную точкой (X, Y). Текущая позиция хранится в переменной PenPos типа TPoint. Определение типа TPoint следующее:

type TPoint=record

X:Longint;

Y:Longint;

end;

Текущую позицию пера можно считывать (но не устанавливать, для установки служит метод MoveTo) с помощью свойства PenPos следующим образом:

X:=PenPos.X;

Y:=PenPos.Y;

Procedure LineTo(X, Y:Integer);

Метод LineTo соединяет прямой линией текущую позицию пера и точку с координатами (X, Y). При этом текущая позиция пера перемещается в точку с координатами

(X, Y).

Расположим на форме кнопку. Рассмотрим процедуру обработки события TForml.Button1Click, которая позволяет нарисовать прямую линию:

procedure TForml.ButtonlClick(Sender:TObject); begin

Forml.Canvas.LineTo(45,65);

end;

В результате щелчка по кнопке на экране возникнет прямая линия, соединяющая точку с координатами (0,0) и точку с координатами (45, 65). Изменим процедуру обработки события следующим образом:

Полоз М.И.

4

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

procedure TForm1.Button1Click (Sender:TObject); begin

Forml.Canvas.LineTo(Canvas.PenPos.x+45, Canvas.PenPos.y+65); end ;

В чем отличие работы процедур? При однократном щелчке никакого отличия нет. При повторном щелчке первая процедура продолжает рисовать линию, соединяющую точки (0,0) и (45,65). Вторая процедура рисует линию, которая соединяет текущую точку с точкой, получившейся из текущей добавлением к координате X числа 45, а к координате Y – числа 65. При повторном щелчке по кнопке вторая процедура соединяет прямой линией точки (45,65) и (90,130). При третьем щелчке по кнопке будут соединяться прямой линией точки

(90,130) и (135,195) и т.д.

Procedure PolyLine(const Points array of TPoint);

Метод PolyLine строит ломаную линию, координаты вершин которой определяются массивом Points. Рассмотрим пример использования этого метода. На форме расположим кнопку. Пример процедуры обработки события, предназначенной для рисования ломаной линии:

procedure TForm1.Button1Click(Sender: TObject); Var gr:array[1..25] of TPoint;

i,j:Integer; begin

j:=1;

for i:=1 to 25 do begin gr[i].x:=25+(i-1)*9; gr[i].y:=100-j*(i-1)*3; j:=-j;

end;

Form1.Canvas.Polyline(gr);

end;

В результате щелчка по кнопке на экране появится ломаная линия, изображенная на рисунке.

Procedure Ellipse(X1, Y1, X2, Y2:Integer);

Метод Ellipse вычерчивает эллипс или окружность на холсте. X1, Y1, X2, Y2 –

координаты прямоугольника внутри которого вычерчивается эллипс Если прямоугольник является квадратом, получается окружность.

Procedure Arc(X1, Yl, Х2, Y2, ХЗ, Y3, Х4, Y4: Integer);

Полоз М.И.

5

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

Метод вычерчивает дугу эллипса. Координаты X1, Y1, X2, Y2 – параметры, определяющие эллипс, частью которого является дуга. Х3, Y3 – координаты, определяющие начальную точку дуги, Х4, Y4 – координаты, определяющие конечную точку дуги. Дуга рисуется против часовой стрелки.

Procedure Rectangle(X1, Y1, Х2, Y2: Integer);

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

Procedure RoundRec(X1, Yl, Х2, Y2, Х3, Y3: Integer);

Метод вычерчивает прямоугольник со скругленными углами. X1, Y1, X2, Y2 – координаты верхнего левого угла и нижнего правого угла прямоугольника. Х3, Y3 – размер эллипса, одна четверть которого используется для вычерчивания скругленного угла.

Procedure PolyGon(const Points array of TPoint);

Метод Polygon рисует замкнутую фигуру (многоугольник) по множеству угловых точек, заданному массивом Points. Первая из указанных точек соединяется прямой с последней. Этим метод Polygon отличается от метода Polyline, который не замыкает конечные точки. Рисование проводится текущим пером Реn. Внутренняя область фигуры закрашивается текущей кистью Brush.

Procedure Pie(Xl, Yl, X2, Y2, X3, Y3, X4, Y4: Integer);

Метод Pie рисует замкнутую фигуру сектор окружности или эллипса, с помощью текущих параметров пера Реn. Фигура заполняется текущим значением Brush. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X3, Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4,Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Рисуются прямые, ограничивающие сегмент и проходящие через центр эллипса и точки (X3,Y3) и (X4,Y4).

Procedure TextOut(X, Y: Integer; const Text: string);

Функция TextOut пишет строку текста Text, начиная с позиции с координатами (X,Y). Надпись делается в соответствии с текущими установками шрифта Font. Фон надписи определяется установками текущей кисти. Текущая позиция PenPos пера Реn перемещается к концу выведенного текста. Для выравнивания позиции текста на канве можно использовать методы, позволяющие определить высоту и длину текста в пикселях:

TextExtent, TextHeight и TextWidth.

Рассмотрим эти функции более подробно.

function TextExtent(const Text: string):TSize;

Функция возвращает структуру типа TSize, содержащую длину и высоту в пикселях текста Text, который предполагается написать на канве текущим шрифтом.

type

TSize = record сx: Longint; су: Longint; end;

Функция TextHeight(const Text:string):Integer возвращает высоту в пикселях текста Text, который предполагается написать на канве текущим шрифтом.

Функция TextWidth(const Text:string):Integer возвращает длину в пикселях текста Text, который предполагается написать на канве текущим шрифтом. Это позволяет

Полоз М.И.

6

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

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

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

Мы рассмотрели основные функции рисования на компоненте. Теперь можно перейти к рисованию. Но перед этим следует заметить, что если Вы свернете окно с графикой, а затем его восстановите, то картинка на экране исчезнет. Изменение размеров окна также может испортить графическое изображение в окне. Для решения этой проблемы существуют процедуры обработки событий Объект.FormPaint и Объект.FormResize. Процедура Объект.FormPaint выполняется после появления формы на экране (как при запуске программы, так и в процессе работы с окнами Windows). Процедура Объект.FormResize выполняется после изменения размера формы. Следовательно, все операторы рисования

необходимо помещать внутрь процедуры Объект.FormPaint и дублировать в процедуре

Объект.FormResize.

Полоз М.И.

7

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

Варианты заданий

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

Например, форма должна иметь вид, представленный на рисунке:

Ответ должен выводится в виде сообщения:

1

 

2

 

 

 

 

 

Полоз М.И.

8

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

3

4

5

6

7

8

Полоз М.И.

9

PDF created with pdfFactory trial version www.pdffactory.com

Логические выражения. Графика

9

10

11

12

13

14

Полоз М.И.

10

PDF created with pdfFactory trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]