Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Аниматор - файл Отчет.doc


Аниматор
скачать (391.6 kb.)

Доступные файлы (2):

Animator.exe
Отчет.doc662kb.26.05.2006 19:20скачать

содержание

Отчет.doc

Описательная постановка задачи
Написать программу на языке высокого уровня Delphi для демонстрации анимации.

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

При этом управлять его конечностями (руками и ногами) можно кнопками. Для каждой конечности будут определены две управляющие кнопки – для движения конечности в одну и другую стороны.
Алгоритмы для решения задач
Графически «зеленый человечек» состоит из:

- туловище;

- голова;

- правая рука;

- левая рука;

- правое бедро;

- правая голень;

- левое бедро;

- левая голень;

- правое колено;

- левое колено.
Для каждой конечности определим две управляющие кнопки: «вверх» и «вниз».

При нажатии на кнопку «вверх» человечек поднимает на 1 градус соответствующую конечность. При нажатии на кнопку «вниз» человечек опускает на 1 градус соответствующую конечность. При этом угол поднятия рук - от 30 до 150 градусов, угол поднятия ног – от 0 до 60 градусов.
Ниже представлена схема человечка.



Рисунок 1 – Схема человечка

Ниже представлены рисунки исходного и конечного положений человечка.



Рисунок 2 – Исходное положение



Рисунок 3 – Конечное положение

^ Разработка программы
Язык программирования, используемый при разработке программы: язык высокого уровня Delphi.

Среда программирования: Borland Delphi 7.0.
Проект состоит из одной формы.

Рисунок 4 – Форма программы

-

Компоненты Form1.


Кнопки «Вверх» и «Вниз» управления левой рукой

Кнопки «Вверх» и «Вниз» управления правой рукой
Кнопки «Вверх» и «Вниз» управления левой ногой

Кнопки «Вверх» и «Вниз» управления правой ногой
Заглавие кнопок управления

Заглавие кнопок управления

Заглавие кнопок управления

Заглавие кнопок управления
Для рисования туловища используем метод объекта Canvas – RoundRect(x1,y1,x2,y2,x3,y3),

где x1,y1,x2,y2 – координаты двух точек прямоугольника;

x3,y3 – размеры эллипса скругления углов прямоугольника.
Для рисования головы и колен используем метод объекта Canvas – Ellipse(x1,y1,x2,y2), где x1,y1,x2,y2 – координаты прямоугольника, ограничивающего эллипс.
Для рисования рук и ног используем пользовательскую процедуру рисования прямоугольника по координатам его направляющего отрезка и заданной толщине прямоугольника:
procedure tform1.drawrect(x1,y1,x2,y2,t,c: integer);

var ua,ub: real;

xa,xb,xc,xd,ya,yb,yc,yd,fx,fy: integer;

begin

if (x2-x1)=0 then ua:=pi/2

else ua:=arctan(((y2-y1)/(x2-x1)));

ub:=ua-pi/2;

xa:=round(x1-cos(ub)*t/2);

xb:=round(x1+cos(ub)*t/2);

xc:=round(x2+cos(ub)*t/2);

xd:=round(x2-cos(ub)*t/2);

ya:=round(y1-sin(ub)*t/2);

yb:=round(y1+sin(ub)*t/2);

yc:=round(y2+sin(ub)*t/2);

yd:=round(y2-sin(ub)*t/2);
fx:=round((x2-x1)/2+x1);

fy:=round((y2-y1)/2+y1);
with form1.image1.canvas do { рисование осей }

begin

brush.color:=clgreen;

pen.color:=clgreen;

end;

Image1.Canvas.MoveTo(xa,ya);

Image1.Canvas.LineTo(xb,yb);

Image1.Canvas.LineTo(xc,yc);

Image1.Canvas.LineTo(xd,yd);

Image1.Canvas.LineTo(xa,ya);

Image1.Canvas.FloodFill(fx,fy,c,fsBorder);
end;

Формулы, используемые при расчете:
url:=urlx*pi/180; { перевод углов из градусов в радианы }

urp:=urpx*pi/180;

unl:=unlx*pi/180;

unp:=unpx*pi/180;
x1r:=round(x-wb/2); { расчет координат туловища }

y1r:=round(y-hb/2);

x2r:=round(x+wb/2);

y2r:=round(y+hb/2);
obx:=x1r; oby:=y1r; { точка отсчета координат конечностей }
x1rl:=round(obx+wb-tr*sin(pi/3)); { расчет точки плеча левой руки }

y1rl:=round(oby+tr*cos(pi/3));

x2rl:=round(x1rl+lr*sin(url)); { расчет точки запястья левой руки }
y2rl:=round(y1rl+lr*cos(url));
x1rp:=round(obx+tr*sin(pi/3)); { расчет точки плеча правой руки }

y1rp:=round(oby+tr*cos(pi/3));
x2rp:=round(x1rp-lr*sin(urp)); {расчет точки запястья правой руки }

y2rp:=round(y1rp+lr*cos(urp));
x1nl1:=round(obx+wb-tn); { расчет основания бедра левой ноги }

y1nl1:=round(oby+hb-tn*cos(pi/6));
x2nl1:=round(x1nl1+ln*sin(unl)); { расчет колена левой ноги }

y2nl1:=round(y1nl1+ln*cos(unl));
x1nl2:=x2nl1;

y1nl2:=y2nl1;
x2nl2:=round(x1nl2-ln*sin(unl)); { расчет точки ступни левой ноги }

y2nl2:=round(y1nl2+ln*cos(unl));
x1np1:=round(obx+tn); { расчет основания бедра правой ноги }

y1np1:=round(oby+hb-tn*cos(pi/6));
x2np1:=round(x1np1-ln*sin(unp)); {расчет колена правой ноги }

y2np1:=round(y1np1+ln*cos(unp));
x1np2:=x2np1;

y1np2:=y2np1;
x2np2:=round(x1np2+ln*sin(unp)); {расчет точки ступни правой ноги }

y2np2:=round(y1np2+ln*cos(unp));
Для рисования всего человечка используем пользовательскую процедуру:
procedure tform1.drawbody (x,y,wb,hb: integer;

urlx,urpx,unlx,unpx,lr,ln,tr,tn,col: integer);

var x1r,y1r,x2r,y2r: integer;

obx,oby,x1rl,y1rl,x2rl,y2rl,x1rp,y1rp,x2rp,y2rp: integer;

x1nl1,y1nl1,x2nl1,y2nl1,x1nl2,y1nl2,x2nl2,y2nl2: integer;

x1np1,y1np1,x2np1,y2np1,x1np2,y1np2,x2np2,y2np2: integer;

url,urp,unl,unp: real;

begin

with form1.image1.canvas do { рисование осей }

begin

brush.color:=clwhite;

pen.color:=clwhite;

end;

form1.Image1.Canvas.rectangle(0,0,form1.Image1.Width,form1.Image1.Height);
with form1.image1.canvas do

begin

brush.color:=col;

pen.color:=col;

end;
url:=urlx*pi/180;

urp:=urpx*pi/180;

unl:=unlx*pi/180;

unp:=unpx*pi/180;
x1r:=round(x-wb/2);

y1r:=round(y-hb/2);

x2r:=round(x+wb/2);

y2r:=round(y+hb/2);
obx:=x1r; oby:=y1r;

x1rl:=round(obx+wb-tr*sin(pi/3)); { расчет левой руки }

y1rl:=round(oby+tr*cos(pi/3));

x2rl:=round(x1rl+lr*sin(url));

y2rl:=round(y1rl+lr*cos(url));
x1rp:=round(obx+tr*sin(pi/3)); { расчет правой руки }

y1rp:=round(oby+tr*cos(pi/3));

x2rp:=round(x1rp-lr*sin(urp));

y2rp:=round(y1rp+lr*cos(urp));
x1nl1:=round(obx+wb-tn); { расчет бедра левой ноги }

y1nl1:=round(oby+hb-tn*cos(pi/6));

x2nl1:=round(x1nl1+ln*sin(unl));

y2nl1:=round(y1nl1+ln*cos(unl));

x1nl2:=x2nl1; { расчет голени левой ноги }

y1nl2:=y2nl1;

x2nl2:=round(x1nl2-ln*sin(unl));

y2nl2:=round(y1nl2+ln*cos(unl));
x1np1:=round(obx+tn); { расчет бедра правой ноги }

y1np1:=round(oby+hb-tn*cos(pi/6));

x2np1:=round(x1np1-ln*sin(unp));

y2np1:=round(y1np1+ln*cos(unp));

x1np2:=x2np1; { расчет голени правой ноги }

y1np2:=y2np1;

x2np2:=round(x1np2+ln*sin(unp));

y2np2:=round(y1np2+ln*cos(unp));
drawrect(x1rl,y1rl,x2rl,y2rl,tr,col); { рисование левой руки }

drawrect(x1rp,y1rp,x2rp,y2rp,tr,col); { рисование правой руки }

drawrect(x1nl1,y1nl1,x2nl1,y2nl1,tn,col);{рисование бедра левой ноги }

drawrect(x1nl2,y1nl2,x2nl2,y2nl2,tn,col); { рисование голени левой ноги }

drawrect(x1np1,y1np1,x2np1,y2np1,tn,col); { рисование бедра правой ноги }

drawrect(x1np2,y1np2,x2np2,y2np2,tn,col); { рисование голени правой ноги }

form1.Image1.Canvas.roundrect(x1r,y1r,x2r,y2r,10,10);

form1.Image1.Canvas.Ellipse(x1r,y1r,x1r+wb,y1r-wb);

form1.Image1.Canvas.Ellipse(round(x2nl1-tn/2),round(y2nl1-2*tn/3),

round(x2nl1+2*tn/3),round(y2nl1+2*tn/3));

form1.Image1.Canvas.Ellipse(round(x2np1-tn/2),round(y2np1-2*tn/3),

round(x2np1+2*tn/3),round(y2np1+2*tn/3));
end;
Для инициализации положения человечка, используем пользовательскую процедуру, выполняющуюся при открытии формы:
procedure TForm1.Form1Activate(Sender: TObject);

begin

{ исходное положение человечка: }

url:=30; { угол поднятия левой руки в град. }

urp:=30; { угол поднятия правой руки в град. }

unl:=0; { угол поднятия левой ноги в град. }

unp:=0; { угол поднятия правой ноги в град. }

wb:=40; { ширина туловища }

hb:=70; { высота туловища }

x:=150; { координата x центра туловища }

y:=200; { координата y центра туловища }

lr:=60; ln:=45; { длина рук и ног }

tr:=8; tn:=8; { толщина рук и ног }

col:=clgreen; { цвет человечка }
drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);
end;

Для изменения положения человечка используем пользовательскую процедуру, выполняющуюся при нажатии на кнопку формы:
{ опустить на 1 градус левую руку }

procedure TForm1.Button1Click(Sender: TObject);
{ поднять на 1 градус левую руку }

procedure TForm1.Button2Click(Sender: TObject);
{ опустить на 1 градус правую руку }

procedure TForm1.Button3Click(Sender: TObject);
{ поднять на 1 градус правую руку }

procedure TForm1.Button4Click(Sender: TObject);
{ опустить на 1 градус левую ногу }

procedure TForm1.Button5Click(Sender: TObject);
{ поднять на 1 градус левую ногу }

procedure TForm1.Button6Click(Sender: TObject);
{ опустить на 1 градус правую ногу }

procedure TForm1.Button7Click(Sender: TObject);
{ поднять на 1 градус правую ногу }

procedure TForm1.Button8Click(Sender: TObject);

{ опустить на 1 градус левую руку }

procedure TForm1.Button1Click(Sender: TObject);

begin

if url>30 then dec(url);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
{ поднять на 1 градус левую руку }

procedure TForm1.Button2Click(Sender: TObject);

begin

if url<150 then inc(url);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
{ опустить на 1 градус правую руку }

procedure TForm1.Button3Click(Sender: TObject);

begin

if urp>30 then dec(urp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
{ поднять на 1 градус правую руку }

procedure TForm1.Button4Click(Sender: TObject);

begin

if urp<150 then inc(urp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
{ опустить на 1 градус левую ногу }

procedure TForm1.Button5Click(Sender: TObject);

begin

if unl>0 then dec(unl);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
{ поднять на 1 градус левую ногу }

procedure TForm1.Button6Click(Sender: TObject);

begin

if unl<60 then inc(unl);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
{ опустить на 1 градус правую ногу }

procedure TForm1.Button7Click(Sender: TObject);

begin

if unp>0 then dec(unp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
{ поднять на 1 градус правую ногу }

procedure TForm1.Button8Click(Sender: TObject);

begin

if unp<60 then inc(unp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
Блок-схема программы

Блок-схема программы приведена на рисунке 5.



Рисунок 5 - Блок-схема алгоритма программы

Блок-схемы основных процедур программы приведены на рисунках 6 - 8.

Рисунок 6 – Блок-схема процедуры DrawRect

Рисунок 7 – Блок-схема процедуры DrawBody

Рисунок 8 – Блок-схема процедуры Form1.Activate

^ Листинг программы

unit Unit1;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;
type

TForm1 = class(TForm)

Image1: TImage;

Label6: TLabel;

Label1: TLabel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

Button6: TButton;

Label2: TLabel;

Button7: TButton;

Button8: TButton;

Label3: TLabel;
procedure Form1Activate(Sender: TObject);

procedure drawbody(x,y,wb,hb: integer; urlx,urpx,unlx,unpx,lr,ln,tr,tn,col: integer);

procedure drawrect(x1,y1,x2,y2,t,c: integer);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

{ procedure Button9Click(Sender: TObject);

procedure Button8Click(Sender: TObject);}

private

{ Private declarations }

public

{ Public declarations }

end;
var

Form1: TForm1;
implementation

var url,urp,unl,unp, wb,hb,x,y,lr,ln,tr,tn,col: integer;

a3,a2,a1,a0,b1,b2: real;

i,n: integer;
{$R *.dfm}


procedure tform1.drawrect(x1,y1,x2,y2,t,c: integer);

var ua,ub: real;

xa,xb,xc,xd,ya,yb,yc,yd,fx,fy: integer;

begin

if (x2-x1)=0 then ua:=pi/2

else ua:=arctan(((y2-y1)/(x2-x1)));

ub:=ua-pi/2;

xa:=round(x1-cos(ub)*t/2);

xb:=round(x1+cos(ub)*t/2);

xc:=round(x2+cos(ub)*t/2);

xd:=round(x2-cos(ub)*t/2);

ya:=round(y1-sin(ub)*t/2);

yb:=round(y1+sin(ub)*t/2);

yc:=round(y2+sin(ub)*t/2);

yd:=round(y2-sin(ub)*t/2);
fx:=round((x2-x1)/2+x1);

fy:=round((y2-y1)/2+y1);
with form1.image1.canvas do

begin

brush.color:=col;

pen.color:=col;

end;

Image1.Canvas.MoveTo(xa,ya);

Image1.Canvas.LineTo(xb,yb);

Image1.Canvas.LineTo(xc,yc);

Image1.Canvas.LineTo(xd,yd);

Image1.Canvas.LineTo(xa,ya);

Image1.Canvas.FloodFill(fx,fy,c,fsBorder);

end;


procedure tform1.drawbody (x,y,wb,hb: integer;

urlx,urpx,unlx,unpx,lr,ln,tr,tn,col: integer);

var x1r,y1r,x2r,y2r: integer;

obx,oby,x1rl,y1rl,x2rl,y2rl,x1rp,y1rp,x2rp,y2rp: integer;

x1nl1,y1nl1,x2nl1,y2nl1,x1nl2,y1nl2,x2nl2,y2nl2: integer;

x1np1,y1np1,x2np1,y2np1,x1np2,y1np2,x2np2,y2np2: integer;

url,urp,unl,unp: real;

begin

with form1.image1.canvas do

begin

brush.color:=clwhite;

pen.color:=clwhite;

end;

form1.Image1.Canvas.rectangle(0,0,form1.Image1.Width,form1.Image1.Height);
with form1.image1.canvas do

begin

brush.color:=col;

pen.color:=col;

end;
url:=urlx*pi/180;

urp:=urpx*pi/180;

unl:=unlx*pi/180;

unp:=unpx*pi/180;
x1r:=round(x-wb/2);

y1r:=round(y-hb/2);

x2r:=round(x+wb/2);

y2r:=round(y+hb/2);
obx:=x1r; oby:=y1r;

x1rl:=round(obx+wb-tr*sin(pi/3)); { рисование левой руки }

y1rl:=round(oby+tr*cos(pi/3));

x2rl:=round(x1rl+lr*sin(url));

y2rl:=round(y1rl+lr*cos(url));
x1rp:=round(obx+tr*sin(pi/3)); { рисование правой руки }

y1rp:=round(oby+tr*cos(pi/3));

x2rp:=round(x1rp-lr*sin(urp));

y2rp:=round(y1rp+lr*cos(urp));
x1nl1:=round(obx+wb-tn); { рисование бедра левой ноги }

y1nl1:=round(oby+hb-tn*cos(pi/6));

x2nl1:=round(x1nl1+ln*sin(unl));

y2nl1:=round(y1nl1+ln*cos(unl));

x1nl2:=x2nl1; { рисование голени левой ноги }

y1nl2:=y2nl1;

x2nl2:=round(x1nl2-ln*sin(unl));

y2nl2:=round(y1nl2+ln*cos(unl));
x1np1:=round(obx+tn); { рисование бедра правой ноги }

y1np1:=round(oby+hb-tn*cos(pi/6));

x2np1:=round(x1np1-ln*sin(unp));

y2np1:=round(y1np1+ln*cos(unp));

x1np2:=x2np1; { рисование голени правой ноги }

y1np2:=y2np1;

x2np2:=round(x1np2+ln*sin(unp));

y2np2:=round(y1np2+ln*cos(unp));
drawrect(x1rl,y1rl,x2rl,y2rl,tr,col); { рисование левой руки }

drawrect(x1rp,y1rp,x2rp,y2rp,tr,col); { рисование правой руки }

drawrect(x1nl1,y1nl1,x2nl1,y2nl1,tn,col); { рисование бедра левой ноги }

drawrect(x1nl2,y1nl2,x2nl2,y2nl2,tn,col); { рисование голени левой ноги }

drawrect(x1np1,y1np1,x2np1,y2np1,tn,col); { рисование бедра правой ноги }

drawrect(x1np2,y1np2,x2np2,y2np2,tn,col); { рисование голени правой ноги }

form1.Image1.Canvas.roundrect(x1r,y1r,x2r,y2r,10,10);

form1.Image1.Canvas.Ellipse(x1r,y1r,x1r+wb,y1r-wb);

form1.Image1.Canvas.Ellipse(round(x2nl1-tn/2),round(y2nl1-2*tn/3),

round(x2nl1+2*tn/3),round(y2nl1+2*tn/3));

form1.Image1.Canvas.Ellipse(round(x2np1-tn/2),round(y2np1-2*tn/3),

round(x2np1+2*tn/3),round(y2np1+2*tn/3));
end;


procedure TForm1.Form1Activate(Sender: TObject);

begin

url:=30; { исходное положение человечка }

urp:=30;

unl:=0;

unp:=0;

wb:=40;

hb:=70;

x:=150;

y:=200;

lr:=60; ln:=45;

tr:=8; tn:=8;

col:=clgreen;

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);
end;
procedure TForm1.Button1Click(Sender: TObject);

begin

if url>30 then dec(url);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
procedure TForm1.Button2Click(Sender: TObject);

begin

if url<150 then inc(url);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
procedure TForm1.Button3Click(Sender: TObject);

begin

if urp>30 then dec(urp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
procedure TForm1.Button4Click(Sender: TObject);

begin

if urp<150 then inc(urp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
procedure TForm1.Button5Click(Sender: TObject);

begin

if unl>0 then dec(unl);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
procedure TForm1.Button6Click(Sender: TObject);

begin

if unl<60 then inc(unl);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
procedure TForm1.Button7Click(Sender: TObject);

begin

if unp>0 then dec(unp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;
procedure TForm1.Button8Click(Sender: TObject);

begin

if unp<60 then inc(unp);

drawbody(x,y,wb,hb,url,urp,unl,unp,lr,ln,tr,tn,col);

end;

end.

^ Инструкция по пользованию программой

Программа Animator написана на языке высокого уровня Borland Delphi и предназначена для демонстрации анимации.
Программа работает под операционной системой ^ Windows.
Для запуска программы запустите файл Animator.exe.


Нажимайте кнопки управления и наблюдайте анимацию объекта.

^ Выводы
Программа Animator демонстрирует простую анимацию в среде программирования Borland Delphi 7.0. Программа показывает основные принципы создания анимации.

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


Скачать файл (391.6 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации