Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание на Дельфи.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Графика

Приступая к решению задач этого раздела, необходимо вспомнить:

  • Программа может выводить графику на поверхность объекта (формы или компонента image), которой соответствует свой ство Canvas.

  • Для того чтобы на поверхности объекта появился графиче ский элемент (линия, окружность, прямоугольник и т. д.) или картинка, необходимо применить к свойству Canvas этого объекта соответствующий метод.

  • Цвет, стиль и толщину линий, вычерчиваемых методами Line, Ellipse, Rectangle И Т. Д., определяет СВОЙСТВО Реп объекта Canvas.

  • Цвет закраски внутренних областей геометрических фигур, вычерчиваемых методами Line, Ellipse, Rectangle И Т. Д., определяет свойство Brush объекта canvas.

  • Характеристики шрифта текста, выводимого методом Textout, определяет свойство Font объекта canvas.

  • Основную работу по выводу графики на поверхность формы должна выполнять функция обработки события onPaint.

23. Напишите программу, которая на поверхности формы рису ет олимпийский флаг (рис. 1.19).

Рис. 1.19. Олимпийский флаг

// рисует олимпийский флаг procedure TForml.FormPaint(Sender: TObj ect); begin with Canvas do begin // полотнище Canvas.Pen.Width := 1; Canvas.Pen.Color := clBlack; Canvas.Brush.Color := clCream; Rectangle(30,30,150,115); // кольца Pen.Width := 2; Brush.Style := bsClear; // область внутри круга // не закрашивать Pen.Color : = clBlue; Ellipse(40,40,80,80); Pen.Color := clBlack; Ellipse(70,40,110,80); Pen.Color := clRed; Ellipse(100,40,140,80); Pen.Color : = clYellow; Ellipse(55,65,95,105); Pen.Color := clGreen; Ellipse(85,65,125,105); end; end;

24. Напишите программу, которая на поверхности формы рисует флаг Российской Федерации. .

// обработка события OnPaint // процедура рисует флаг Российской Федерации procedure TForml.FormPaint(Sender: TObject); const L = 200; // ширина флага (полосы) H = 40; // высота полосы var х,у: integer; // левый верхний угол begin х := 30; у := 50; with Canvas do begin // Чтобы у прямоугольников не было // границы, цвет границы должен // совпадать с цветом закраски Brush.Color := clWhite; // цвет закраски Pen.Color := clWhite; // цвет границы Rectangle(х,у,x+L,y+H); Brush.Color := clBlue; Pen.Color := clBlue; Rectangle(x,y+H,x+L,y+2*H); Brush.Color := clRed; Pen.Color := clRed; Rectangle(x,y+2*H,x+L,y+3*H) ; // контур Pen.Color : = clBlack; Brush.Style := bsClear; // "прозрачная" кисть Rectangle(x,y,x+l,y+h*3); Font.Size := 24; Font.Name := 'Times New Roman'; Font.Color := clWhite; TextOut(50,200,'P о с с и я'); Font.Color := clBlack; TextOut(51,201,'? о с с и я1); end; end;end.

25. Напишите профамму, в диалоговом окне которой, в точке щелчка кнопкой мыши, вычерчивается контур пятиконечной звезды (рис. 1.20).

Рис. 1.20. Звезда

unit Stars_;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtris;type TFontil class (TForm) procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations I procedure StarLine(xO,yO,r: integer); // рисует звезду end;var Forml: TForml;implementation{$R *.dfm}// рисует звезду procedure TForml.StarLine(xO,yO, r: integer); // xO,yO — координаты центра звезды //г — радиус звезды var р : array[1..11] of TPoint; // массив координат лучей и впадин a: integer; // угол между осью ОХ и прямой, соединяющей // центр звезды и конец луча или впадину i: integer; begin а := 18; // строим от правого гор. луча for i:=l to 10 do begin if (i mod 2=0) then begin // впадина p[i].x := xO+Round(r/3*cos(a*2*pi/360)) ; p[i].y:=yO-Round(r/3*sin(a*2*pi/360) ) ; end else begin // луч i].x:=xO+Round(r*cos(a*2*pi/360) ) ; i].y:=yO-Round(r*sin(a*2*pi/360)) ; end; a := a+36; end; p[ll].X := p[l].X; // чтобы замкнуть контур звезды р[11].Y := р[1].Y; Canvas.Polyline(p); // начертить контур звезды end;// нажатие кнопки мыши procedure TForml.FonnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft // нажата левая кнопка? then Canvas.Pen.Color := clBlack else Canvas.Pen.Color := clRed; StarLine(x, y, 30); end;end. 26. Напишите программу, по поверхности окна которой пере- мещается случайным образом (прыгает) изображение веселой рожицы, на котором пользователь может сделать щелчок кноп- кой мыши. Программа должна завершить работу после того, как пользователь сделает 10 щелчков кнопкой мыши. Рекомендуе- мый вид окна в начале работы программы приведен на рис. 1.21. unit tir_; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; Рис. 1.21. Окно программы Тир

type TForml class(TForm) Timer: TTimer; Label1: TLabel; Buttonl: TButton; procedure TimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ForrnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ButtonlClick(Sender: TObject); private I Private declarations j public / Public declarations } объявление процедур помещено сюда, чтобы процедуры имели прямой доступ к форме, на которой они рисуют ****************************** , procedure PaintFace(x,у: integer); // рисует рожицу procedure EraseFace(x,у: integer); // стирает рожицу end;var Forml: TForml; fx,fy: integer; // координаты рожицы n: integer; // количество щелчков кнопкой мыши р: integer; // количество попаданий implementation// рисует рожицу procedure TForml.PaintFace(x,y: integer); begin Canvas.Pen.Color := clBlack; // цвет линий Canvas.Brush.Color := clYellow; // цвет закраски // рисуем рожицу Canvas.Ellipse(х,у,x+30,Y+30); // лицо Canvas.Ellipse(x+9,y+10,x+11,y+13); // левый глаз Canvas.Ellipse(x+19,y+10,x+21,y+13); // правый глаз Canvas.Arc(x+4,y+4,x+26,y+26,x,y+20,x+30,y+20); // улыбка end;// стирает рожицу procedure TForml.EraseFace(x,у: integer); begin // зададим цвет границы и цвет закраски, // совпадающий с цветом формы. По умолчанию // цвет формы - clBtnFace (см. в Object Inspector) Canvas.Pen.Color := clBtnFace; // цвет окружности Canvas.Brush.Color := clBtnFace; // цвет закраски Canvas.Ellipse(x,y,x+30, y+30) ; end;{$R *.dfm)procedure TForml.TimerTimer(Sender: TObject); begin EraseFace(fx,fy); // новое положение рожицы fx:= Random(ClientWidth-30); // 30 - это диаметр рожицы fy:= Random(ClientHeight-30) ; PaintFace(fx,fy); end;procedure TForml.FormCreate(Sender: TObject); begin // исходное положение рожицы fx:=100; fy:=100; Randomize; // инициализация генератора // случайных чисел end; // нажатие клавиши мыши procedure TForml.ForroMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inc(n); // кол-во щелчков if (x > fx) and (x < fx+30) and (y > fy) and (y < fy+30) then begin // щелчок по рожице inc(p); end; if n = 10 then begin // игра закончена Timer.Enabled := False; // остановить таймер ShowMessage('Выстрелов: 10. Попаданий: ' + IntToStr(p)+'.'); EraseFace(fx,fy); • Label1.Visible := True; Buttonl.Visible := True; // теперь кнопка и сообщение снова видны end; end;

// щелчок на кнопке Ok procedure TForml.ButtonlClick(Sender: TObject); begin Labell.Visible := False; // скрыть сообщение Buttonl.Visible := False; // скрыть кнопку Timer.Enabled := True; // пуск таймера end;end.

27. Напишите программу, которая на поверхности формы вы черчивает кривую Гильберта (рис. 1.22). Пример кривой Гиль берта пятого порядка приведен на рис. 1.23.

Рис. 1.22. Кривые Гильберта

Рис. 1.23. Кривая Гильберта пятого порядка

var р: integer = 5; // порядок кривой u: integer =7; // длина штриха{ Кривая Гильберта состоит из четырех соединенных прямыми элементов: а, Ъ, с и б. Каждый элемент строит соответствующая процедура. } procedure a(i:integer; canvas: TCanvas); forward; procedure b(i:integer; canvas: TCanvas); forward; procedure c(i:integer; canvas: TCanvas); forward; procedure d(i:integer; canvas: TCanvas); forward;// Элементы кривой procedure a(i: integer; canvas: TCanvas); begin if i > 0 then begin d(i-l, canvas); canvas.LineTo(canvas.PenPos.X+u, canvas.PenPos.Y); a (i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y+u); a (i-1, canvas); canvas.LineTo(canvas.PenPos.X-u, canvas.PenPos.Y); с(i-1, canvas); end; end;procedure b(i: integer; canvas: TCanvas); begin if i > 0 then begin с (i-1, canvas); canvas.LineTo(canvas.PenPos.X-u, canvas.PenPos.Y); b(i-l, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u); b(i-l, canvas); canvas.LineTo(canvas.PenPos.X+u,canvas.PenPos.Y); d(i-l, canvas); end; end;procedure c(i: integer; canvas: TCanvas); begin if i > 0 then begin b(i-l, canvas); canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y-u); с(i-1, canvas) ; canvas.LineTo(canvas.PenPos.X-u, canvas.PenPos.Y); с(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y+u); a(i-1, canvas); end; end; procedure d(i: integer; canvas: TCanvas); begin if i > 0 then begin a (i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y+u); d(i-l, canvas); canvas.LineTo(canvas.PenPos.X+u,canvas.PenPos.Y); d(i-l, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u); b(i-l, canvas); end; end;// обработка события OnPaint procedure TForml.FormPaint(Sender: TObject); begin Forml.Canvas.MoveTo(u,u); a(5,Forml.Canvas); // вычертить кривую Гильберта and;

28. Напишите профамму, которая на поверхность формы выво дит изображение оцифрованной координатной сетки (рис. 1.24).

Рис. 1.24. Координатная сетка

/ обработка события OnPaint procedure TForml.FormPaint(Sender: TObject); var xO,yO:integer; // координаты начала координатных осей dx,dy:integer; // шаг координатной сетки (в пикселах) h,w:integer; // высота и ширина области вывода координатной // сетки х,у:integer; lx,ly:real; // метки (оцифровка) линий сетки по X и Y dlx,dly:real; // шаг меток (оцифровки) линий сетки по X и Y cross:integer; // счетчик не оцифрованных линий сетки dcross:integer; // количество не оцифрованных линий // между оцифрованными begin х0:=30; у0:=220; // оси начинаются в точке (40,250) dx:=40; dy:=4O; // шаг координатной сетки 40 пикселов dcross:=1; // помечать линии сетки X: 1 — каждую; // 2 — через одну; // 3 ~ через две; dlx:=0.5; // шаг меток qch X dly:=1.0; // шаг меток оси У, метками будут: 1,2,3 // и т. д. h:=200; w:=300; with forml.Canvas do begin cross:=dcross ; MoveTo(xO,yO); LineTofxO,yO-h); // ось X MoveTo(xO,yO); LineTo(xO+w,yO); // ось Y // засечки, сетка и оцифровка по оси X x:=xO+dx; lx:=dlx; repeat MoveTo(x,yO-3);LineTo(x,yO+3) ; // засечка cross:=cross-l; if cross = 0 then //оцифровка begin TextOut(x-8,yO+5,FloatToStr(lx)) ; cross:=dcross; end; Pen.Style:=psDot; MoveTo(x,yO-3);LineTo(x,yO-h); // линия сетки Pen.Style:=psSolid; lx:=lx+dlx; x:=x+dx; until (x>xO+w); // засечки, сетка и оцифровка по оси Y y:=yO-dy;  ly:=dly;  repeat  MoveTo(xO-3, у);LineTo(xO+3,y) ; // засечка TextOut(xO-20,y,FloatToStr(ly)) // оцифровка Pen.Style:=psDot ;  MoveTo(xO+3,y); LineTo(xO+w,y); // линия сетки Pen.Style:=psSolid;  y:=y-dy;  ly:=ly+dly;  until (y<yO-h);  end;  end;