Непрерывная анимация

Автор: Пользователь скрыл имя, 26 Декабря 2011 в 20:45, практическая работа

Описание работы

Программа является примером создания анимационных объектов. Анимация представляет собой совокупность множества кадров движеня человечка, каждый из которых чуть-чуть отличается от предыдущего.При быстром поочередном просмотре кадров это создает иллюзию движения. Для того, чтобы сделать анимацию плавной, необходимо описать движение соответствующими функциями. Допустимо считать, что руки и ноги человечка движутся по окружностям с соответствующими центрами. Тогда легко рассчитать их положение в любой момент вреени и соответственно разбить это движение на любое число кадров.

Работа содержит 1 файл

СПИОС_Логвиненко.doc

— 66.50 Кб (Скачать)

Министерство  Образования и Науки Украины

Национальный  Технический Университет Украины

“ Киевский Политехнический Институт” 

Межуниверситетский  медико-инженерный факультет

Кафедра лечебно-диагностических комплексов

 
 
 
 
 

Расчетно-графическая  работа

по дисциплине: «Системное программирование и операционные системы»

на тему:

«Непрерывная анимация» 
 
 
 
 
 

                                                              Выполнил: 

                                                              Студент 4-го курса

                                                              Группы ЛД-71

                                                              Логвиненко М.В. 
 
 

Киев 2011

 

Описание  программы: 

Программа является примером создания анимационных объектов. Анимация представляет собой совокупность множества кадров движеня человечка, каждый из которых чуть-чуть отличается от предыдущего.При быстром поочередном просмотре кадров это создает иллюзию движения. Для того, чтобы сделать анимацию плавной, необходимо описать движение соответствующими функциями. Допустимо считать, что руки и ноги человечка движутся по окружностям с соответствующими центрами. Тогда легко рассчитать их положение в любой момент вреени и соответственно разбить это движение на любое число кадров. 

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

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "UMult2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

      : TForm(Owner)

{

}

//---------------------------------------------------------------------------

#define Pi 3.1415926535897932385

short int cadr = 0;           // номер кадра

short int H=30;               // длина ноги и руки

short int Xpos = 3 * H;       // координата опорной ноги

short int Ypos = 120;         // "земля"

short int Hmen = 30;          // высота тела

short int Rhead = 10;         // радиус головы

short int revers = 1;         // направление движения

short int L = H * 1.41;       // длина ноги

short int Ncadr=16;           // число кадров на шаг

//---------------------------------------------------------------------------

void __fastcall TForm1::Draw()

{

float Angl = Pi/4*(1+(2.*cadr)/(Ncadr-1));

short int Yb = Ypos-H*sin(Angl);

short int Yt = Yb-Hmen;

short int X = Xpos-revers*H*cos(Angl);

Image1->Canvas->MoveTo(X-(Xpos-X),Ypos);

Image1->Canvas->LineTo(X,Yb);        // нога                       // нога

if (cadr != Ncadr / 2-1)

  Image1->Canvas->LineTo(Xpos,Ypos); // другая нога

Image1->Canvas->MoveTo(X,Yb);

Image1->Canvas->LineTo(X,Yt);        // туловище

short int X1 = X - revers * (Yb-Ypos);

Image1->Canvas->MoveTo(X1,Yt+5-(Xpos-X));

Image1->Canvas->Ellipse(X1-Rhead / 2,Yt+5-(Xpos-X)-Rhead / 2,X1+Rhead / 2,Yt+5-(Xpos-X)+Rhead / 2);

Image1->Canvas->LineTo(X,Yt+5);      // рука                       // рука

if (cadr != Ncadr / 2-1)

{

  Image1->Canvas->Ellipse(X1-Rhead / 2,Yt+5+(Xpos-X)-Rhead / 2,X1+Rhead / 2,Yt+5+(Xpos-X)+Rhead / 2);

  Image1->Canvas->LineTo(X1,Yt+5+(Xpos-X)); // другая рука

}

Image1->Canvas->Ellipse(X-Rhead,Yt-2*Rhead,X+Rhead,Yt);

Image1->Canvas->Rectangle(X-Rhead,Yt-2*Rhead-4,

                          X+Rhead,Yt-2*Rhead-1);  // шляпа

}

//---------------------------------------------------------------------------

void __fastcall TForm1::BRunClick(TObject *Sender)

{

Timer1->Enabled = ! Timer1->Enabled;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

Draw();

cadr = (cadr+1) % Ncadr;

if (cadr == 0)

  if ((Xpos < Image1->Picture->Width-revers*3*H) &&

      (Xpos>-revers*3*H))

    Xpos += revers*H*1.41;

  else revers = -revers;

Draw();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

//раскомментируйте  следующий оператор для файла  фона

//  if (OpenPictureDialog1->Execute())

//    Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName); 

//раскомментируйте  следующие операторы для фона - Rectangle

/*  Image1->Canvas->Brush->Color = 0;

  Image1->Canvas->Rectangle(90,0,200,100);

  Image1->Canvas->Brush->Color = clWhite;

*/

  Image1->Canvas->MoveTo(0,Ypos+3);

  Image1->Canvas->Pen->Width = 4;

  Image1->Canvas->LineTo(Image1->ClientWidth,Ypos+3); // земля

  Image1->Canvas->Pen->Width = 1;

  Image1->Canvas->Pen->Mode = pmNotXor;

  Timer1->Interval = 600 / Ncadr;

  Draw();

}

//--------------------------------------------------------------------------- 

Скриншоты: 

 

 

 

Выводы: 

Описанный алгорит  может быть использован при создании обучающих программ для "оживления" схем, изображений, механизмов, чтобы  показать в движении взаимодействие их отдельных составляющих.

Информация о работе Непрерывная анимация