12402

РОДОСЛІДЖЕННЯ АЛГОРИТМУ ДИНАМІЧНОЇ ГРАФІКИ

Лабораторная работа

Информатика, кибернетика и программирование

ЛАБОРАТОРНА РОБОТА № 7 РОДОСЛІДЖЕННЯ АЛГОРИТМУ ДИНАМІЧНОЇ ГРАФІКИ Ціль лабораторної роботи складається з вивчення: структури і призначення елементів інтегрованого середовища С Buіlder для розробки функцій прикладної програми С до блоксхем алгоритмів з динамічної...

Украинкский

2013-04-27

75 KB

1 чел.

ЛАБОРАТОРНА РОБОТА № 7

РОДОСЛІДЖЕННЯ АЛГОРИТМУ ДИНАМІЧНОЇ ГРАФІКИ

Ціль лабораторної роботи складається з вивчення: структури і призначення елементів інтегрованого середовища С++ Buіlder для розробки функцій прикладної програми С++ до блок-схем алгоритмів з динамічної графіки на формі вікна.

1. Загальні зведення до динамічної графіки на формі вікна

Динамічна графіка на формі вікна програми будується на принципах мультиплікації окремих кадрів з зображенням. Для динамічної графіки необхідно будувати набір кадрів і кожних з них трішечки повинен відрізнятися деяким елементом від попереднього кадру в послідовності. Динамічне графічне зображення виникає за рахунок перегляду кадрів у завданій послідовності при відповідному інтервалі часу між змінами кадрів. Зменшення інтервалу часу між кадрами збільшує динаміку графічного зображення, а збільшення інтервалу часу – навпаки уповільнює динаміку спостереження графічних кадрів.

В С++ Builder для розробки прикладних програм з керуванням інтервалів часу використовується компонента Timer . Таймер має дві властивості , яки дозволяють керувати роботою компоненти Timer :

- перша властивість Interval визначає в мілісекундах інтервал зміни часу між кадрами динамічної графіки або іншими подіями в прикладній програмі. Наприклад, значення 500 для властивості Interval фізично відповідає 0,5 сек.;

- друга властивість Enabled  доступність до роботи компоненти.

Властивість Interval задає період спрацьовування таймеру і може налаштовуватись при проектуванні форми або встановлюватись програмно при роботі програми. Якщо при запуску програми властивість Interval завдано, тоді активним буде у програмі С++ обробник події OnTimer  кожен раз після закінчення інтервалу часу, завданого у властивості Interval . Якщо задати для   Interval = 0 або для  Enabled = false, тоді таймер стане вимкнутим. Для включення відліку часу потрібно задати Enabled = true. Оператори у програмі С++ для керування властивостями компоненти таймер записуються у таких форматах:  

Timer->Interval = 5000;

Timer->Enabled = true; .

Кнопка SpeedButton з фіксацією положення (натиснута / не натиснута) може мати напис або зображення іконки. У властивості Caption задається напис на кнопку та можливо додати зображення іконки у властивості Glyph . 

2. Постановка задачі до виконання лабораторної роботи

При виконанні лабораторної роботи потрібно створити програму С++ для роботи у Wіndows, в який на формі вікна можливо буде вести спостереження за динамічною графікою зображення та досліджувати при допомозі відладчіка С++ Builder у покроковому режимі виконання алгоритму з динамічної графіки. По результатах досліджень алгоритму з динамічної графіки потрібно:

- визначити перелік функцій, яки забезпечують динаміку для графічного зображення на формі програми С++;

- скласти специфікацію на визначені функції та їх призначення у програмі С++ з динамічним графічним зображенням на формі;

- розробити блок-схеми алгоритмів до функцій, записаних до специфікації;

- розробити блок-схему алгоритму з функціонування програми С++ з динамічним графічним зображенням на формі.

3. Послідовності дій і команд для програмування

задачі з лабораторної роботи

Крок 1.  Активізуємо проект файлів для нової програми С++ та виконайте команду для зберігання їх на диску в задану папку (каталог):

  •  Виконайте команду Fіle/New Applіcatіon, щоб з'явилася нова чиста форма Form1;
  •  Перейдіть у вікно інспектора об'єкта і у властивості Captіon задайте назву лабораторної роботи " Динамічна графіка ,  щоб на заголовку вікна форми програми С++ замість назви Form1 з'явився напис " Динамічна графіка ";
  •  Збережить новий проект файлів разом з порожньою формою і змінамі в заголовку вікна. Це автоматично активізує новий проект файлів і C++ Buіlder запам'ятає шлях для швидкого збереження змін у файлах, розробляємої програми. Для збереження файлів проекту відрийте на диску таки папки D:\LA_NN\LAB-Dinamica, де NN - номер навчальної групи;
  •  Далі у меню Fіle виберіть команду Save Project As та при появі запиту на збереження змінюємо назву файлу Unіt1 на файл U_dinamica.срр, а пропонуєму назву проекту Project1.bpr змінюємо на P_dinamica.bpr.

Крок 2.  Далі потрібно скомпонувати форму для прикладної програми з елементами, показаними на рис. 1.

Рис. 1. Форма програми для роботи з динамічною графікою.

Крок 3. Після закінчення розроби форми програми по рис. 1 потрібно у вікні редактора текстів сформувати наступний лістинг команд для обробок подій при роботі з динамічною графікою в Image.

//------------------------------- U_dinamica.срр --------------------------------------

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

#include <vcl.h>

#pragma hdrstop

#include "U_dinamica.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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

short int num = 0;

short int H=20;                              // шаг

short int Xpos = 2 * H;                 // координати тіла

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

short int Hmen = 30;                     // висота тіла

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

short int Rhead2 = Rhead / 2;      // радіус ладоньок

short int revers = 1;                      // напрямок руху

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

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

void __fastcall TForm1::Draw()

{

short int Yhead;                            // координата голови знизу

switch (num)

{

case 0:

  Yhead = Ypos-H-Hmen;

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

  Image1->Canvas->LineTo(Xpos,Ypos-H);                                  // нога

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

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

  Image1->Canvas->LineTo(Xpos,Yhead);                                   // тіло

  Image1->Canvas->MoveTo(Xpos+revers*H,Yhead-H);

  Image1->Canvas->LineTo(Xpos,Yhead+4);                              // рука

  Image1->Canvas->Ellipse(Xpos+revers*H-Rhead2,Yhead-H-Rhead2,Xpos+revers*H+Rhead2,Yhead-H+Rhead2);

  Image1->Canvas->LineTo(Xpos+revers*H,Yhead+H);           // друга рука

  Image1->Canvas->Ellipse(Xpos+revers*H-Rhead2,Yhead+H-Rhead2,Xpos+revers*H+Rhead2,Yhead+H+Rhead2);

  Image1->Canvas->Ellipse(Xpos-Rhead,Yhead,Xpos+Rhead,Yhead-2*Rhead);

  Image1->Canvas->Rectangle(Xpos-Rhead,Yhead-2*Rhead-1,

                  Xpos+Rhead,Yhead-2*Rhead-4);                                // шляпа

  break;

case 1:

  Yhead = Ypos-L-Hmen;

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

  Image1->Canvas->LineTo(Xpos,Yhead);

  Image1->Canvas->MoveTo(Xpos,Yhead+4);

  Image1->Canvas->LineTo(Xpos+revers*L,Yhead+4);

  Image1->Canvas->Ellipse(Xpos+revers*L-Rhead2,Yhead+4-Rhead2,Xpos+revers*L+Rhead2,Yhead+4+Rhead2);

  Image1->Canvas->Ellipse(Xpos-Rhead,Yhead,Xpos+Rhead,Yhead-2*Rhead);

  Image1->Canvas->Rectangle(Xpos-H / 2,Yhead-2*Rhead-1,

                            Xpos+H / 2,Yhead-2*Rhead-4);

}

}

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

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

Draw();

if ((Xpos >= Image1->Picture->Width-H)||(Xpos <= H))

  revers = -revers;

Xpos = Xpos + revers * H;

num = 1 - num;

Draw();

}

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

void __fastcall TForm1::BRunClick(TObject *Sender)

{

Timer1->Enabled = ! Timer1->Enabled;

}

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

void __fastcall TForm1::FormCreate(TObject *Sender)

{

//можна зняти коментар для зміни фону

//  if (OpenPictureDialog1->Execute())

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

 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;

Draw();

}

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

//--------------- U_dinamica.h---------------------------------------

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

#ifndef UMult1H

#define UMult1H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Buttons.hpp>

#include <Dialogs.hpp>

#include <ExtCtrls.hpp>

#include <ExtDlgs.hpp>

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

class TForm1 : public TForm

{

__published: // IDE-managed Components

TImage *Image1;

TSpeedButton *BRun;

TTimer *Timer1;

TOpenPictureDialog *OpenPictureDialog1;

void __fastcall FormCreate(TObject *Sender);

void __fastcall BRunClick(TObject *Sender);

void __fastcall Timer1Timer(TObject *Sender);

private: // User declarations

public:  // User declarations

void __fastcall Draw();

__fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif

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

/------------ P_dinamica.cpp ---------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

USERES("P_dinamica.res");

USEFORM("U_dinamica.cpp", Form1);

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

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

 Application->Initialize();

 Application->CreateForm(__classid(TForm1), &Form1);

 Application->Run();

}

catch (Exception &exception)

{

 Application->ShowException(&exception);

}

return 0;

}

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

PAGE  - 1 -


 

А также другие работы, которые могут Вас заинтересовать

20708. Экстремумы и точки перегиба 99 KB
  Определение: Если то называется точкой строгого локального минимума. Определение: Если то называется точкой локального максимума. Определение: Если то называется точкой строгого локального максимума.
20709. Первообразная функция и неопределенный интеграл 82 KB
  Опр: Функция называется первообразной для функции на промежутке если . Если первообразная для функции на и с произвольная постоянная то функция также является первообразной для . Если первообразная для функции на и первообразная для функции на то найдется с: . Вывод: Таким образом множество всех первообразных для на представимо в виде Опр: Множество всех первообразных функции на наз.
20710. Определенный интеграл и его свойства 157 KB
  Если постоянна на то она интегрируема и .Если и интегрируемы на то также интегрируема на и . Если интегрируема на и то также интегрируема на и . Если и совпадают на всюду за исключением может быть конечного числа точек и интегрируема на то также интегрируема на 5.
20711. Матанализ. Основные классы интегрируемых функций 90 KB
  Теорема Интегрирование монотонной функции Всякая функция fx монотонная на [ab] интегрируема на этом отрезке Доказательство: для возрастающей функции Пусть fx возрастает на [ab] может быть разрывная. Докажем это: Возьмем тогда с учетом 1 получим: тем самым доказано @ 1 Теорема Интегрируемость непрерывной функции Всякая функция fx непрерывная на [ab] интегрируема на этом отрезке. критерий интегрируемости надо доказать что @Возьмем и пользуясь равномерной непрерывностью fx на [ab] найдем выполняетсяУтверждается...
20712. Определенный интеграл. Формула Ньютона-Лейбница 138.5 KB
  Пусть функция определена на отрезке . Если существует конечный предел при то функция называется интегрируемой на отрезке а указанный предел называется определенным интегралом от функции на отрезке и обозначается a и b нижний и верхний пределы интегрирования подынтегральная функция подынтегральное выражение. Пусть функция определена на конечном или бесконечном промежутке . это функция определена на интервале и называется определенным интегралом с переменным верхним пределом интегрирования.
20713. Числовые ряды. Признаки сходимости 58 KB
  12 Числовые ряды.некоторые действительные числа называется числовым рядом. называются членами ряда. аn nый общий член ряда.
20714. Абсолютно и условно сходящиеся ряды 81.5 KB
  Абсолютно и условно сходящиеся ряды. Рассмотрим ряд где a1a2an произвольные числа. Составим ряд 2. Опр: Ряд 1 наз.
20715. Степенные ряды. Теорема Абеля 71 KB
  Функциональный ряд вида : 1 где некоторые действительные числа называется степенным рядом по степеням . Числа называются коэффициентами степенного ряда. Функциональный ряд вида : 2 где некоторые фиксированные числа называется степенным рядом по степеням называется центром сходимости степенного ряда называются коэффициентами степенного ряда.