Смекни!
smekni.com

Рисование в Delphi. Графический режим (стр. 1 из 2)

Рисование в Delphi. Графический режим.

Рисовать в Delphiможно, используя канву (холст) формы:

form1. canvas

(form1 – можно не писать).

Например, цвет заливки (кисти) можно задать так:

form1. canvas. brush. color := clRed;

Цвет линий (перо) можно задать так:

canvas. pen. color := clGreen;

Цветa можно задавать случайным образом:

canvas. brush. color := random(1000000);

Эллипс (круг) можно нарисовать так:

canvas. еllipse(x1, y1, x2, y2);

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



Причем координаты можно задать числами:

canvas. еllipse(100, 200, 300, 420);

переменными (см выше) и выражениями:

canvas. еllipse(х, y, x+100, y+150);

Отсчет ведется от левого верхнего угла клиентской области формы:


Прямоугольник (квадрат) можно задать так:

canvas.Rectangle(x1, y1, x2, y2);

по координатам двух вершин:

Линию можно нарисовать из текущего (последнего) положения (точки) в точку с заданными координатами x, yс помощью команды:

canvas.LineTo(x, y);

Начальной (самой первой) точкой считается начало координат (точка 0, 0 формы).

Переместиться из текущего положения в точку с заданными координатами x, y, не оставляя следа, можно с помощью оператора:

canvas. MoveTo(x, y);

Залить (закрасить) замкнутую область можно с помощью команды:

canvas. FloodFill(x, y, цвет, fsborder);

где x, y- координаты любой внутренней точки этой замкнутой области, цвет – цвет заливки, fsborder- режим заливки до контура (бордюра) этой области.

Проект 1. Нарисовать снеговика.

Процедура рисования может быть такой:

procedure TForm1.Button1Click(Sender: TObject);

begin

canvas.Pen.Color:=claqua;

canvas.Brush.Color:=clAqua;

canvas.Ellipse(200,200,400,400);

canvas.Ellipse( . . . );

. . .

canvas.Pen.Color:=clRed;

canvas.Brush.Color:=clRed;

canvas.Rectangle(280,30,320,60);

canvas.MoveTo(260,120);

canvas.LineTo(200,100);

canvas.MoveTo(340,120);

canvas.LineTo(400,100);

. . .

canvas.MoveTo(290,75);

canvas.LineTo(250,77);

canvas.LineTo( . . . );

. . .

canvas.FloodFill(285,77,clred,fsborder);

end;

Проект2. Нарисовать круглую мишень.

Используемоператорцикла:

for k:=1 to n do begin

. . .

end;

где n- количество кругов.

Цвет зададим случайным образом:

canvas.Brush.Color:=random(10000000);

Координаты зададим относительно центра квадратной области, в которую вписан круг:


Например так: 360-r,180-r- левая верхняя вершина, 360+r,180+r- правая нижняя вершина квадратной области.

Здесь r– радиус круга, который затем уменьшаем r:=r-25;


Дополнительно: Нарисовать квадратную мишень.

Проект 3. Нарисовать кучу шаров.

Количество шаров зададим 300.

Радиус r , координаты x, y– зададим случайным образом:

r:=random(100)+5;

x:=random(200)+220;

y:=random(100)+120;

Кроме того, нам понадобится задержка (замедление):

for i:=1 to 10000000 do;

Дополнительно: сделать шары на весь экран.

Задержку (замедление) можно убрать.

Проект4. Нарисовать столбчатую диаграмму.

Дополнительно: над каждым столбиком вывести его размер (высоту):

Подсказка: используем процедуру canvas. textout( x, y, текст);

Проект 5. Нарисовать гирлянду.

Дополнительно: на каждом круге вывести его размер (радиус):

Проект 6. Летающий шарик.

Для начала пусть летает влево – вправо отражаясь от соответствующих границ формы.

В качестве шарика используем компонент shape - фигура (см. Вкладку палитры компонентов Дополнительно). Причем, одноименное свойство shapeв инспекторе объектов настроим на значение stCircleокружность.

Для движения шарика установим компонент Timer (см. вкладку Система - часы).

Это не визуальный компонент (невидимый после запуска).

Выполняет функцию регулярного прерывания программы через определенный интервал времени (см. свойство interval) для выполненияопределенных пользователем действий (см. процедуру обработки таймера procedureTForm1.Timer1Timer(Sender: TObject);).

Объявим глобальные переменные:

var x, hx: integer;

В процедуре FormCreateвключим таймер:

timer1.Enabled:=true;

Зададим начальное положение шарика

x:=shape1.Left;

Шаг движения:

hx:=10;

Интервал прерывания таймера:

timer1.interval:=20;

Двойным щелчком по часам переходим в процедуру:

procedure TForm1.Timer1Timer(Sender: TObject);

где изменяем координату :

x:=x+hx;

Проверяем границы и меняем направление:

if (x>=536-shape1.width) or (x<=0) then hx:=-hx;

И рисуем по новым координатам (старое положение фигуры стирается автоматически):

shape1.Left:=x;

Дополнительно1: шарик должен летать по диагонали.

Подсказка: координату y определяем как shape1.top.

Дополнительно2: Сделать два шарика, летающих по диагонали не зависимо друг от друга (фигуры shape1 иshape2).

Проект 7. Броуновское (хаотичное) движение шарика.

Выбираем случайноодно из восьминаправлений:

Для этого в процедуре обработки события связанного с таймером пишем:

procedure TForm1.Timer1Timer(Sender: TObject);

var z: integer;

begin

z:= random(8);

case z of

0: begin hx:= 3; hy:= 0; end;

1: beginhx:= 3; hy:= -3; end; {оператор выбора варианта}

2: направление 2

3: направление 3

. . .

end;

x:= x + hx;

y:= y + hy;

shape1. left:= x;

shape1. top:= y;

end;

Дополнительно1: Сделать броуновское движение двух шариков.

Дополнительно2: Шарик не должен выходить за пределы формы.

Проект 8. Цветной ковер.

Для этого в процедуре обработки события связанного с таймером пишем:

for k:=1 to 100 do

canvas.Pixels[random(536),random(348)]:= random(1000000);

где Pixels[ x, y ] массив всех точек (пикселей) формы, которым присваиваем случайный цвет.

Причем красим за один раз 100 точек (пикселей).

Цвет можно задавать изменяя случайно предел интервала:

random(random(random(1000000)));

В процедуре FormCreate пишем:

randomize;

включаем таймер, задаем небольшой интервал работы таймера (определяющий скорость).

Проект 9. Броуновское (хаотичное) движение точки (пикселя), оставляющей след (траекторию).

Можно обойтись без casezof, если задать смещение точки так:

dx:= random(3) – 1;

dy:= random(3) – 1;

Очевидно будет выбрано одно из восьми направлений, т.к. выпадает случайно -1, 0, 1.

Координаты зададим в процедуре FormCreate , двигать точку будем в процедуре Timer1Timer.

Проект 10. Броуновское (хаотичное) движение Nточек (пикселей), оставляющих след (траекторию).

Координаты точек (пикселей) и цвет задаем случайным образом (random) и сохраняем их в массивах:

x[k], y[k] координаты k– ой точки, c[k] цвет k– ой точки.

При этом массивы надо объявить глобальные (перед Implementation):

Const N = 100;

Var x, y, с: array[1 . . N] of integer;

и присвоить (в процедуре FormCreate):

for k:=1 to N do begin

x[k];= random(536);

y[k]:= random(348);

c[k]:= random(random(random(1000000)));

canvas.Pixels[x[k], y[k]]:= c[k];

end;

В итоге можно получить такую картинку:


Проект 11. Снег.

Необходимо использовать массив координат, один цвет и пять направлений движения снежинок:

x[k], y[k] координаты k– ой точки.

В процедуре FormCreateзададим значения этих координат случайным образом:

randomize;

timer1.Enabled:=true;

for k:=1 to n do

begin

x[k]:=random(500)+20;

y[k]:=random(70)+50;

end;

В процедуре FormPaintнарисуем снежинки и поверхность земли:

canvas.Pen.Color:=claqua;

canvas.Brush.Color:=claqua;

canvas.Rectangle(0,320,535,330);

for k:=1 to n do

canvas.Pixels[x[k],y[k]]:=clred;

В процедуре обработки таймера находим новые значения координат:

x1:=x[k]+dx; y1:=y[k]+dy;

Рисуем снежинку по новым координатам (x1,y1) и стираем ее по старым координатам (x[k],y[k]):

canvas.Pixels[x1,y1]:=clred;

canvas.Pixels[x[k],y[k]]:=clbtnface;

Если снежинка долетает до поверхности – взамен нее выпускаем новую.

x[k]:=random(500)+20;

y[k]:=50;

Не забудем изменить (присвоить) текущие значения координат на новые:

x[k]:=x1;

y[k]:=y1;

Дополнительно: Снег должен накапливаться в сугробы:

Заставим снежинки накапливаться в сугробы (снежный покров).