данные программа алгоритм




Постановка задачи

 

В прямоугольной рамке, равной поверхности экрана, движутся N мячей, радиусами r1,…,rn. Они соударяются между собой, ударяются о края рамки. Начальное положение и вектор скорости для каждого шара случайные. Написать программу, моделирующую и отображающую на экране их движение. Удары считать абсолютно упругими, силу трения не учитывать.

 

Спецификация

 

Входные данные:

Информация, вводимая в специальном окне: для каждого графического объекта задается радиус, составляющие.

Выходные данные:

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

Программа должна:

Реализовать перемещение n-ого количества мячей которые отталкиваются от границ заданной области и друг от друга согласно правилам упругого удара.

Методика решения

Написание программы производилось в три основных этапа: разработка иерархии классов, описание собственно алгоритма программы, разработка графического интерфейса и объединение двух первых пунктов в единое целое.


Задачу можно разбить на 3 блока:

Задание начальных параметров (который происходит в режиме диалога).

Непосредственно работы программы, т.е. реализация упругого столкновения мячей.

Возможность добавления объектов и изменения данных во время работы программы.

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

Непосредственно работа программы подразумевает графическое отображение на экране монитора столкновение мячей с границей определенной области и друг с другом. Алгоритм реализации данной части программы будет описан ниже.

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

 

Организация данных

 

В программе описано два класса TBall и TBalls.

Класс TBall содержит поля, методы и свойства.

Поля:

_x,_y:integer; - координаты центра мяча по x и y.

_rad:integer; - радиус мяча.

_color:integer;- цвет мяча.

_dx:integer; - вектор скорости по x.

_dy:integer;- вектор скорости по y.


Методы:Create(rad,color,dx,dy,x,y:integer); - создание объекта.Destroy; override; -уничтожение объекта.

Свойства, позволяющие считывать и устанавливать значения соответствующих полей:

property x:integer read _x write _x;y:integer read _y write _y;rad:integer read _rad write _rad;color:integer read _color write _color;dx:integer read _dx write _dx;dy:integer read _dy write _dy;

Класс TBalls содержит массив мячей, каждый из которых это объект класса TBall.

Поля::array[0..100] of TBall; - массив мячей.

num: integer;- количество элементов в массиве.

Методы присущие данному классу:

function Add(x,y,dx,dy,col,rad:integer):boolean;- добавить мяч.

function del(n:integer):boolean;- удалить мяч.GetData(i:integer):TBall;- метод чтения.SetData(i:integer; Value:TBall);- метод записи.

Свойство позволяет получить информацию об объекте:

property Items[i:integer]:Tball read GetData write SetData;

 

Описание алгоритма

 

Алгоритм определения расчета движения мячей после соударения друг с другом:

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

Алгоритм проверки на соударение каждого мяча с границами экрана:

Мы должны проверить на достижения мячом границ определенной площади экрана, для этого определяем его границу и сравниваем с количеством пикселей по данной оси. Если выполняется одно из условий тогда изменяем вектор скорости на противоположный по данной оси. И после проделываем тоже самое для следующего шарика. Также учитываем, что мяч может перескочить через границу из за большого значения вектора скорости, во избежание данного события сделаем также как и при столкновении мячей, друг с другом, т.е. откинем мяч назначение вектора скорости от границы по каждой оси при их столкновении.

Текст программы

 

Приведем описание классов:

unit Unit2;Windows, SysUtils, Classes, Graphics, Math;=class

_x,_y: integer;

_rad: integer;

_color: integer;

_dx: integer;

_dy: integer;Create(rad,color,dx,dy,x,y:integer);Destroy; override;x:integer read _x write _x;y:integer read _y write _y;rad:integer read _rad write _rad;color:integer read _color write _color;dx:integer read _dx write _dx;dy:integer read _dy write _dy;;=classGetData(i:integer):TBall;SetData(i:integer; Value:TBall);:array[0..100] of TBall;: integer;Create;Destroy; override;Add(x,y,dx,dy,col,rad:integer):boolean;del(n:integer):boolean;Items[i:integer]:Tball read GetData write SetData;;TBall.Create(rad,color,dx,dy,x,y:integer);

_x:=x;

_y:=y;

_rad:=rad;

_color:= color;

_dx:= dx;

_dy:= dy;;TBall.Destroy;;;TBalls.Create;:=0;;TBalls.Destroy;i:integer;i:=0 to num-1 do[i].Destroy;;;TBalls.GetData(i:integer):TBall;:=Balls[i];;TBalls.SetData(i:integer; Value:TBall);[i]:=Value;;Tballs.Add(x,y,dx,dy,col,rad:integer):boolean;(num<101)and(num>=0) then begin[num]:=TBall.Create(rad,col,dx,dy,x,y);:=num+1;:=true;:=false;;Tballs.del(n:integer):boolean;i:integer;(n<num)and(n>=0) then begin[n].Destroy;i:=n to num-2 do[i]:=Balls[i+1];:=num-1;:=true;:=false;

end;.

 

Методика тестирования

 

При проведении тестирования необходимо проверить:

Правильно ли обрабатываются щелчки мыши.

Корректно ли происходит соударение мячей в заданной области экрана.

Корректность работы графического интерфейса.

Прочие различные ситуации, при которых корректность работы программы трудно предсказать.

данные программа алгоритм

Результаты тестирования

Ситуация во время работы программы Ожидаемый результат Результат работы программы
Обычная работа программы с вводом всех данных. Корректная работа. Корректная работа.
При создании достаточно большого количества объектов (>30). Корректная работа. Возможно залипание мячей друг на друге или на границах (бывает очень редко)
При изменении радиуса мяча, на такое значение при котором он перекрывает границе. Корректная работа. Залипание мяча на границе.
На маломощных машинах при создании достаточно большого количества объектов. Корректная работа. Возможно медленная работа программы и частое мерцание мячей из за перерисовки.

Список литературы

 

1. Задорина Н.А., Сухарева И.В. Объектно-ориентированное программирование: Практикум. - Рыбинск: РГАТА, 2006. - 52 с.

2. Рапаков Г.Г., Ржэуцкая С.Ю. Turbo Pascal для студентов и школьников. - СПб.: БХВ-Петербург, 2002. - 352 с.

. Архангельский А.Я. Приёмы программирования в DELPHI. - М.: Изд-во Бином, 2004. - 828 с.



Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-04-01 Нарушение авторских прав и Нарушение персональных данных


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