ИнфТехнКомпТехн
.pdf2.Разработать алгоритмы решения задач.
3.Составить программы решения задач.
Контрольные вопросы
1.GDI (Graphics Device Interface) - интерфейс и драйверы графических устройств. Контекст отображения (дисплейный контекст) и его инструменты: шрифт, перо, кисть.
2.Класс TGraphicObject (графический объект).
3.Класс TFont - шрифт. Свойства Charset (набор символов), Name (имя), Size (размер в кеглях), Style (стиль), Color
4.(цвет фона).
5.Класс TPen - перо. Свойства Color (цвет), Style (стиль), Width (ширина), Mode (режим).
6.Класс TBrush - кисть. Свойства Color (цвет), Style (стиль).
7.Класс TCanvas - холст (поверхность Рисования). Свойства CopyMode (режим копирования), Pen (перо), Brush (кисть), Font (шрифт), Pixels (цвет пикселя).
8.Использование свойства TCanvas.Pixels или метода TCanvas.LineTo для Рисования графиков функций.
9.Метод MoveTo (переместить перо к).
10.Компонент TChart.
11.Задание функции для отображения в компоненте TChart.
12.Использование легенды в компоненте TChart.
Задание к работе
Создать программу вывода текста и Рисования в форме графиков функций. Проект – приложение. Варианты заданий приведены в табл. 16.1.
|
|
|
Таблица 16.1 - Варианты задания 1 |
||
|
График функции y(x) |
|
|
|
|
Функция |
|
x начальное |
|
x конечное |
|
sin(x) |
|
0 |
|
6π |
|
cos(x) |
|
0 |
|
6π |
|
sin(x)+sin(2x) |
|
0 |
|
6π |
|
sin(x)-sin(2x) |
|
0 |
|
6π |
|
sin(x)+cos(2x) |
|
0 |
|
6π |
|
sin(x)-cos(2x) |
|
0 |
|
6π |
|
sin(x)*exp(x) |
|
0 |
|
6π |
|
cos(x)*exp(x) |
|
0 |
|
6π |
|
sin(x)*exp(-x) |
|
0 |
|
6π |
|
cos(x)*exp(-x) |
|
0 |
|
6π |
|
exp(x) |
|
0 |
|
2 |
|
exp(-x) |
|
0 |
|
2 |
|
ln(x) |
|
1 |
|
10 |
|
lg(x) |
|
1 |
|
100 |
|
ln(x)+lg(x) |
|
1 |
|
10 |
|
Пример выполнения
Создать программу Рисования в форме графика функции с поясняющим текстом. Проект – приложение. Функция - синус. Программа предусматривает три варианта Рисования графика:
Точками с помощью свойства Pixels (график в левой верхней части окна).
Линиями с использованием метода LineTo (график в нижней левой части окна).
221
С использованием компонента TChart (в правой части окна).
На Рис. 16.1 представлено окно формы в начале конструирования. В форме размещены следующие компоненты:
Кнопка BitBtn1 (Графика) из страницы Additional. Она вызывает построение графиков в окне.
Кнопка BitBtn2 (Закрыть) из страницы Additional. Дублирует кнопку закрытия приложения Windows.
TChart1. Компонент построения графиков из страницы Additional.
Рисунок 16.1 - Окно формы на этапе конструирования
Для подготовки TChart к работе используется встроенный редактор свойств этого компонента, вызываемый двойным щелчком по компоненту. На Рис. 16.2 слева представлено окно этого редактора. В нем в закладке Series нужно нажатием кнопки Add добавить, по крайней мере, одну серию данных для построения графика. Остальные параметры компонента можно оставить без изменения. При этом возникает окно для выбора способа отображения графика, показанное на Рис.16.2 справа.
Рисунок 16.2 - Выбор серии для TChart
После выбора вида графика окно редактора приобретает вид Рис. 16.3, а у компонента TChart в окне формы отображается примерный вид представления графика (см. Рис. 16.4 слева). По умолчанию в правой части компонента отображается легендастолбик из вычисляемых значений функции. При желании легенду можно удалить. Для этого следует вновь вызвать редактор свойств TChart, на вкладке Legend которого выключить флаг Visible. Окно формы примет вид, показанный на Рис. 16.4 справа.
222
Рисунок 16.3 - Окно редактора TChart после выбора серии
Рисунок 16.4 - Окно формы
Листинг модуля формы unit Prg_15_1_; interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, TeEngine, Series, TeeProcs, Chart;
type
TForm1 = class(TForm) BitBtn1: TBitBtn; BitBtn2: TBitBtn; Chart1: TChart; Series1: TLineSeries;
procedure BitBtn1Click(Sender: TObject); private
{Private declarations } public
{Public declarations } end;
var
Form1: TForm1; implementation {$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject); var i,amp,x01,y01,x02,y02,imax,t:integer; func:real;
begin
imax:=100; //число точек в периоде t:=3; //число периодов
223
amp:=70; |
//амплитуда |
|
|
|
||
x01:=20; |
//начала координат |
|
|
|||
x02:=20; |
|
|
|
|
|
|
y01:=20+amp; |
|
|
|
|
|
|
y02:=y01+2*amp+40; |
Pixels |
|
|
|
||
//Рисуем график с |
|
с Pixels'); |
||||
Canvas.TextOut(0,0,'График функции |
||||||
Canvas.MoveTo(x01,y01); |
//Рисуем ось |
X |
||||
Canvas.LineTo(x01+imax*t,y01); |
Canvas.MoveTo(x01,y01+amp); |
|||||
//Рисуем ось |
Y Canvas.LineTo(x01,y01-amp); |
|||||
for i:=0 to imax*t do//Рисуем график |
|
|||||
begin |
|
|
|
|
|
|
func:=-amp*sin(2*pi/imax*i); |
|
|
||||
Canvas.Pixels[x01+i,y01+round(func)]:=clBlack; |
||||||
end; |
|
|
LineTo |
|
|
|
//Рисуем график с |
|
|
функции c LineTo'); |
|||
Canvas.TextOut(x02,y02-amp-20,'График |
||||||
Canvas.MoveTo(x02,y02); |
//Рисуем ось |
X |
||||
Canvas.LineTo(x02+imax*t,y02); |
Canvas.MoveTo(x02,y02+amp); |
|||||
//Рисуем ось |
Y Canvas.LineTo(x02,y02-amp); |
|||||
//func:=amp*sin(0); |
|
|
|
|
||
//Canvas.MoveTo(x01,y0+round(func)); |
|
|||||
for i:=0 to imax*t do//Рисуем график |
|
|||||
begin |
|
|
|
|
|
|
func:=-amp*sin(2*pi/imax*i); |
|
|
||||
Canvas.LineTo(x02+i,y02+round(func)); |
|
|||||
end; |
|
в |
компонентеTChart |
|
||
//Рисуем график |
|
for i:=0 to imax*t do Chart1.SeriesList[0].AddXY(i,amp*sin(2*pi/imax*i),'',clRed); end;
initialization end.
На Рис. 16.5 представлено окна работающего приложения проекта. Оно возникает при нажатии кнопки График. В окне видны графики одной и той же функции, построенные разными способами:
С использованием свойства Pixels (вверху слева).
С использованием метода LineTo (внизу слева).
С помощью компонента TChart (справа).
224
Рисунок 16.5 – Окно работающего приложения проекта
Выводы
1.Для Рисования используется класс Canvas (поверхность Рисования, или холст).
2.Многие компоненты имеют свойство Canvas. Например, Form (форма), компонент Image (изображение).
3.Canvas имеет два инструмента: Pen (перо) для Рисования линий, Brush (кисть) для заливки областей.
4.Pen имеет свойства:
Color - цвет линии, значения с префиксом cl (например, clRed),
Style - тип линии, значения с префиксом ps (например, psSolid, принято по умолчанию),
Width - толщина линии, в пикселах (по умолчанию 1),Mode - режим взаимодействия с поверхностью холста, значения с префиксом pm (например, pmCopy - писать цветом пера, режим по умолчанию).
5.Brush имеет свойства:
Color - цвет заливки,
Style - стиль заливки, значения с префиксом bs (Например, bsCross).
6.Для Рисования графиков функций используются свойство TCanvas.Pixel(x,y) и метод TCanvas.LineTo. Второй метод дает более качественный график.
7.Для построения графиков есть компонент TChart, позволяющий автоматизировать значительную часть операций.
17. Графика, примитивы
Подготовка к работе По указанной литературе изучить:
Назначение, типы и методы работы с графическими примитивами.
Свойства компонента TShape.
Метафайлы.
Контрольные вопросы
1.Назначение графических примитивов.
2.Графический примитив Линия и метод LineTo его отображения.
225
3. Графический примитив Кусочно-ломаная линия и метод |
PolyLine и его |
отображения. |
|
4.Графический примитив Хорда (линия поперек эллипса) и метод Chord его отображения.
5.Графический примитив Прямоугольная рамка и метод FrameRect его отображения.
6.Графический примитив Заполненный прямоугольник и метод Rectangle его отображения.
7.Графический примитив Заполненный многоугольник и метод Polygon его отображения.
8.Графический примитив Заполненный прямоугольник со скругленными углами и метод RoundRect его отображения.
9.Графический примитив Дуга и метод Arc его отображения.
10.Графический примитив Заполненный эллипс и метод Ellipse его отображения.
11.Графический примитив Пирог (сектор эллипса) и метод Pie его отображения.
12.Метод заполнения замкнутых фигур FloodFill (заполнить область),
13.Методы вывода текста: TextOut (вставить строку текста).
14.Компонент TShape.
15.Метафайлы, назначение, структура, создание и использование.
Задание к работе
1.Создать программу Рисования в форме графического примитива с заливкой. Примитив Рисуется при нажатии кнопки мыши (событие onDown) на форме. Цвет линий, стиль и цвет заливки зависит от того, какая кнопка мыши нажимается(левая или правая). Проект – приложение. Варианты заданий приведены в табл. 17.1.
Таблица 17.1 - Варианты задания 1
Примитив |
Цвет линий |
|
Заливка |
|
|
Левая кнопка |
Правая кнопка |
Стиль |
Цвет |
Ellipse |
clBlue |
clGreen |
bsSolid |
clRed |
Rectangle |
clGreen |
clWhite |
bsHorizontal |
clBlue |
Pie |
clWhite |
clRed |
bsVertical |
clGreen |
RoundRec |
clRed |
clBlue |
bsDiagonal |
clWhite |
Polygon (3) |
clBlue |
clGreen |
bsBDiagonal |
clRed |
Ellipse |
clGreen |
clWhite |
bsCross |
clBlue |
Rectangle |
clWhite |
clRed |
bsDiagCros |
clGreen |
Pie |
clRed |
clBlue |
bsSolid |
clWhite |
RoundRec |
clBlue |
clGreen |
bsHorizontal |
clRed |
Polygon (7) |
clGreen |
clWhite |
bsVertical |
clBlue |
Ellipse |
clWhite |
clRed |
bsDiagonal |
clGreen |
Rectangle |
clRed |
clBlue |
bsBDiagonal |
clWhite |
Pie |
clBlue |
clGreen |
bsCross |
clRed |
RoundRec |
clGreen |
clWhite |
bsDiagCros |
clBlue |
Polygon (6) |
clWhite |
clRed |
bsSolid |
clGreen |
2.Создать проект, демонстрирующий использование графического компонента TShape для изменения пользовательского интерфейса при выполнении программы. В проекте на форме с изменяемым цветом отображается фигура с разными типом, размерами и цветом. Варианты заданий приведены в Табл. 17.2. Возможные типы фигуры:
Тип |
Имя |
Круг |
StCircle |
Эллипс |
stEllipse |
|
226 |
Прямоугольник |
stRectangle |
Прямоугольник со скругленными |
stRoundRect |
Квадрат |
stsquare |
Квадрат со скругленными углами |
stRoundSquare(квадрат с округлыми углами) |
|
|
|
|
Таблица 17.2 - Варианты задания 2 |
||
stCircle |
stEllipse |
|
stRectangle |
|
stEllipse |
stRectangle |
|
stRoundRect |
|
stRectangle |
stRoundRect |
|
stsquare |
|
stRoundRect |
stsquare |
|
stCircle |
|
stsquare |
stRoundSquare |
|
stRectangle |
|
stRoundSquare |
stCircle |
|
stRoundRect |
|
stCircle |
stRectangle |
|
stsquare |
|
stEllipse |
stRoundRect |
|
stRoundSquare |
|
stRectangle |
stsquare |
|
stRectangle |
|
stRoundRect |
stRoundSquare |
|
stRoundRect |
|
stsquare |
stRoundRect |
|
stsquare |
|
stRoundSquare |
stsquare |
|
stRoundSquare |
|
stCircle |
stRoundSquare |
|
stRoundSquare |
|
stEllipse |
stRoundRect |
|
stsquare |
|
stRectangle |
stsquare |
|
stCircle |
|
3.Создать проект работы с метафайлом. Метафайл содержит график с графическими примитивами,, создается программно, отображается на форме и сохраняется на диске ПК. Для проверки праильности метафайла он считывается в компонент Image формы. Проект – приложение. Графические примитвы студент выбирает самостоятельно.
Пример выполнения Задание 1
Создать программу Рисования в форме графического примитива с заливкой. Примитив - пятиугольная звезда, Рисуется при нажатии кнопки мыши (событие onDown) на форме. Если нажата левая кнопка мыши, то цвет линий clBlack (черный), стиль заливки bsDiagCross (диагональный крест), цвет заливки - clRed (красный). Если нажата правая кнопка мыши, то цвет линий clRed (красный), стиль заливки bsCross ( крест), цвет заливки clBlue (синий). Проект – приложение.
Листинг модуля формы unit Prg_16_1_; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button:TMouseButton; Shift: TShiftState; x,y:integer);
private
{Private declarations } public
{Public declarations } end;
var
Form1: TForm1; implementation {$R *.dfm}
procedure StarLine(x0,y0,r: integer; Canvas: TCanvas);
227
//x0,y0 - координаты центра звезды
//r - радиус звезды
var |
|
|
|
массив |
координат |
лучей |
и |
p: array[1..11] of TPoint;// |
|||||||
впадин |
|
|
ОХ и |
радиусом к точке звезды |
|
||
a: integer;// угол между |
|
||||||
i: integer; |
|
|
|
|
|
|
|
begin |
// строим |
от |
правого горизонтального луча |
|
|||
a := 18; |
|
||||||
for i:=1 to 10 do |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
if (i mod 2 = 0) |
|
|
|
|
|
|
|
then |
|
|
|
|
|
|
|
begin // впадина звезды |
|
|
|
|
|
||
p[i].x := x0+Round(r/2*cos(a*2*pi/360)); |
|
|
|||||
p[i].y:=y0-Round(r/2*sin(a*2*pi/360)); |
|
|
|
||||
end |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
begin // луч звезды |
|
|
|
|
|
|
|
p[i].x:=x0+Round(r*cos(a*2*pi/360)); |
|
|
|
||||
p[i].y:=y0-Round(r*sin(a*2*pi/360)); |
|
|
|
||||
end; |
|
|
|
|
|
|
|
a := a+36; |
|
|
|
|
|
|
|
end; |
|
// чтобы |
замкнуть |
контур |
звезды |
|
|
p[11].X := p[1].X; |
|
||||||
p[11].Y := p[1].Y; |
// начертить звезду |
|
|
||||
Canvas.Polyline(p); |
|
|
|||||
end; |
кнопки мыши |
|
|
|
|
|
|
// нажатие |
|
|
|
TObject; |
|||
procedure |
TForm1.FormMouseDown(Sender: |
||||||
Button:TMouseButton; Shift: |
|
|
|
|
|||
TShiftState; x,y:integer); |
|
|
|
|
|
||
begin |
|
|
|
|
|
|
|
with Form1 do begin |
// нажата |
левая кнопка? |
|
|
|||
if Button = mbLeft |
|
|
|||||
then begin |
|
|
|
|
|
|
|
Canvas.Pen.Color := clBlack; StarLine(x, y, 30,Canvas); Canvas.Brush.Style:=bsDiagCross; Canvas.Brush.Color:=clRed; Canvas.FloodFill(x,y,Canvas.Pen.Color,fsBorder);
end
else begin
Canvas.Pen.Color := clRed; StarLine(x, y, 30,Canvas); Canvas.Brush.Style:=bsCross; Canvas.Brush.Color:=clBlue; Canvas.FloodFill(x,y,Canvas.Pen.Color,fsBorder);
end; end;end; end.
На Рис. 17.1 представлен вид окна приложения задачи 1 при исполнении.
228
Рисунок 17.1 – Вид окна приложения
Задание 2
Создать проект в котором в форме, цвет которой может изменяться, отображается компонент Shape1 (фигура), для которого можно менять тип, цвет и размеры. Формы фигур: stCircle, stEllipse, stsquare.
|
|
Выполнение |
|
|
|
|
|
|
|
1. |
Запустить Delphi. |
|
|
|
|
||
|
2. |
Создать в ней новое приложение. |
|
|
|
|
||
|
3. |
ПРисвоить свойству Caption компонента Form1 значение Prg_16_2. |
|
|||||
|
4. |
Сохранить модуль под именем Prg_16_2_, а проект под именем Prg_16_2. |
|
|||||
|
5. |
Установить на форме компоненты: |
|
|
|
|
||
|
|
кнопки Button1 и Button2, комбинированный список ComboBox1, линейки |
|
|||||
|
|
прокрутки ScrollBar1 и ScrollBar2, панель Panel1 (со страницы Standard). |
|
|||||
|
|
фигура Shape1 (со страницы Additional). |
|
|
|
|
||
|
|
диалог цвета ColorDialog1 (со страницы Dialogs). |
|
|||||
|
6. |
Задать свойству Shape компонента Shape1 значение stEllipse (Эллипс). Используя |
|
|||||
|
|
свойство Brush, установить произвольный цвет объекта Shape1. |
|
|||||
|
7. |
Установить значения свойств компонентов линеек прокрутки ScrollBar1 и |
|
|||||
|
|
ScrollBar2: |
|
|
|
|
|
|
|
|
Name |
ScrollBar1 |
|
|
ScrollBar2 |
|
|
|
Kind ( Тип) |
sbHorizobntal (Горизонтальная) |
|
|
sbVertical (Вертикальная) |
|
||
|
|
Align |
alBottom (Снизу) |
|
|
alRight (Справа) |
|
|
|
8. |
Компоненты Button1, Button2, ComboBox1 установить на передний план объекта |
|
|||||
|
|
Panel1 и выровнять их по вертикали. |
|
|
|
|
||
|
9. |
Установить значения свойств компонентов Button1, Button2: |
|
|||||
|
|
Компонент |
Button1 |
|
|
Button2 |
|
|
|
|
Name (Имя) |
FormColor |
|
|
ShapeColor |
|
|
|
|
Caption |
Цвет формы |
|
|
Цвет фигуры |
|
|
|
10. Установить следующие значения строк списка ComboBox1: |
|
||||||
|
|
Имя фигуры |
|
|
Тип фигуры |
|
||
|
|
stRectangle |
|
|
Прямоугольник |
|
||
|
|
stSguare |
|
|
Квадрат |
|
||
|
|
stRoundRect |
|
|
Прямоугольник со скругленными углами |
|
||
|
|
stRoundSguare |
|
|
Квадрат со скругленными углами |
|
||
|
|
stEllipse |
|
|
Эллипс |
|
||
|
|
stCircle |
|
|
Круг |
|
||
|
|
|
229 |
|
|
|
|
|
Внимание: имена фигур надо заносить в указанном порядке, так как они далее анализируются по номеру в списке.
11.Задать свойству BorderWidth компонента Panel1 значение 5. После вышеперечисленных установок интерфейс проекта примет вид, показанный на рис
17.2.
Рисунок 17.2 - Форма проекта задачи 2
12.Для изменения цвета фигуры или формы во время выполнения приложения использовать стандартное диалоговое окно выбора цвета ColorDialog1. Этот компонент при исполнении программы невидим.
13.Двойным щелчком по кнопке Цвет формы создать заготовку обработчика отклика на событие OnClick (на щелчок) для кнопки Цвет формы. Написать код обработчика, который при нажатии кнопки Цвет формы вызывает стандартное диалоговое окно выбора цвета с помощью диалогового окна ColorDialog1.
14.Двойным щелчком по кнопке Цвет фигуры создать заготовку обработчика события OnClick (на щелчок) для кнопки Цвет фигуры. Написать код обработчика, который при нажатии кнопки установит значение свойства Brush.Color (цвет закраски) фигуры Shape1, выбираемое с помощью диалогового окна ColorDialog1.
15.Запустить проект командой Выполнить и проверить действие кнопок Цвет формы и Цвет фигуры. При нажатии кнопок выбора цвета в отдельном окне (см. Рис. 17.3) отображается окно диалога выбора цвета, в котором следует выбирать желаемый цвет.
230