Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи_Делфи.docx
Скачиваний:
9
Добавлен:
14.08.2019
Размер:
1.17 Mб
Скачать

Глава 2

Изучение графики и работа с изображениями

2.1. Класс tCanvas, его свойства и методы

2.1.1. Рисование узоров

П остановка задачи. Заполните экран каким-нибудь узором, например, ромбиками, как показано на рис. 8.

Реализация. Положим на форму две кнопки «Рисовать» и «Выход». Для рисования одного ромбика напишем процедуру

put_romb (i, k: integer; col: Tcolor) с входными параметрами i, k, где i – номер строки, k – номер столбца. Входной параметр col – это цвет.

Расположим ромбики так: верхний ряд состоит из десяти ромбиков, следующий – из девяти, последний – из одного ромбика. Закрасим ромбы, выбрав цвет случайным образом с помощью функции RGB.

Ниже приведен код основных процедур.

Рис. 8. Узор «Ромбы»

const

d1=15; //длина горизонтальной диагонали ромба

d2=30; //длина вертикальной диагонали ромба

{ Глобальные переменные }

var x0,y0: integer; // координаты центра левого верхнего ромба

procedure put_romb(i, k: integer; col: Tcolor); // Рисование

// ромба. Здесь i – номер строки, k – номер столбца

var x, y: integer;

begin

x:=x0+(k-1)*d1;

y:=y0+(i-1)*d2;

with Form1.Canvas do

begin

Pen.Color:=col;

Brush.Color:=col;

MoveTo(x+d1 div 2, y);

LineTo(x, y-d2 div 2);

LineTo(x-d1 div 2, y);

LineTo(x, y+d2 div 2);

LineTo(x+d1 div 2, y);

FloodFill(x, y, col, fsborder);

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

close;

end;

procedure TForm1.Button1Click(Sender: TObject);

var i,k:integer;

col:TColor;

begin

for i:=1 to 10 do

begin

for k:=i to 10 do

begin

col:=RGB(random(256),random(256),random(256));

put_romb(i, k, col);

end;

x0:=x0 – d1 div 2;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

x0:=d1;

y0:=d2;

end;

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

2.1.2. Рисование поля для различных игр

Во многих игровых проектах таких, как «Крестики-нолики», «Сапер», «Морской бой» и других, игровое пространство представляет собой поле в клеточку заданного размера. Напишем свою процедуру DrawPole и будем использовать ее по мере необходимости. Входными параметрами для этой процедуры являются число клеток n по горизонтали (по вертикали то же самое), число h – размер одной клетки в пикселах и координаты левого верхнего угла поля (х0, у0). Рисовать будем на форме.

procedure DrawPole (n, h, x0, y0 : integer);

var i, j, x, y : integer;

begin

for i:= 1 to n do

begin

y:=y0 + (i – 1)*h;

for j:= 1 to n do

begin

x:=x0 + (j – 1)*h;

with Form1.Canvas do

begin

Pen.Color:= ClBlack;

Brush.Color:= ClWhite;

Brush.Style:= BsSolid;

Rectangle(x, y, x + h, y + h);

end;

end;

end;

end;

Для вызова процедуры DrawPole (n, h, x0, y0) надо задать константы n и h, а также начальные значения глобальных переменных x0, y0. Начальные данные зададим в методе формы Сreate.

procedure TForm1.FormCreate(Sender: TObject);

begin

x0:=10;

y0:=10;

end;

Метод формы Сreate не позволяет выводить изображение на форму, поэтому можно организовать вывод поля несколькими способами. Один из способов – вывести изображение по щелчку кнопки. Другой способ заключается в использовании события формы Paint. Рассмотрим второй способ. Выберите среди событий (Events) формы событие Paint и кликните дважды справа в выбранной строке. Откроется обработчик метода Paint, и в нем напишите:

DrawPole (n, h, x0, y0);

Результат работы программы приведен на рис. 9.

Рис. 9. Поле для игровых проектов

Задание. Положите на форму компонент TPaintBox, установите программным путем его размеры (свойства Width и Height), равными размерам поля. Выведите поле на PaintBox1. Как надо изменить формулы для нахождения х и у? Нужны ли в этом случае х0 и у0?