Перемещение графических элементов по экрану

Автор работы: Пользователь скрыл имя, 03 Марта 2014 в 20:02, курсовая работа

Краткое описание

Для программной обработки с помощью компьютера данные представляются в виде величин и их совокупностей. Величина — это элемент данных с точки зрения их семантического (смыслового) содержания или обработки. Смысловое (семантическое) разбиение данных производится во время постановки задачи и разработки алгоритма ее решения (входные, выходные и промежуточные). Исходные (входные, аргументы) — это данные, известные перед выполнением задачи, из ее условия. Выходные данные (результаты) — результат решения задачи. Переменные, которые не являются ни аргументом, ни результатом алгоритма, а используются только для обозначения вычисляемого промежуточного значения, называются промежуточными. Необходимо указывать имена и типы данных — целый, вещественный, логический и символьный.

Вложенные файлы: 1 файл

Перемещение графических элементов по экрану.doc

— 189.50 Кб (Скачать файл)

{Функция возведения  вещественного числа X в натуральную степень N}

Function Stepen(X : Real; N : Integer) : Real;

Var I : Integer; St : Real;

Begin

St := 1;

For I := 1 To N Do St := St * X;

Stepen := St;

End;

Другой способ получить натуральное значение z=xy, где x, y — натуральные, это сделать так: Z := Round(Exp(Y * Ln(X))).

Примечание. Интересной является задача получения степени любого целого числа (за исключением нуля), если основание степени — неотрицательное целое, без использования развилки. Одно из возможных решений : (–1)*Ord(Odd(Y)) * Exp(Y * Ln(X)) + Ord(Odd(Y+1)) * Exp(Y * Ln(X)). Здесь Ord(K) — функция, возвращающая порядковый номер величины K в том или ином порядковом типе (в примере использовано свойство, что порядковый номер False равен 0, а порядковый номер True — 1).

Примеры записи математических выражений:

Математическая запись

Запись на Pascal

1. x2 — 7x + 6

Sqr(x) — 7 * x + 6

2.

(Abs(x) — Abs(y)) / (1 + Abs(x * y))

3.

Ln(Abs((y — Sqrt(Abs(x))) * (x — y / (z + Sqr(x) / 4))))


Логический операнд — это конструкция соответствующего языка программирования, которая задает правило для вычисления одного из двух возможных значений: True или False.

Чаще всего логические выражения используют в операторах присваивания или для записи того или иного условия. Составными частями логических выражений могут быть: логические значения (True, False); логические переменные; отношения.

Например, 1) Y:=True; 2) Z:=False; 3) LogPer:=A > B; 4) Log1:=(A = B) And (C <= D).

Как видно из примеров, отношение — это два выражения, разделенных между собой знаком операции отношения (>, <, =, <>, <=, >=). Отношение является простейшей конструкцией логического выражения. Оно вычисляет результат True, если выполняется заданное соотношение, и False — в противном случае.

Примечание. Несмотря на то, что операции отношения =, <>, >=, <= определены для вещественных типов, реально они в большинстве случаев корректно не работают в силу того, что множество вещественных величин, представимых в памяти ЭВМ, дискретно. Поэтому их следует, если это возможно, избегать. В том случае, когда всё-таки для вещественных возникает необходимость вычисления указанных отношений, разумно проверять вещественные величины не на равенство, а на близость расположения друг к другу, т.е. заменять отношения вида A=B отношениями вида |A-B|<E, где E — достаточно малое по абсолютной величине число (в общем случае — так называемое машинное епсилон).

В языке Pascal операции отношения определены для величин любого порядкового типа (целые, символьный, логический, перечислимый, диапазон). Операции отношения могут быть выполнены также над строковыми выражениями. Сравнение двух строк выполняется посимвольно слева направо в соответствии с их лексикографической упорядоченностью в таблице кодов ASCII. Эта упорядоченность предполагает, что «1»<«2», «a»<«b», «B»<«C» и т.д. Как только в процессе попарных сравнений символов с одинаковой порядковой позицией обнаруживается больший по коду ASCII символ, данный процесс прекращается, и считается, что строка с этим символом соответственно больше другой строки. Если строки имеют разную длину и их символы совпадают до последнего знака, то считается, что более короткая строка меньше.

Логическое выражение — это логический операнд или последовательность логических операндов, разделенных между собой знаками логических операций (NOT, AND, OR, XOR).

Порядок действий при вычислении значения логического выражения:

  1. вычисляются значения в скобках;
  2. вычисляются значения функций;
  3. выполняется унарные операции (операция NOT);
  4. выполняется операция AND;
  5. выполняются операции OR, XOR;
  6. выполняются операции отношения.

Действия выполняются слева направо с учетом их приоритета. Желаемая последовательность операций обеспечивается путем расстановки скобок в соответствующих местах выражения.

При реализации некоторых программ удобно использовать функции, которые имеют логическое значение. Обычно они используются для того, чтобы на некоторый вопрос получить ответ “ДА” или “НЕТ”.

Например, следующая функция возвращает True, если её аргумент — простое число, и False — в противном случае:

Function Simple (Pr : Integer) : Boolean;

Var I : Integer; LogPer : Boolean;

Begin I := 2; {счетчик}

Repeat

LogPer := (Pr Mod I = 0); {логическая переменная, принимающая

 значение TRUE,если число Pr составное}

I := I + 1

Until (I > Pr Div 2 + 1) Or (LogPer);

{цикл завершаем в том случае, когда счетчик становится больше половины

данного числа или обнаруживаем, что число составное}

Simple := Not LogPer

{значение функции  равно TRUE, если число простое, и FALSE — в противном случае}

End;

Рассмотрим примеры задач, где алгоритм решения является линейным.

Задача 1. Скорость первого автомобиля v1 км/ч, второго — v2 км/ч, расстояние между ними s км. Какое расстояние будет между ними через t ч, если автомобили движутся в разные стороны?

Согласно условию задачи искомое расстояние s1=s+(v1+v2)t (если автомобили изначально двигались в противоположные стороны) или s2=|(v1+v2)t-s| (если автомобили первоначально двигались навстречу друг другу).

Чтобы получить это решение, необходимо ввести исходные данные, присвоить переменным искомое значение и вывести его на печать.

Program Car;

Var V1, V2, T, S, S1, S2 : Real;

Begin

Write('Введите скорости  автомобилей, расстояние между ними и время движения:');

ReadLn(V1, V2, S, T);

S1 := S + (V1 + V2) * T;

S2 := Abs((V1 + V2) * T — S);

WriteLn('Расстояние  будет равно ', S1:7:4, ' км или ', S2:7:4, ' км')

End.

Заметим, что идентификатор должен начинаться с латинской буквы, далее, кроме латинских букв, может содержать цифры, знак подчеркивания (_).

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

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

 

 

Глава 2

Программная реализация поставленной задачи

Uses Graph,Crt;

 

const MaxShar=10;

type shar = object

 { переменные }

 x,y:integer; { текущие координаты шара }

 r:word; { радиус }

 color:byte; { цвет шара }

 dx,dy:shortint; { скорость. задается значениями

 перемещения на каждом шаге (в точках) }

 hits:set of byte; { множество шаров с которыми данный шар уже

 столкнулся и с которыми не надо обсчитывать столкновение еще раз }

 { методы }

 constructor initShar(x0,y0:integer; r0:word; color0:byte;

 

dx0,dy0:shortint);

 procedure Move; { двигаем }

 procedure Show; { показываем }

 procedure Hide; { прячем }

 procedure CheckBorder; { проверяем на выход за границы экрана }

 procedure CheckHit(k:byte); { проверяем на столкновение с другим

 

шаром }

 procedure revertXDirection; { поменять Х/Y-составляющую скорости }

 procedure revertYDirection; { на противоположную }

 procedure TurnAfterHit(k:byte); { вычислить новые значения

 скорости двух шаров после удара. Первый шар — шар

 данного объекта, второй — с индексом k в массиве }

 function Value:real; { вычислить объем шара. Нужно для вычисления

 скорости. Вообще-то там масса нужна, но учитывая, что

 

плотность

 все-равно сократиться при делении, используем объем }

 {procedure PrintState;} { отладочные печати }

 end;

var bgColor,i:byte;

 x,y,dx,dy,ErrCode:integer;

 r:word;

 shars: array[1..MaxShar] of shar; { массив шаров }

 sh:shar;

 f:text; { файл для отладочных печатей }

Procedure shar.Move;

 begin

 x:=x+dx;

 y:=y+dy;

 end;

Procedure shar.Show;

 begin

 setColor(color);

 circle(x, y, r);

 {PutPixel(x,y,color);} { уберите комментарий чтобы увидеть

 

траекторию }

 end;

Procedure shar.Hide;

 begin

 setColor(bgColor);

 circle(x, y, r);

 end;

procedure shar.revertXDirection;

 begin

 dx:=-dx;

 x:=x+dx;

 end;

procedure shar.revertYDirection;

 begin

 dy:=-dy;

 y:=y+dy;

 end;

Constructor shar.initShar(x0, y0 :integer; r0 :word; color0 :byte;

 

dx0, dy0 :shortint);

 begin

 x:=x0;

 y:=y0;

 r:=r0;

 color:=color0;

 dx:=dx0;

 dy:=dy0;

 hits:=[];

 end;

procedure shar.CheckBorder;

 begin

 if (r+x>=GetMaxX-1) or (x-r<=1) then revertXDirection;

 if (y+r>=GetMaxY-1) or (y-r<=1) then revertYDirection

 end;

{procedure shar.PrintState;

 begin

 writeln(f,'x=',x:3,' y=',y:3,' r=',r:3,' dx=',dx:3,' dy=',dy:3);

 end;}

procedure shar.TurnAfterHit(k:byte);

{ формулы для движения  шаров взяты здесь:

 http://ferro.phys.msu.ru/prak/PDF/01-mechanics/07.pdf }

var m1, m2 :real;

 vx10,vy10,vx20,vy20:integer;

 begin

 m1 := Value; { массы }

 m2 := shars[k].Value;

 vx10 := dx; { начальные значения скоростей }

 vy10 := dy;

 vx20 := shars[k].dx;

 vy20 := shars[k].dy;

 { скорость первого шара после удара }

 dx := round((2*m2*vx20 + (m1-m2)*vx10)/(m1+m2));

 dy := round((2*m2*vy20 + (m1-m2)*vy10)/(m1+m2));

 { скорость второго шара после удара }

 shars[k].dx := round((2*m1*vx10 + (m2-m1)*vx20)/(m1+m2));

 shars[k].dy := round((2*m1*vy10 + (m2-m1)*vy20)/(m1+m2));

 end;

function shar.Value:real;

 begin { возвращает объем шара }

 Value:=4*Pi*r*r*r/3;

 end;

procedure shar.CheckHit(k:byte);

var i1:byte;

 dist:longint;

 begin

 for i1:=1 to MaxShar do if ((i1<>k) and not(k in hits)) then

 begin

 shars[i1].hits:=shars[i1].hits+[k];

 dist:=round(sqrt(sqr(1.0*x-shars[i1].x)+sqr(1.0*y-shars[i1].y)));

 if (dist<r+shars[i1].r) then

 begin

 TurnAfterHit(i1);

 

 CheckBorder;

 Move;

 shars[i1].CheckBorder;

 shars[i1].Move;

 

 { скорость задается значениеми dx и dy — шагами движения. Таким

 образом она дискретна. Момент столкновения определяется по

 расстоянию между шарами. Но запросто может случиться, что шары

 на каком-то шаге пересекутся и в этом случае необходимо их

 развести в разные стороны перед тем как высчитывать расстояние

 

на

 следуещем шаге, иначе они могут пребывать в состоянии

 

постоянного

 столкновения }

 

 

dist:=round(sqrt(sqr(1.0*x-shars[i1].x)+sqr(1.0*y-shars[i1].y)));

 while (dist<r+shars[i1].r) do

 begin

 CheckBorder;

 Move;

 shars[i1].CheckBorder;

 shars[i1].Move;

 

 

dist:=round(sqrt(sqr(1.0*x-shars[i1].x)+sqr(1.0*y-shars[i1].y)));

 end;

 end;

 end;

 end;

 

function initializeGraph:integer;

var grDriver : Integer;

 grMode : Integer;

 begin

 grDriver:=Detect;

 InitGraph(grDriver, grMode, '');

 initializeGraph:=GraphResult;

 end;

 

begin

ErrCode:=initializeGraph;

if ErrCode <> grOk then

 WriteLn('Ошибка инициализации графики:', GraphErrorMsg(ErrCode))

else

 begin

 assign(f,'log.txt');

 rewrite(f);

 bgColor:=0;

 rectangle(1,1,GetMaxX-1,GetMaxY-1);

 

 {shars[1].initShar(100,100,50,3,6,-3);

 shars[2].initShar(100,200,40,4,5,3);

 shars[3].initShar(200,200,20,5,-7,-4);

 shars[4].initShar(400,300,25,2,-9,-1);

 shars[5].initShar(500,200,35,14,-5,-8);

 if (MaxShar>5) then}

 

 { инициализация шаров случайным образом }

 for i:=1 to MaxShar do

 begin

 r:=20+random(10);

 shars[i].initShar(1+r+random(GetMaxX-2*r),

 1+r+random(GetMaxY-2*r),r,1+random(GetMaxColor-1),

 random(15)-7,random(12)-6);

 end;

 { обсчитываем движение пока не нажата какая-либо клавиша }

 repeat

 { показываем все шары }

 for i:=1 to MaxShar do

 shars[i].Show;

 { временная задержка — установите свое значение для вашего

 

компьютера }

 Delay(580);

 { убираем с экрана все шары }

 for i:=1 to MaxShar do

 shars[i].Hide;

 { просчитываем следующий шаг }

 for i:=1 to MaxShar do

 begin

 shars[i].Move;

 shars[i].CheckBorder;

 shars[i].CheckHit(i);

 end;

 for i:=1 to MaxShar do

 shars[i].hits:=[];

 until keyPressed;

 CloseGraph;

 close(f);

 end

end.

 

Заключение

Компью́терная анима́ция — вид анимации, создаваемый при помощи компьютера. На сегодня получила широкое применение как в области развлечений, так и в производственной, научной и деловой сферах. Являясь производной от компьютерной графики, анимация наследует те же способы создания изображений:

Векторная графика

Растровая графика

Фрактальная графика

Трёхмерная графика (3D)

По принципу анимирования можно выделить несколько видов компьютерной анимации.

Анимация по ключевым кадрам

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

Запись движения

Данные анимации записываются специальным оборудованием с реально двигающихся объектов и переносятся на их имитацию в компьютере. Распространённый пример такой техники — Motion capture (захват движений). Актеры в специальных костюмах с датчиками совершают движения, которые записываются камерами и анализируется специальным программным обеспечением. Итоговые данные о перемещении суставов и конечностей актеров применяют к трёхмерным скелетам виртуальных персонажей, чем добиваются высокого уровня достоверности их движения.

Такой же метод используют для переноса мимики живого актера на его трёхмерный аналог в компьютере.

Процедурная анимация

Процедурная анимация полностью или частично рассчитывается компьютером. Сюда можно включить следующие её виды:

Симуляция физического взаимодействия твёрдых тел.

Имитация движения систем частиц, жидкостей и газов.

Имитация взаимодействия мягких тел (ткани, волос).

Расчёт движения иерархической структуры связей (скелета персонажа) под внешним воздействием (Ragdoll).

Имитация автономного (самостоятельного) движения персонажа. Примером такой системы является программа Euphoria.

Компьютерная анимация (последовательный показ слайд-шоу из заранее подготовленных графических файлов, а также компьютерная имитация движения с помощью изменения и перерисовки формы объектов или показа последовательных изображений с фазами движения, подготовленных заранее или порождаемых во время анимации) может применяться в компьютерных играх, мультимедийных приложениях (например, энциклопедиях), а также для «оживления» отдельных элементов оформления, например, веб-страниц и рекламы (анимированные баннеры). На веб-страницах анимация может формироваться средствами стилей (CSS) и скриптов (JavaScript) или модулями, созданными с помощью технологии Flash или её аналогов (флеш-анимация).

 

 

Список использованной литературы

  1. Голицына О. Л., Попов И. И. Основы алгоритмизации и программирования: Учебное пособие. — М.: Форум: Инфра-М, 2004.
  2. Семакин И. Г., Шестаков А. П. Основы программирования: Учебник. — М.: Мастерство, 2001.
  3. Зак Д. Самоучитель Visual Basic.Net. — Киев: ВНV; СПб.: Питер, 2003.
  4. Пономарев В. Visual Basic.NET: — Экспресс-курс. — СПб.: BHV — Санкт — Петербург, 2003.
  5. Джеймс Фокселл. Освой самостоятельно Visual Basic.NET за 24 часа. — М.: Вильямс, 2002.
  6. Дэн Кларк. Объектно-ориентированное программирование в Visual Basic .NET. — СПб.: Питер, 2003.
  7. Грейди Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на C++ /Пер. с англ. — 2-е изд.– М.: Бином, 2000.
  8. Кетков Ю., Кетков А. Практика программирования: Visual Basic, С++ Builder. — СПб.: BHV, 2002.
  9. Аляев Ю., Козлов О. Алгоритмизация и языки программирования Pascal, C++, Visual Basic. — М.: Финансы и статистика, 2003.
  10. Амелина Н. И., Королева Е. М. Методические указания для студентов механико-математического факультета «Задачи по программированию». Часть 2. — Ростов-на-Дону: УПЛ РГУ, 1993. — 31 с.
  11. Гусева А. И. Учимся программировать: PASCAL 7.0. Задачи и методы их решения. — М.: Диалог–МИФИ, 1997. — 256 с.
  12. Дагене В. А., Григас Г. К., Аугутис К. Ф. 100 задач по программированию. — М.: Просвещение, 1993. — 255 с.
  13. Задачи по программированию / С. А. Абрамов, Г. Г. Гнездилова, Е. Н. Капустина, М. И. Селюн. — М.: Наука, 1988. — 224 с.
  14. Златопольский Д. М. Я иду на урок информатики: Задачи по программированию. 7–11 классы: Книга для учителя. — М.: Изд-во «Первое сентября», 2001. — 208 с.
  15. Касьянов В. Н., Сабельфельд В. К. Сборник заданий по практикуму на ЭВМ. — М.: Наука, 1986. — 272 с.
  16. Пильщиков В. Н. Сборник упражнений по языку Паскаль. — М.: Наука, 1989. — 160 с.
  17. Практикум по Турбо Паскалю / И. А. Бабушкина, Н. А. Бушмелева, С. М. Окулов, С. Ю. Черных. — М.: АБФ, 1998. — 384 с.
  18. Программирование на языке Паскаль: задачник / Под ред. О. Ф. Усковой. — СПб.: Питер, 2002. — 336 с.
  19. Юркин А. Г. Задачник по программированию. — СПб.: Питер, 2002. — 192 с.
  20. Абрамян М. Э., Михалкович С. С. Основы программирования на языке Паскаль: Скалярные типы данных, управляющие операторы, процедуры и функции. — Ростов-на-Дону: Изд-во «ЦВВР», 2004. — 198 с.
  21. Абрамян М. Э. Практикум по программированию на языке Паскаль. 4-е изд. — Ростов-на-Дону: Изд-во «ЦВВР», 2004. — 187 с.

Информация о работе Перемещение графических элементов по экрану