Разработка и проектирование системы моделирования физических процессов

Изучение подходов к объектно-ориентированному конструированию программного обеспечения. Рассмотрение вопросов реализации системы моделирования физических процессов. Определение поля и основных операций классов. Разработка архитектуры библиотеки.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.12.2016
Размер файла 293,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

36

Министерство образования и науки Российской Федерации

ФГБОУ ВО Кубанский государственный технологический университет

(ФГБОУ ВО «КубГТУ»)

Кафедра информационных систем и программирования

Институт компьютерных систем и информационной безопасности

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту

по дисциплине Конструирование программного обеспечения

на тему Разработка и проектирование системы моделирования физических процессов.

Выполнил(а) студент(ка) группы 14-КБ-ПР1

Гриценко Александр Андреевич

Руководитель проекта А.Г. Волик

2016 г.

Реферат

конструирование программный моделирование физический

Пояснительная записка курсового проекта содержит 27 страниц, 2 рисунка, 12 источников.

ООП, КОНСТРУИРОВАНИЕ, СИЛА ТЯЖЕСТИ, СИЛА ТРЕНИЯ, СИЛА УПРУГОСТИ, ЗАКОН СОХРАНЕНИЯ ИМПУЛЬСА, СИЛА, МАССА, СКОРОСТЬ, УСКОРЕНИЕ, КЛАСС, ОБЪЕКТ, МЕТОД, СВОЙСТВО

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

Содержание

Введение

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

2. Анализ требований к системе

2.1 Общие требования

2.2 Требования к библиотеке классов

2.3 Требования к пользовательскому интерфейсу

3. Теоретическое описание решения

4. Архитектура системы

4.1 Object

4.2 Form1

5. Руководство пользователя

5.1 Интерфейс пользователя

Заключение

Список используемых источников

Приложение А код программы

Введение

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

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

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

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

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

2. Анализ требований к системе

2.1 Общие требования

Программа представляет собой библиотеку классов и пользовательский интерфейс. Программа написана средствами Microsoft Visual Studio 2012 на языке c#.

2.2 Требования к библиотеке классов

Библиотека классов реализует весь необходимый функционал для реализации моделирования физических процессов:

1) Класс для работы с векторами

2) Математическая основа

3) Классы для реализации столкновения объектов

4) Классы для реализации столкновения с краями рабочей области

2.3 Требования к пользовательскому интерфейсу

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

3. Теоретическое описание решения

Полный перебор это самый простой и в то же время самый медленный из всех возможных способов. Идет проверка между всеми возможными парами частиц.

void Update()

{

for (int i = 0; i < NUM_P; ++i) {

for (int j = i + 1; j < NUM_P; ++j) {

Collision(&_particles[i], &_particles[j]);

}

}

}

Сложность: O(n ^ 2)

Плюсы:

* Очень прост в понимании и реализации

* Не чувствителен к разным размерам частиц

Минусы:

* Самый медленный из всех

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

Сила тяжести.

На каждое тело, находящееся на планете, действует гравитация Земли. Сила, с которой Земля притягивает каждое тело, определяется по формуле

Точка приложения находится в центре тяжести тела. Сила тяжести всегда направлена вертикально вниз.

Сила трения.

Эта сила возникает при движении тел и соприкосновении двух поверхностей. Определяется сила трения по формуле:

Сила приложена в точке соприкосновения двух поверхностей и направлена в сторону противоположную движению.

Сила упругости.

Это сила возникает в результате деформации (изменения первоначального состояния вещества). Сила, которая препятствует деформации - сила упругости.

Закон Гука:

Сила упругости направлена противоположно деформации.

Жесткость образца, Модуль Юнга:

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

Первый закон Ньютона (или закон инерции) из всего многообразия систем отсчета выделяет класс так называемых инерциальных систем.

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

Свойство тел сохранять свою скорость при отсутствии действия на него других тел называется инерцией. Поэтому первый закон Ньютона называют законом инерции.

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

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

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

Сила - это количественная мера взаимодействия тел. Сила является причиной изменения скорости тела. В механике Ньютона силы могут иметь различную физическую природу: сила трения, сила тяжести, упругая сила и т. д. Сила является векторной величиной. Векторная сумма всех сил, действующих на тело, называется равнодействующей силой.

Второй закон Ньютона - это фундаментальный закон природы. Сила, действующая на тело, равна произведению массы тела на сообщаемое этой силой ускорение.

4. Архитектура системы

Рисунок 1 Архитектура системы

Весь код программы представлен в приложении А.

4.1 Object

Класс реализующий основную логику работы программы. Основные поля класса это xObj, yObj (координаты положения объекта).

Vector[] MassiveVectors запоминает силы, которые воздействуют на объект.

ResultV это вектор получаемый в результате сложения векторов сил.

diametr это размер объекта.

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

Метод NewVector добавляет новую силу в массив векторов.

Метод NewLocation рассчитывает в какую точку переместиться объект в следующий тик таймера. Для этого он складывает x и y комментарии у каждого вектора и складывает результат в resultV. После чего он параллельно перемещает все векторы относительно нового положения объекта.

Методы OtherVec и CollisionObj реализуют логику столкновения объектов. Идея для этого механизма следующая. OtherVec подготавливает результирующий вектор и передает его в Form1 для другого объекта. Другой объект получая donate.x и donate.y заменяет один из своих векторов силы.

В результате объекты как бы обмениваются своими импульсами.

Метод CollisionBar проверяет находится ли объект на границе или за границей рабочей области и если это произошло инвертирует его вектор силы.

4.2 Form1

Класс, реализующий интерфейс пользователя. Также в Form1 помещен массив объектов и проводится перебор и проверка элементов на предмет их столкновения.

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

5. Руководство пользователя

5.1 Интерфейс пользователя

На рисунке 2 показан внешний вид окна программы при запуске.

Рисунок 2 Главное окно приложения

При запуске программы появляется главное окно приложения, с которым пользователю предлагается работать. Главное окно представляет собой рабочую область и меню. С помощью текстовых полей и кнопок пользователь может добавлять объекты на форму.В меню пользователь может указывать координаты вектора скорости добавляемого объекта (Velocity X, Velocity Y), его радиус (Radius).

Заключение

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

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

В ходе этой работы я изучил различные подходы к объектно-ориентированному конструированию программного обеспечения, получил дополнительные практические навыки создания программных продуктов различного назначения.

Список используемых источников

1. Мартин Р. C., Мартин М. Принципы, паттерны и методики гибкой разработки на языке C#.:Пер. с англ. СПб.:Символ-Плюс,2011. 768 с.: ил.

2. Фаулер М.UML.Основы, 3-е изд. М.: Символ-Плюс, 2012. 192 с.

3. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Д. Приемы объектноориентированного проектирования. Паттерны проектирования. СПб.: Питер, 2013. 368 с.: ил.

4. Фримен Эр., Фримен Эл., Бейтс Б., Сьерра К. Паттерны проектирования. СПб.: Питер, 2011. 656 с.

6. Макконнелл С. Совершенный код. Мастер-класс/Пер. с англ. М.: Русская Редакция, 2013. 896 стр.: ил.

7. Википедия - свободная энциклопедия [Электронный ресурс]. URL: https://ru.wikipedia.org/wiki/.

8. Gaul R. How to create a custom 2D physics engine [Электронный ресурс]: 2013. URL: https://gamedevelopment.tutsplus.com/tutorials/how-to-create-a-custom-2d-physics-engine-the-basics-and-impulse-resolution--gamedev-6331.

9. Kanber B. How physics engine works [Электронный ресурс]: 2012. URL: http://buildnewgames.com/gamephysics/.

10. Firth P. Physics engine for dummies [Электронный ресурс]: 2011. URL: http://www.wildbunny.co.uk/blog/2011/04/06/physics-engines-for-dummies/.

11. Anvi. Уроки OpenGl + C# [Электронный ресурс]: 2011. URL: http://esate.ru/uroki/OpenGL/uroki-OpenGL-c-sharp/.

12. Учебник: Открытая физика [Электронный ресурс]: ФИЗИКОН: 1999-2015. URL: http://physics.ru/.

Приложение А код программы

Листинг Form1

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace PhisicModel

{

public partial class Form1: Form

{

Vector vector = new Vector();

public void DrawObject(int x1,int y1, int width, int height)

{

Pen myPen = new Pen(Color.Black, 1);

Graphics g = Graphics.FromHwnd(pictureBox1.Handle);

g.DrawEllipse(myPen, x1, y1, width, height);

}

public void DrawBarier(int x1, int y1, int x2, int y2)

{

Pen myPen = new Pen(Color.Black, 1);

Graphics g = Graphics.FromHwnd(pictureBox1.Handle);

g.DrawLine(myPen,x1,y1,x2,y2);

}

public void WhitePlace(int ten1,int ten2, int chetiresta, int tristo)

{

Pen myPen = new Pen(Color.Black, 1);

Graphics g = Graphics.FromHwnd(pictureBox1.Handle);

SolidBrush MyBrush = new SolidBrush(Color.White);

g.FillRectangle(MyBrush, ten1, ten2, chetiresta, tristo);

g.DrawLine(myPen,0,0,410,0);

g.DrawLine(myPen, 0, 0, 0, 310);

g.DrawLine(myPen, 410, 0, 410, 310);

g.DrawLine(myPen, 0, 310, 410, 310);

}

public Form1()

{

InitializeComponent();

}

private void Start_Button_Click(object sender, EventArgs e)

{

if (timer1.Enabled == false)

timer1.Enabled = true;

else

timer1.Enabled = false;

}

private void timer1_Tick(object sender, EventArgs e)

{

if (timer1.Enabled == true)

{

WhitePlace(0,0,400,300);//стираем все рисуя белый прямоугольник

for (int i1 = 0; i1 < iObj; i1++)//рисование объектов в новом месте

{

vector = MassiveObjects[i1].NewLocation();

DrawObject(vector.x,vector.y,MassiveObjects[i1].diametr,MassiveObjects[i1].diametr);

}

for (int i1 = 0; i1 < iB; i1++)//рисуем заново барьеры

{

DrawBarier(MassiveBariers[i1].xB1, MassiveBariers[i1].yB1, MassiveBariers[i1].xB2, MassiveBariers[i1].yB2);

}

//проверка на то, столкнулись ли объекты(перебором)

for (int i1 = 0; i1 < iObj; i1++)

{

for (int i2 = 0; i2 < iObj; i2++)

if (i1 != i2)

{

double distance;

distance = Math.Sqrt(Math.Pow( Math.Abs(MassiveObjects[i1].xObj)-Math.Abs(MassiveObjects[i2].xObj),2)+ Math.Pow(Math.Abs(MassiveObjects[i1].yObj) - Math.Abs(MassiveObjects[i2].yObj), 2));

if (distance < MassiveObjects[i1].diametr/2 + MassiveObjects[i2].diametr/2)

{

Vector v = new Vector();

v = MassiveObjects[i1].OtherVec(MassiveObjects[i2].xObj, MassiveObjects[i2].yObj);

MassiveObjects[i1].CollisionObj(MassiveObjects[i2].OtherVec(MassiveObjects[i1].xObj, MassiveObjects[i1].yObj));//обработка столкновения

MassiveObjects[i2].CollisionObj(v);

}

}

}

//проверка столкнулся ли объект с барьером

for (int i1 = 0; i1 < iObj; i1++)

{

MassiveObjects[i1].CollisionBar();

}

/*

for (int i2 = 0; i2 < iB; i2++)

//MassiveObjects[i1].CollisionBar(MassiveBariers[i2].xB1, MassiveBariers[i2].yB1, MassiveBariers[i2].xB2, MassiveBariers[i2].yB2);

MassiveObjects[i1].CollisionBar(MassiveBariers[i2]);*/

}

}

int iObj = 0;

int iB = 0;

Object[] MassiveObjects = new Object[100];

Barier[] MassiveBariers = new Barier[100];

private void Add_Object_Click(object sender, EventArgs e)

{

MassiveObjects[iObj] = new Object();

MassiveObjects[iObj].AddObject(Convert.ToInt32( X_TextBox.Text), Convert.ToInt32(Y_TextBox.Text), Convert.ToInt32(TextWeight.Text));

DrawObject(MassiveObjects[iObj].xObj, MassiveObjects[iObj].yObj, MassiveObjects[iObj].diametr, MassiveObjects[iObj].diametr);

iObj++;

}

private void buttonNewVector_Click(object sender, EventArgs e)

{

int iV = Convert.ToInt32(textBoxNumber.Text);

int xvi = Convert.ToInt32(textBoxXvector.Text);

int yvi = Convert.ToInt32(textBoxYvector.Text);

MassiveObjects[iV].NewVector(xvi,yvi);

}

private void AddBarier_Click(object sender, EventArgs e)

{

MassiveBariers[iB] = new Barier();

MassiveBariers[iB].AddBarier(0,0,410,0);

DrawBarier(MassiveBariers[iB].xB1, MassiveBariers[iB].yB1, MassiveBariers[iB].xB2, MassiveBariers[iB].yB2);

iB += 1;

MassiveBariers[iB] = new Barier();

MassiveBariers[iB].AddBarier(0, 0, 0, 310);

DrawBarier(MassiveBariers[iB].xB1, MassiveBariers[iB].yB1, MassiveBariers[iB].xB2, MassiveBariers[iB].yB2);

iB += 1;

MassiveBariers[iB] = new Barier();

MassiveBariers[iB].AddBarier(410, 0, 410, 310);

DrawBarier(MassiveBariers[iB].xB1, MassiveBariers[iB].yB1, MassiveBariers[iB].xB2, MassiveBariers[iB].yB2);

iB += 1;

MassiveBariers[iB] = new Barier();

MassiveBariers[iB].AddBarier(0, 310, 410, 310);

DrawBarier(MassiveBariers[iB].xB1, MassiveBariers[iB].yB1, MassiveBariers[iB].xB2, MassiveBariers[iB].yB2);

iB += 1;

}

private void NewBarierButton_Click(object sender, EventArgs e)

{

MassiveBariers[iB] = new Barier();

MassiveBariers[iB].AddBarier(Convert.ToInt32(Px1Box.Text), Convert.ToInt32(Py1Box.Text),Convert.ToInt32(Px2Box.Text), Convert.ToInt32(Py2Box.Text));

DrawBarier(MassiveBariers[iB].xB1, MassiveBariers[iB].yB1, MassiveBariers[iB].xB2, MassiveBariers[iB].yB2);

iB += 1;

}

}

}

Листинг класса Object

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace PhisicModel

{

public class Vector

{

public int x;

public int y;

}

class Object: Form1

{

Vector[] MassiveVectors = new Vector[100];

public int xObj;

public int yObj;

public int diametr;

int i = 0;

public Vector resultV = new Vector();

public Vector donate = new Vector();

int ForceDecrease = 0;

bool active = true;

public void AddObject(int x1,int y1,int weight1)

{

xObj = x1;

yObj = y1;

diametr = weight1;

MassiveVectors[i] = new Vector();//вектор силы тяжести

MassiveVectors[i].x = xObj;

MassiveVectors[i].y = yObj + 5;

i++;

Vector resultV = new Vector();

}

public void NewVector(int xV, int yV)

{

MassiveVectors[i] = new Vector();

MassiveVectors[i].x = xV;

MassiveVectors[i].y = yV;

i++;

}

public Vector NewLocation()

{

resultV.x = xObj;

resultV.y = yObj;

for (int i1 = 0; i1 < i; i1++)

{

resultV.x = resultV.x + (MassiveVectors[i1].x-xObj);

resultV.y = resultV.y + (MassiveVectors[i1].y - yObj);

}

int xPast = xObj;

int yPast = yObj;

xObj = resultV.x;

yObj = resultV.y;

for (int i1 = 0; i1 < i; i1++)

{

MassiveVectors[i1].x = xObj + (MassiveVectors[i1].x-xPast);

MassiveVectors[i1].y = yObj + (MassiveVectors[i1].y - yPast);

}

if (ForceDecrease == 3)

{

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

{

if (MassiveVectors[i1].x != xObj)

if (MassiveVectors[i1].x > xObj)

MassiveVectors[i1].x -= 1;

else

MassiveVectors[i1].x += 1;

if (MassiveVectors[i1].y != yObj)

if (MassiveVectors[i1].y > yObj)

MassiveVectors[i1].y -= 1;

else

MassiveVectors[i1].y += 1;

}

ForceDecrease = 0;

}

ForceDecrease++;

return resultV;

}

public Vector OtherVec(int Xdonate, int Ydonate)

{

donate.x = Xdonate;

donate.y = Ydonate;

for (int i1 = 0; i1 < i; i1++)

{

donate.x = donate.x + (MassiveVectors[i1].x - xObj);

donate.y = donate.y + (MassiveVectors[i1].y - yObj);

}

return donate;

}

public void CollisionObj(Vector OtherV)

{

if (active)

{

MassiveVectors[i - 1].x = OtherV.x;

MassiveVectors[i - 1].y = OtherV.y;

active = false;

}

}

public void CollisionBar()

{

if (xObj <= 0)

{

MassiveVectors[i - 1].x = xObj +(xObj- MassiveVectors[i - 1].x);

}

if (xObj >= 410)

{

MassiveVectors[i - 1].x = xObj + (xObj- MassiveVectors[i-1].x );

}

if (yObj <= 0)

{

MassiveVectors[i - 1].y = yObj + (yObj - MassiveVectors[i - 1].y);

}

if (yObj >= 410)

{

MassiveVectors[i - 1].y = yObj + (yObj - MassiveVectors[i - 1].y);

}

}

}

}

Листинг класса Barier

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace PhisicModel

{

class Barier

{

public int xB1;

public int xB2;

public int yB1;

public int yB2;

public void AddBarier(int x1, int y1,int x2, int y2)

{

xB1 = x1;

xB2 = x2;

yB1 = y1;

yB2 = y2;

}

}

}

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.