1209

Создание движущегося изображения

Курсовая

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

Фрагменты программы для MS-DOS. Реализация программы в среде Windows. Анализ задания и выбор алгоритма решения. Реализация программы в среде MS-DOS. Фрагменты исходных текстов программ.

Русский

2013-01-06

52.5 KB

9 чел.

Министерство общего и профессионального образования

Российской Федерации

Южно-Уральский государственный университет

Кафедра ЭВМ

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе по курсу

"Компьютерная графика"

на тему:

"Создание движущегося изображения"

                                                   Руководитель:

                                              

                                                    Ярош Е.С.

                                                

                                                     "___" _________ 2011г.

                                              Автор работы:

                                                

студент группы ПС-457

                                                

                                                   Мерзляков Д. В.

                                                

                                                       "___" _________ 2011г.

Челябинск

2000

     

СОДЕРЖАНИЕ

1.   Задание ....................................................…………………..

2.   Анализ задания и выбор алгоритма решения ....................

3.   Реализация программы в среде MS-DOS ........................…

4.   Реализация программы в среде Windows .......................…

5.   Фрагменты исходных текстов программ ........................…

5.1. Фрагменты программы для MS-DOS .............................…

5.2. Фрагмент программы для Windows .............................…..

6. Литература……...................................................……………..

    

1. ЗАДАНИЕ

Разработать  программу,  реализующую цветное движущееся изображение "Мальчик пьет сок".  Программа  должна  быть  сделана  в  двух вариантах: в среде MS-DOS и в среде Windows.

2. АНАЛИЗ ЗАДАНИЯ И ВЫБОР АЛГОРИТМА РЕШЕНИЯ

Изначально рисуется изображение мальчика, стакана и трубочки из эллипсов,

отрезков  и прямоугольников. Затем вся задача сводится к реализации изменения уровня сока в стакане, а также движения сока по трубочке.  

    В  реализации  для  MS-DOS  формирование нового кадра изображения

не имеет смысла, то есть нет смысла  использовать видеостраницы. Дело в том, что изображение фактически меняет свой вид  довольно просто, можно сказать «линейно».

    В среде Windows я решил использовать невидимые страницы роль которых,

здесь играет контекст памяти. После того, как изображение будет сформировано в контексте памяти, оно копируется  в  контекст  рабочей  области  окна.  Это позволяет избежать "мельканий" на экране.

    3. РЕАЛИЗАЦИЯ ПРОГРАММЫ В СРЕДЕ MS-DOS

В функции “boy()” мы создаем само изображение. В начале программы пользователь вводит скорость, в программе это реализуется за счет использования функции  

языка  C  -  delay(pause),  где  pause  - величина задержки в миллисекундах.

Объем  сока в стакане меняется за счет прорисовки на поверхности сока линии, цвета фона и так до дна, а длина линий уменьшается с обоих сторон в соответствии с углом наклона стенок стакана. В данном случае   длина линии уменьшается на пиксель через две линии.

Управление осуществляется следующим образом.

Скорость задается в начале программы в пределах от10 до100 .

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

По нажатию на любую клавишу - выход из программы.

Запуск программы из командной строки: boy1.exe.

    Минимальные   системные  требования:  IBM-совместимый  компьютер,

процессор 8086, видеокарта EGA.

Программа защищена от беспорядочного ввода символов.

 4. РЕАЛИЗАЦИЯ ПРОГРАММЫ В СРЕДЕ WINDOWS

    В   программе   под  Windows,  в  сущности,  используются  те  же

математические функции для рисования изображения.  Отличия в реализации, в основном, связаны с особенностью Windows-приложений  (в частности то, что управляются они событиями). В отличие  от  MS-DOS  в  среде Windows я решил попробовать реализовать программу при помощи  "невидимой страницы" роль которой, здесь  играет контекст  памяти.  После  того,  как  изображение будет сформировано в контексте  памяти, оно копируется в контекст рабочей области окна. Это позволяет избежать "мельканий" на экране.

      При сворачивании или перекрывании окна происходит  перерисовка  изображения   по приходу по сообщению   WM_PAINT.  Изменение  скорости  движения  лыжника  осуществляется при помощи таймера,  посылающего  событие  WM_TIMER через определенные промежутки времени.  Этими промежутками времени и управляет пользователь, изменяя скорость  движения  -  по  сути  мы уничтожаем старый таймер и создаем новый с другим временным параметром. Пауза реализуется путем установки флага “pause”, с дальнейшей проверкой его при обработки сообщения WM_TIMER, то есть таймер не убивается при паузе.

Управление осуществляется следующим образом.

Клавиши  "влево/вправо"  -  соответственно  уменьшение/увеличение

скорости движения человечка.

    F1 и правая кнопка мыши - выдача информации об управлении.

    Левая  кнопка  мыши  -  пауза, прерываемая обратным нажатием левой кнопки.

    Выход - стандартно для Windows-приложений: Alt+F4.

    Запуск программы из командной строки: boywin.exe.

    Минимальные   системные  требования:  IBM-совместимый  компьютер,

на котором установлена операционная система Windows 95 и выше.

    5. ФРАГМЕНТЫ ИСХОДНЫХ ТЕКСТОВ ПРОГРАММ

    5.1. Фрагмент программы для MS-DOS

void boy()

  {int stc1=195,stc2=235;

  //Функция, собственно рисующая мальчика

  cleardevice();

  setbkcolor(9); //Установка атрибутов

  setfillstyle(1,13);

  fillellipse(100,70,30,15);

  circle(110,65,4);

  line(120,75,125,80);

  line(120,75,130,77);

  fillellipse(80,68,5,6);

  setfillstyle(1,3);

  fillellipse(100,120,40,30);

  bar(90,150,190,170);

  bar(170,150,190,199);

  bar(170,195,200,199);

  setfillstyle(1,4);

  for (int i=1; i<10;i++)

  line(100,90+i,200,120);

  line(195,110,210,140);

  line(235,110,220,140);

  line(195,110,235,110);

  line(120,75,200,107);

  line(200,107,215,140);

  bar(70,170,120,173);

  bar(90,173,95,197);

  bar(75,197,115,199);

  bar(200,140,290,143);

  bar(243,143,247,197);

  bar(210,197,280,199);

  outtextxy(20,20,"Для выхода нажмите любую клавишу");

}

 int main(void) //Основная часть программы

{

char *k;

int sp=20;

int i,stc1=195, stc2=235;

  

  int gdriver = 3, gmode=0, errorcode;

   //EGA, 640x200

  do

{

 printf("\nвведите скорость (10-100) > ");

 gets(k);  //Ввод с клавиатуры

 sp=atoi(k); //Преобразует строку в десятичное целое число

 if ((sp>100)|(sp<10)) sp=0;printf("Ошибка ввода !");

}

 while ((sp>100)|(sp<10));

  initgraph(&gdriver, &gmode, ""); //Инициализация графического режима

  /* read result of initialization */

  errorcode = graphresult();

  if (errorcode != grOk)

  //Проверка успеха инициализации

  {

     printf("Graphics error: %s\n", grapherrormsg(errorcode));

     printf("Press any key to halt:");

     getch();

     exit(1);

  

  }

  //////////////////

  boy();

  do

  {

 setcolor(4);

 for (i=1;i<30;i++)//Наливаем сок

  {

  if (i%2==1)

  {stc1= 210-(i%2*(i/2));

  stc2= 220+(i%2*(i/2));}

  delay(1);

  line(stc1,140-i,stc2,140-i);

  }

  //Заполняем трубочку

  setcolor(4);

  for  (i=107;i>75;i=i-2)

  {delay(40);

  setcolor(4);

  line(2.5*i-67.5,i,200,107);

  setcolor(9);

  line(195,111,235,111);

  }

  //¦Пьем сок

  for (i=1;i<30;i++)

  {

  if (i%2==1)

  {stc1= 195+(i%2*(i/2));

  stc2= 235-(i%2*(i/2));}

  delay(2*(110-sp));

  setcolor(4);

  line(200,107,215,140);

  setcolor(15);

  line(195,110,stc1,110+i);

  line(235,110,stc2,110+i);

  setcolor(9);

  line(stc1,110+i,stc2,110+i);

  }

  setcolor(15);

  line(120,75,200,107);

  line(200,107,214,138);

 }

  while(!kbhit());//Делать пока не нажата любая клавиша

  //////////////////

  //printf("Press any key to halt:");

  closegraph();

  return 0;

}

    5.2. Фрагмент программы для Windows

case WM_LBUTTONDOWN:

 pause=!pause ; // Установка паузы

 break;

 case WM_PAINT:

 hdc=BeginPaint(hwnd,&paintstruct);

 BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY); //Прорисовка изображения

 EndPaint(hwnd,&paintstruct);

 return 0;

 case WM_KEYDOWN:

     {

        int OEMcode = (int)(((unsigned long)lParam) >> 16) & 0x7F;

        switch (OEMcode)

        {

           case 0x4D:    // '->'

           {

             if(SpD<=1000)

             {SpD+=5; /

             KillTimer(hwnd,1);//Убиваем таймер

         SetTimer(hwnd,1,SpD,NULL);}//Устанавливаем новый таймер

             break;

           }

           case 0x4B:    // '<-'

           {

              if(SpD>=5)

               {SpD-=5;

                KillTimer(hwnd,1);//Убиваем таймер

            SetTimer(hwnd,1,SpD,NULL);}//Устанавливаем новый таймер

              break;

           }

           // F1 - HELP

           case 0x3B:

           {

              MessageBox(hwnd,

              "<--/-->: уменьшение/увеличение скорости\n"

       "F1 - Помощь \n"

      "Левая кнопка мыши - пауза, \n",

              "Помощь", MB_OK | MB_ICONINFORMATION);

              break;

           }

         }

      return 0;

    }

 case WM_TIMER: //Обработка сообщения от таймера

    if (!pause)//Проверка паузы

   {

     if(k==30)k=0;

     boy1(k) ;

     k++;

     hdc=GetDC(hwnd);//Получить контекст устройства

     BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);

     ReleaseDC(hwnd,hdc);//Освободить контекст устройства

     SendMessage(hwnd,WM_PAINT,0,0);

   }

 return 0;

    

6. ЛИТЕРАТУРА

1. Подбельский В.В. Язык С++. - СПб.: Питер, 1999.

2.  Фролов А.В., Фролов Г.В. Операционная система MS Windows 3.1.

- М.: Диалог-МИФИ, 1994.

3. Фролов А.В.,  Фролов Г.В.  Графический интерфейс GDI в MS Win-

dows. - М.: Диалог-МИФИ, 1994.


 

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

22517. Расчет толстостенных цилиндров 176.5 KB
  В цилиндрах у которых толщина стенок не мала по сравнению с радиусом подобное предположение повело бы к большим погрешностям.1 изображено поперечное сечение толстостенного цилиндра с наружным радиусом внутренним ; цилиндр подвергнут наружному и внутреннему давлению . Расчетная схема толстостенного цилиндра. Рассмотрим очень узкое кольцо материала радиусом внутри стенки цилиндра.
22518. Расчет тонкостенных сосудов и резервуаров 81 KB
  Выделим Рис. Рис. Усилия Рис.2 дадут в нормальном к поверхности элемента направлении равнодействующую ab равную Рис.
22519. Расчет быстровращающегося диска 100.5 KB
  Расчет быстровращающегося диска Значительный интерес представляет задача о напряжениях и деформациях в быстро вращающихся валах и дисках. Высокие скорости вращения валов паровых турбин обусловливают появление в валах и дисках значительных центробежных усилий. Вызванные ими напряжения распределяются симметрично относительно оси вращения диска. Рассмотрим наиболее простую задачу о расчете диска постоянной толщины.
22520. Устойчивость сжатых стержней. Формула Эйлера 89.5 KB
  Однако разрушение стержня может произойти не только потому что будет нарушена прочность но и оттого что стержень не сохранит той формы которая ему придана конструктором; при этом изменится и характер напряженного состояния в стержне. Наиболее типичным примером является работа стержня сжатого силами Р. Разрушение линейки произойдет потому что она не сможет сохранить приданную ей форму прямолинейного сжатого стержня а искривится что вызовет появление изгибающих моментов от сжимающих сил Р и стало быть добавочные напряжения от...
22521. Анализ формулы Эйлера 80 KB
  1: 1 Таким образом чем больше точек перегиба будет иметь синусоидальноискривленная ось стержня тем большей должна быть критическая сила.1 Таким образом поставленная задача решена; для нашего стержня наименьшая критическая сила определяется формулой а изогнутая ось представляет синусоиду Величина постоянной интегрирования а осталась неопределенной; физическое значение ее выяснится если в уравнении синусоиды положить ; тогда т. посредине длины стержня получит значение: Значит а это прогиб стержня в сечении посредине его...
22522. Пределы применимости формулы Эйлера 141 KB
  Для стали 3 предел пропорциональности может быть принят равным поэтому для стержней из этого материала можно пользоваться формулой Эйлера лишь при гибкости т. Теоретическое решение полученное Эйлером оказалось применимым на практике лишь для очень ограниченной категории стержней а именно тонких и длинных с большой гибкостью. Попытки использовать формулу Эйлера для вычисления критических напряжений и проверки устойчивости при малых гибкостях вели иногда к весьма серьезным катастрофам да и опыты над сжатием стержней показывают что...
22523. Прочность при циклически изменяющихся напряжениях 149.5 KB
  Так например ось вагона вращающаяся вместе с колесами рис. Рис. Для оси вагона на рис. В точке А поперечного сечения рис.
22524. Диаграмма усталостной прочности 60.5 KB
  Диаграмма усталостной прочности. Эта кривая носит название диаграммы усталостной прочности рис. Точки А к С диаграммы соответствуют пределам прочности. Полученная диаграмма дает возможность судить о прочности конструкции работающей при циклически изменяющихся напряжениях.
22525. Расчет коэффициентов запаса усталостной прочности 147.5 KB
  Одним из основных факторов которые необходимо учитывать при практических расчетах на усталостную прочность является фактор местных напряжений. Очаги концентрации местных напряжений: Многочисленные теоретические и экспериментальные исследования показывают что в области резких изменений в форме упругого тела входящие углы отверстия выточки а также в зоне контакта деталей возникают повышенные напряжения с ограниченной зоной распространения так называемые местные напряжения. 1 а закон равномерного распределения напряжений вблизи...