Главная
страница 1страница 2страница 3



Программирование в среде Delphi

Часть IV

Графика

Утверждено научно-методическим советом математического факультета ,

протокол №

Автор Садовская О.Б.

Учебное пособие подготовлено на кафедре функционального анализа и операторных уравнений математического факультета Воронежского государственного университета.

Рекомендуется для студентов 2 курса дневного отделения математического факультета, обучающихся по специальности «математика» (010100).



4.1 Общая характеристика

классов и компонентов Delphi,

предназначенных для создания изображений

В Delphi имеется несколько классов общего назначения, позволяющих выводить графические изображения на поверхность компонентов. К ним относятся классы: TFont (шрифт), TPen (перо), TBrush (кисть) и TCanvas (канва). В составе многих компонентов имеются свойства Font, Pen, Brush и Canvas соответствующего типа, при помощи которых создаются рисунки и тексты. Канва состоит из пикселей – минимальных по размеру точек экрана, изображением которых может управлять программа. Предком классов TFont, TPen и TBrush является класс TGraphicsObject, происходящий непосредственно от класса TPersistent. Предком класса TCanvas является класс TPersistent.

В классе TGraphicsObject отметим событие OnChange:

property OnChange : TNotifyEvent;

Событие возникает при изменении графического объекта. После возникновения события графические объекты отображаются с обновлёнными значениями своих свойств.

В Delphi имеются компоненты, специально предназначенные для создания графических изображений:

Image – представляет собой удобное средство для отображения готовых графических файлов.

Shape – используется для создания на форме простых геометрических фигур: квадратов, кругов, эллипсов и т.п.

PaintBox – позволяет на этапе выполнения программы создавать несложные рисунки на канве Canvas.

При создании проектов, содержащих графические компоненты, мы будем использовать компонент Timer, который предназначен для отсчёта интервалов времени.

4.2 Класс TFont

Свойства, имеющие классовый тип TFont, присутствуют в любом компоненте, который может содержать некоторый текст. Характеристики шрифта задаются в классе TFont при помощи следующих свойств.



property Charset : TFontCharset;

Набор символов. Для русскоязычных программ это свойство обычно имеет значение DEFAULT_CHARSET или RUSSIAN_CHARSET.



property Color : TColor;

Цвет шрифта.



property Height : integer;

Высота шрифта в пикселах.



property Name : TFontName;

Имя шрифта. По умолчанию имеет значение MS Sans Serif.



property Size : integer;

Высота шрифта в пунктах ( дюйма). Изменение этого свойства автоматически изменяет свойство Height и наоборот.



property Style : TFontStyles;

Стиль шрифта. В качестве значения может быть комбинация следующих признаков:

fsBold – полужирный,

fsItalic – курсив,

fsUnderline – подчёркнутый,

fsStrikeOut – перечёркнутый.




4.3 Класс TColor

Тип TColor используется для описания цвета объекта. В модуле Graphics определено множество констант типа TColor.




Константа

Значение цвета

clAqua

Голубой

clBlack

Черный

clBlue

Синий

clFuchsia

Сиреневый

clGray

Серый

clGreen

Зеленый

clLime

Лимонный

clMaroon

Темно-бордовый

clNavy

Темно-синий

clOlive

Оливковый

clPurple

Пурпурный

clRed

Красный

clSilver

Серебряный

clTeal

Морской воды

clWhite

Белый

clYellow

Желтый

Полный набор констант цвета можно просмотреть, открыв в Инспекторе Объектов свойство Color любого компонента, имеющего это свойство.



4.4 Класс TPen

Класс TPen задаёт характеристики пера для изображения различных линий. Основные свойства этого класса:



property Color : TColor;

Цвет линии, вычерчиваемой пером. По умолчанию цвет чёрный.



property Mode : TPenMode;

Определяет способ взаимодействия линий с фоном. Например:

pmBlack – линии всегда чёрные;

pmNop – бесцветная линия;

pmCopy – цвет определяется значением свойства Color;

pmNotCopy – цвет, инверсный цвету, заданному в свойстве Color.

Например, если характеристики пера заданы следующим образом:

Pen.Color:= clyellow; Pen.Mode:=pmNotCopy;

то линия будет синего цвета, так как номер цвета clyellow равен 14 =(1110)2 , а применяя инверсию к двоичному числу (1110)2, получим (0001)2=1 – номер синего цвета. Номер чёрного цвета 0=(0000)2 . Инверсным ему будет белый цвет, имеющий номер 15=(1111)2 .

property Style : TPenStyle;

Определяет стиль линий. Например:

psSolid – сплошная;

psDash – штриховая;

psDot – пунктирная.

Учитывается только для линий толщиной 1 пиксел. Для толстых линий стиль всегда psSolid.



property Width : integer;

Толщина линии в пикселах экрана. Значение по умолчанию 1 пиксел.




4.5 Класс TBrush

Класс TBrush содержит характеристики кисти, которая используется для заливки (закраски) замкнутых областей. Основные свойства кисти:



property Bitmap : TBitmap;

Содержит растровое (т.е. состоящее из окрашенных в тот или иной цвет пикселей) изображение размером 8×8 пикселей, которое будет использоваться кистью как шаблон заполнения. Если это свойство определено, то свойства Color и Style игнорируются.



property Color : TColor;

Цвет кисти.



property Style : TBrushStyle;

Стиль кисти. Например:

bsSolid – сплошная закраска;

bsVertical – вертикальные линии;

bsCross – клетка.


4.6 Класс TCanvas

Класс TCanvas определяет объект Canvas, который представляет собой поверхность компонента, используемую для рисования, и инструменты, с помощью которых создаётся изображение: шрифт, карандаш и кисть. Объекты классового типа TCanvas не являются компонентами и используются как свойства различных элементов управления.

Канва состоит из отдельных точек – пикселей. Каждый пиксель имеет горизонтальную и вертикальную координату. Начало координат, т.е. точка с координатами (0,0), располагается в левом верхнем углу канвы. Горизонтальная ось направлена слева направо, вертикальная – сверху вниз. Размер канвы зависит от размера и особенностей компонента. Так, например, для компонента Image размер канвы определяется свойствами Height и Width, а для формы – свойствами ClientHeight и ClientWidth.

На канве имеется невидимый графический курсор, который определяет текущее положение пера. Как правило, рисование начинается с текущего положения этого курсора. В процессе рисования положение курсора изменяется. В классе TCanvas имеются методы, позволяющие устанавливать курсор в заданное положение.

Рассмотрим основные свойства TCanvas.

property Brush : TBrush;

Задаёт кисть канвы.



property Font : TFont;

Задаёт шрифт канвы.



property Pen : TPen;

Задаёт перо канвы.



property PenPos : TPoint;

Определяет текущее положение графического курсора.



property Pixels[x, y : integer] : TColor;

Массив пикселей канвы. Задаёт цвета всех пикселей; x и y – координаты пикселя.



Задача 1. Нарисовать звёздное небо : на тёмно-синем фоне формы жёлтые точки с координатами, заданными случайными числами.

Рисунок мы будем выполнять на канве формы приложения. Для создания процедуры обработки события OnPaint (нарисовать изображение) для Form1, нужно в окне Инспектора Объектов на странице Events произвести двойной щелчок на пустом поле около названия события OnPaint. После этого в окне Редактора кода появится заготовка процедуры TForm1.FormPaint.

procedure TForm1.FormPaint(Sender: TObject);

var h, w, i, x, y : integer;

begin

h:=form1.ClientHeight; w:=form1.ClientWidth;



randomize;

for i:=1 to 1000 do

begin

x:=random(w); y:=random(h);



form1.Canvas.pixels[x, y]:=clyellow

end;


end;

Все геометрические фигуры, для рисования которых определены методы класса TCanvas, можно разбить на контурные (т.е. не имеющие внутренней закраски) и закрашенные. При рисовании контурных фигур используется только перо с установленными для него характеристиками (цвет линии, толщина и т.д.). Если фигура является закрашенной, её внутренность закрашивается кистью Brush с установленными для неё характеристиками (цвет, стиль и т.д.). На этапе выполнения программы значения свойств Pen, Brush и Font можно изменять.

Рассмотрим основные методы, предназначенные для создания простых графических изображений:

procedure LineTo(x, y : integer);

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



procedure MoveTo(x, y : integer);

Перемещает графический курсор в точку с координатами (x,y);

Например:

procedure Rectangle(x1, y1, x2, y2 : integer); overload;

Рисует прямоугольник, у которого левый верхний угол имеет координаты (x1, y1), а правый нижний угол – координаты (x2, y2).



procedure RoundRect(x1, y1, x2, y2, x3, y3 : integer);

Рисует прямоугольник, у которого левый верхний угол имеет координаты (x1, y1), а правый нижний угол – координаты (x2, y2). Углы прямоугольника закруглены частями эллипса с осями x3 и y3.



procedure Ellipse(x1, y1, x2, y2 : integer); overload;

Рисует эллипс, вписанный в прямоугольник с координатами левого верхнего угла (x1, y1) и правого нижнего угла (x2, y2).



procedure Arc(x1, y1, x2, y2, x3, y3, x4, y4 : integer);

Рисует дугу эллипса, который вписан в прямоугольник с координатами левого верхнего угла (x1, y1) и правого нижнего угла (x2, y2). Дуга начинается в точке пересечения эллипса с прямой, проходящей через центр эллипса и точку с координатами (x3, y3), а заканчивается в точке пересечения эллипса с прямой, проходящей через центр эллипса и точку с координатами (x4, y4).



procedure Pie(x1, y1, x2, y2, x3, y3, x4, y4 : integer);

Рисует сектор эллипса. Дуга эллипса задаётся так же, как и для метода Arc.



type TFillStyle = (fsSurface, fsBorder);

procedure FloodFill(x, y : integer; Color : TColor; FillStyle : TFillStyle);

Закрашивает кистью Brush поверхность канвы, начиная от точки (x, y). Если FillStyle=fsSurface, заливка распространяется на все соседние точки с цветом Color. Если FillStyle=fsBorder, то заливка, наоборот, прекращается на точках цвета Color.



procedure TextOut(x, y : integer; const Text : string);

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

В классе TCanvas определены события:

property OnChange : TNotifyEvent;

Возникает перед тем, как на канве должны быть произведены изменения.



property OnChanging : TNotifyEvent;

Возникает сразу после того, как на канве произведены изменения.



Задача 2. Рассмотрим пример применения методов и свойств класса TCanvas.

Для сокращения записи свойств и методов класса TCanvas мы будем использовать оператор присоединения with form1.Canvas do.

procedure TForm1.FormPaint(Sender: TObject);

begin


with form1.Canvas do

begin


pen.width:=2; pen.Color:=clAqua;

moveto(20,20); lineto(40,20); lineto(40,80); lineto(20,20);

pen.Color:=clPurple; pen.width:=1; pen.Style:=psdot; rectangle(60,20,100,40);

pen.Color:=clLime; pen.width:=2; roundrect(120,20,160,40,20,10);

pen.Color:=clFuchsia; pen.width:=3; brush.Color:=clFuchsia; ellipse(180,20,200,60);

pen.Color:=clMaroon; arc(20,100,60,120,40,100,60,110);

pen.Color:=clOlive; pie(100,100,140,120,120,100,140,110);

brush.Color:=clRed; brush.style:=bshorizontal; floodfill(30,30,clAqua,fsBorder);

font.Color:=clblue; font.Size:=20; TextOut(180,100, 'example');

end;


end;


procedure Polygon(Points : array of TPoint);

Вычерчивает пером многоугольник по точкам, заданным в массиве Points. Конечная точка соединяется с начальной, и многоугольник заполняется текущей кистью.



Задача 3. Рассмотрим пример использования процедуры Polygon. Тип TPoint описывается в стандартном модуле Windows и представляет собой запись, содержащую два поля, в которых могут храниться целочисленные значения типа Longint. Как правило, переменные этого типа характеризуют координаты положения рисованной точки.

type TPoint = record

x : longint;

y : longint;

end;

Функция Point, определенная в стандартном модуле Classes, позволяет по целочисленным параметрам, характеризующим пару координат точки, определить переменную типа TPoint.



function Point(ax, ay : integer): TPoint;
3десь ax и ay – значения, определяющие координаты точки. Начало координат находится в левом верхнем углу экрана.

procedure TForm1.FormPaint(Sender: TObject);

var romb : array of tpoint;

begin


with form1.Canvas do

begin


pen.Color:=clgreen; pen.Width:=3;

brush.Color:=clgreen; brush.style:=bscross;

setlength(romb, 4);

romb[0]:=point(100,100); romb[1]:=point(180,60);

romb[2]:=point(260,100); romb[3]:=point(180,140);

polygon(romb);

end;

end;



Задача 4. Рассмотрим пример использования свойства кисти BitMap, которое содержит растровое (т.е. состоящее из окрашенных в тот или иной цвет пикселей) изображение размером 8×8 пикселей, являющееся шаблоном заполнения.

Сначала создадим файл с расширением .bmp, содержащий нужный нам шаблон. Для этого запустим графический редактор с помощью команды Tools  Image Editor. В открывшемся окне графического редактора выполним команду File  New  BitmapFile(.bmp). В появившемся диалоговом окне Bitmap Properties в поле Width (ширина) установим 8, в поле Height (высота) также 8. Увеличим заготовку до максимального размера (команда меню View  Zoom in). Левой кнопкой мыши выберем цвет для рисования карандашом. Затем щёлкнем левой кнопкой мыши по значку инструмента Pencil (Карандаш) и, подводя курсор к нужной клеточке заготовки шаблона, нажатием на левую кнопку мыши окрашиваем эту клеточку в выбранный цвет.



































































































































































































Этот файл (bitmap1.bmp) можно сохранить в папке, предназначенной для сохранения данного проекта. После этого окно графического редактора можно закрыть.

На форму приложения поместим кнопку Button1 с надписью Нарисовать и компонент OpenpictureDialog1 для выбора имени графического файла. Свойство Bitmap содержит ссылку на объект класса TBitmap. Перед загрузкой объекта Bitmap его надо создать, а после использования – уничтожить. Поскольку прорисовка может в некоторых случаях вызвать исключение, этот фрагмент программы защищен блоком try … finally.

procedure TForm1.Button1Click(Sender: TObject);

begin


with Form1.Canvas, Brush do

begin


bitmap:=Tbitmap.Create;

try


if OpenpictureDialog1.execute then

bitmap.LoadFromFile(OpenpictureDialog1.FileName);

pen.Color:=clfuchsia; ellipse(80, 80, 250, 150);

finally


bitmap.Free

end


end;

end;


Задача 5. Нарисовать график функции y = sin x на интервале [-4, 4], взяв за единицу масштаба 20 пикселей. Начало системы координат должно находиться в центре формы.

Установим следующие свойства формы приложения:




ClientHeight

500

ClientWidth

700

Color

clWhite

Создадим процедуру обработчика события OnPaint.

Начало системы координат будет находиться на форме в точке с координатами (w div 2, h div 2), где w=form1.ClientWidth, h=form1.ClientHeight (ширина и высота формы).

Если xscr и yscr – экранные координаты точки на форме, а xc и yc – координаты той же точки в системе координат с центром (w div 2, h div 2), тогда xscr:= xc + w div 2, yscr:=h div 2 – yc.

Переменная msh в нашем проекте будет обозначать величину масштаба, который нужен для того, чтобы увидеть график функции, максимальное значение которой по оси y равно единице. Для вычисления значения функции с учётом масштаба необходимо записать: f:=msh  (sin(x/msh)). Переменные a и b обозначают концы отрезка, на котором будет нарисован график функции (a=-4, b=4). Переменные x и y – текущие координаты при рисовании графика, xmax и ymax – длины полуосей координат. График будет нарисован линией коричневого цвета толщиной два пиксела.

procedure TForm1.FormPaint(Sender: TObject);

var x, y, a, b : real;

h, w, xmax, ymax, msh : integer;

function xscr(xc : integer) : integer;

begin xscr:= xc + w div 2 end;

function yscr(yc : integer) : integer;

begin yscr:=h div 2 – yc end;

function f(x : real) : real;

begin f:=msh  (sin(x/msh)) end;

begin

h:=form1.ClientHeight; w:=form1.ClientWidth;



xmax:=w div 2 – 30; ymax:=h div 2 – 30;

a:=-4pi; b:=4pi; msh:=20;

with form1.Canvas do

begin


moveto(xscr(-xmax), yscr(0)); lineto(xscr(xmax), yscr(0)); {ось x}

moveto(xscr(0), yscr(-ymax)); lineto(xscr(0), yscr(ymax)); {ось y}

textout(xscr(xmax) + 10, yscr(0), ' x ');

textout(xscr(0), yscr(ymax)–20, ' y ');

x:=a*msh; y:=f(x); moveto(xscr(round(x)), yscr(round(y)));

pen.Color:=clMaroon; pen.Width:=2;

repeat

x:=x+0.1; lineto(xscr(round(x)), yscr(round(f(x))))



until x>=bmsh;

end;


end;

Цикл рисования графика можно выполнить с помощью свойства Pixels:

repeat


Pixels[xscr(round(x)), yscr(round(f(x)))]:=clred;

x:=x + 0.1;

until x>=b*msh;

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


Задачи

Задача 6. Используя процедуру Polygon, нарисовать следующий многоугольник:


(50,10)

(90,50)

(50,90)

(10,50)

(60,40)

(60,60)

(40,60)

(40,40)

Задача 7. Используя процедуру Polygon, нарисовать следующий многоугольник:


(100,20)




(130,40)

(115,40)

(115,110)

(85,110)

(85,40)

(70,40)


Задача 8*. Используя процедуру Polygon, нарисовать следующий многоугольник:


(190,110)



(160,110)


(190,140)



(110,160)



(140,190)

(140,160)


Для заливки фигуры использовать свойство BitMap с шаблоном заполнения, созданным в графическом редакторе Delphi:




































































































































































































Окно работающего приложения:





Задача 9. Нарисовать график функции y = x2 на интервале [-4.5, 4.5], взяв за единицу масштаба 10 пикселей. Начало системы координат должно находиться в центре формы.

Задача 10. Нарисовать график функции y = 2x2 – 3x – 5 на интервале [-1.8, 3.3], взяв за единицу масштаба 30 пикселей. Начало системы координат должно находиться в центре формы.

Задача 11. Нарисовать график функции y = 5 cos x + 3 на интервале [-7, 7], взяв за единицу масштаба 10 пикселей. Начало системы координат должно находиться в центре формы.

Задача 12*. Нарисовать график астроиды, заданной параметрическими уравнениями x=acos3 t, y=asin3 t (0t360, a=50 пикселей). Начало системы координат должно находиться в центре формы. Закрасить ограниченную астроидой область вертикальными линиями того же цвета, что и сама кривая.

Указание. При вызове стандартных тригонометрических функций аргумент должен быть указан в радианах. Окно работающего приложения:





следующая страница >>
Смотрите также:
Учебное пособие подготовлено на кафедре функционального анализа и операторных уравнений математического факультета Воронежского государственного университета
496.95kb.
3 стр.
Купечество г. Воронежа в последней трети XIX начале XX вв
309.97kb.
1 стр.
Лекции: Прикладные вопросы математического анализа полгода, ежегодно 1 семестр
15.51kb.
1 стр.
Войска нквд ссср: эволюция структуры и практики использования
388.66kb.
3 стр.
Учебное пособие «Политическая система кнр» для студентов специальностей «Регионоведение», «Международные отношения» Издательство
2751.42kb.
13 стр.
Риски внутреннего аудита
514.48kb.
3 стр.
Методическое пособие по русскому языку для работы на уроках русского языка как иностранного
461.11kb.
3 стр.
Учебное пособие для студентов экономистов: учеб пособие по англ яз. / сост. О. А. Михайлина, С. В. Борисова. Краснодар: Краснодар ун-т мвд россии, 2011. 200 с
1894.18kb.
18 стр.
Национально-культурная идентичность современной российской молодежи в условиях глобализации: методология социологического анализа
282.36kb.
1 стр.
Учебное пособие подготовлено в рамках программы «Формирование установок толерантного сознания и профилактика экстремизма в российском обществе»
863.34kb.
4 стр.
Незарегистрированный брак как социальный механизм формирования брачно-семейных отношений в российском обществе: методология социологического анализа
359.89kb.
2 стр.
Совет по делам русской православной церкви при снк (СМ) СССР. 1943-1965 гг
824.49kb.
4 стр.