Lb3_Графика
.pdfЛогические выражения. Графика
ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ. ИСПОЛЬЗОВАНИЕ ГРАФИКИ
Цель лабораторной работы: научиться составлять логические выражения и создавать простейшие графические изображения. Написать и отладить программу разветвляющегося алгоритма.
Средства рисования в 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