Разработка программы реализующей эмуляцию упругого столкновения мячей
Мы должны проверить на достижения мячом границ определенной площади экрана, для этого определяем его границу и сравниваем с количеством пикселей по данной оси. Если выполняется одно из условий тогда изменяем вектор скорости на противоположный по данной оси. И после проделываем тоже самое для следующего шарика. Также учитываем, что мяч может перескочить через границу из-за большого значения… Читать ещё >
Разработка программы реализующей эмуляцию упругого столкновения мячей (реферат, курсовая, диплом, контрольная)
Постановка задачи
В прямоугольной рамке, равной поверхности экрана, движутся N мячей, радиусами r1,…, rn. Они соударяются между собой, ударяются о края рамки. Начальное положение и вектор скорости для каждого шара случайные. Написать программу, моделирующую и отображающую на экране их движение. Удары считать абсолютно упругими, силу трения не учитывать.
Спецификация
Входные данные:
Информация, вводимая в специальном окне: для каждого графического объекта задается радиус, составляющие.
Выходные данные:
Графический интерфейс в виде диалогового окна позволяющий добавлять мячи, под средством вызова специального диалогового окна, изменять данные прямо в процессе работы программы без ее остановки, прерывать программу.
Программа должна:
Реализовать перемещение n-ого количества мячей которые отталкиваются от границ заданной области и друг от друга согласно правилам упругого удара.
Методика решения Написание программы производилось в три основных этапа: разработка иерархии классов, описание собственно алгоритма программы, разработка графического интерфейса и объединение двух первых пунктов в единое целое.
Задачу можно разбить на 3 блока:
Задание начальных параметров (который происходит в режиме диалога).
Непосредственно работы программы, т. е. реализация упругого столкновения мячей.
Возможность добавления объектов и изменения данных во время работы программы.
Задание начальных параметров предполагает, прежде всего, инициализацию массива объектов класса, определение некоторых характеристик каждого объекта в соответствии с полями которые приписаны ему в описании класса.
Непосредственно работа программы подразумевает графическое отображение на экране монитора столкновение мячей с границей определенной области и друг с другом. Алгоритм реализации данной части программы будет описан ниже.
Также в программе реализована возможность добавлять, изменять и удалять мячи прямо в процессе исполнения программы. Создание и удаление объектов происходит под средством вызова определенных методов, а изменение свойств каждого объекта с помощью визуальных компонентов.
Организация данных
В программе описано два класса TBall и TBalls.
Класс TBall содержит поля, методы и свойства.
Поля:
_x,_y:integer; - координаты центра мяча по x и y.
_rad:integer; - радиус мяча.
_color:integer;- цвет мяча.
_dx:integer; - вектор скорости по x.
_dy:integer;- вектор скорости по y.
Методы:
constructor Create (rad, color, dx, dy, x, y:integer); - создание объекта.
destructor Destroy; override; -уничтожение объекта.
Свойства, позволяющие считывать и устанавливать значения соответствующих полей:
property x: integer read _x write _x;
property y: integer read _y write _y;
property rad: integer read _rad write _rad;
property color: integer read _color write _color;
property dx: integer read _dx write _dx;
property dy: integer read _dy write _dy;
Класс TBalls содержит массив мячей, каждый из которых это объект класса TBall.
Поля:
Balls :array[0.100] of TBall; - массив мячей.
num: integer;- количество элементов в массиве.
Методы присущие данному классу:
function Add (x, y, dx, dy, col, rad: integer):boolean;- добавить мяч.
function del (n:integer):boolean;- удалить мяч.
function GetData (i:integer):TBall;- метод чтения.
procedure SetData (i:integer; Value: TBall);- метод записи.
Свойство позволяет получить информацию об объекте:
property Items[i:integer]: Tball read GetData write SetData;
Описание алгоритма
Алгоритм определения расчета движения мячей после соударения друг с другом:
Во вложенном цикле сравниваем каждый мячик по отдельности со всеми последующими. Для этого определяем расстояние между координатами центров и сравниваем с суммой радиусов. Если расстояние между центрами становится меньше суммы радиусов тогда по правилу упругого удара, меняем вектор скорости одного с другим. И после этого они продолжают перемещаться уже с другими скоростями. При этом для того, что бы не возникало никаких ошибок при столкновении их друг с другом, к координатам по x и по y прибавляем значение вектора скорости на данную ось и перерисовываем. Это позволяет избежать залипания мячей друг в друге, из-за различных значений векторов скорости одного и другого.
Алгоритм проверки на соударение каждого мяча с границами экрана:
Мы должны проверить на достижения мячом границ определенной площади экрана, для этого определяем его границу и сравниваем с количеством пикселей по данной оси. Если выполняется одно из условий тогда изменяем вектор скорости на противоположный по данной оси. И после проделываем тоже самое для следующего шарика. Также учитываем, что мяч может перескочить через границу из-за большого значения вектора скорости, во избежание данного события сделаем также как и при столкновении мячей, друг с другом, т. е. откинем мяч назначение вектора скорости от границы по каждой оси при их столкновении.
Текст программы
Приведем описание классов:
unit Unit2;
interface
uses Windows, SysUtils, Classes, Graphics, Math;
type
TBall=class
private
_x,_y: integer;
_rad: integer;
_color: integer;
_dx: integer;
_dy: integer;
public
constructor Create (rad, color, dx, dy, x, y:integer);
destructor Destroy; override;
property x: integer read _x write _x;
property y: integer read _y write _y;
property rad: integer read _rad write _rad;
property color: integer read _color write _color;
property dx: integer read _dx write _dx;
property dy: integer read _dy write _dy;
end;
TBalls=class
private
function GetData (i:integer):TBall;
procedure SetData (i:integer; Value: TBall);
public
Balls :array[0.100] of TBall;
num: integer;
constructor Create;
destructor Destroy; override;
function Add (x, y, dx, dy, col, rad: integer):boolean;
function del (n:integer):boolean;
property Items[i:integer]: Tball read GetData write SetData;
end;
implementation
constructor TBall. Create (rad, color, dx, dy, x, y:integer);
begin
_x:=x;
_y:=y;
_rad :=rad;
_color:= color;
_dx := dx;
_dy := dy;
end;
destructor TBall. Destroy;
begin
inherited;
end;
constructor TBalls. Create;
begin
num:=0;
end;
destructor TBalls. Destroy;
var i: integer;
begin
for i:=0 to num-1 do
Balls[i]. Destroy;
inherited;
end;
function TBalls. GetData (i:integer):TBall;
begin
GetData:=Balls[i];
end;
procedure TBalls. SetData (i:integer; Value: TBall);
begin
Balls[i]: =Value;
end;
function Tballs. Add (x, y, dx, dy, col, rad: integer):boolean;
begin
if (num<101)and (num>=0) then begin
Balls[num]: =TBall.Create (rad, col, dx, dy, x, y);
num:=num+1;
Add:=true;
end
else
Add:=false;
end;
function Tballs. del (n:integer):boolean;
var i: integer;
begin
if (n=0) then begin
Balls[n]. Destroy;
for i:=n to num-2 do
Balls[i]: =Balls[i+1];
num:=num-1;
del:=true;
end
else
del:=false;
end;
end.
Методика тестирования
При проведении тестирования необходимо проверить:
Правильно ли обрабатываются щелчки мыши.
Корректно ли происходит соударение мячей в заданной области экрана.
Корректность работы графического интерфейса.
Прочие различные ситуации, при которых корректность работы программы трудно предсказать.
данная программа алгоритм
Результаты тестирования
Ситуация во время работы программы | Ожидаемый результат | Результат работы программы | |
Обычная работа программы с вводом всех данных. | Корректная работа. | Корректная работа. | |
При создании достаточно большого количества объектов (>30). | Корректная работа. | Возможно залипание мячей друг на друге или на границах (бывает очень редко) | |
При изменении радиуса мяча, на такое значение при котором он перекрывает границе. | Корректная работа. | Залипание мяча на границе. | |
На маломощных машинах при создании достаточно большого количества объектов. | Корректная работа. | Возможно медленная работа программы и частое мерцание мячей из-за перерисовки. | |
1. Задорина Н. А., Сухарева И. В. Объектно-ориентированное программирование: Практикум. — Рыбинск: РГАТА, 2006. — 52 с.
2. Рапаков Г. Г., Ржэуцкая С. Ю. Turbo Pascal для студентов и школьников. — СПб.: БХВ-Петербург, 2002. — 352 с.
3. Архангельский А. Я. Приёмы программирования в DELPHI. — М.: Изд-во Бином, 2004. — 828 с.