Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursovaya_физика столкновений.docx
Скачиваний:
11
Добавлен:
02.06.2015
Размер:
266.5 Кб
Скачать

3. Описание работы программы с представлением экранных форм

При запуске приложения пользователь видит всплывающее окно (Рис 3.1.)

Чтобы продолжить, надо нажать кнопку «Ок».

Рисунок 3.1.-Вид всплывающего окна «Подсказка»

Затем пользователь видит окно, в котором происходит основная работа

приложения (Рис 3.2.)

Рисунок 3.2.-Вид формы после запуска приложения

После чего ему необходимо ввести диаметр окружности

После ввода данных пользователь добавляет шары в нужное ему место на форме (Рис 3.3.) .

Рисунок 3.3.- Вид формы при добавлении шаров

Когда пользователь добавил необходимое количество шаров, то ему нужно нажатием на кнопку «Добавление шаров» перейти на режим «Движение шаров». Щелчком мыши на экран пользователь увидит движение шаров (Рис 3.4.).

Рисунок 3.4.-Вид формы при движении шаров

Пользователь также может посмотреть справку, где указано как работать с приложением (Рис 3.5.).

Рисунок 3.5.-Справка к приложению

Заключение

Результатом работы над курсовой работой стало приложение с удобным и простым, на мой взгляд, интерфейсом. Мною было изучено, на мой взгляд, много нового и полезного материала, для углублённого изучения языка программирования С++. Требуемый функционал реализован. Приложением может воспользоваться любой человек, но для начала следует прочитать справку, чтобы разобраться в приложении.

Список использованных источников

  1. Библиотека MSDN (Microsoft Developer Network). http://msdn.microsoft.com/ru-ru/library/default.aspx

  2. Stack Overflow. http://stackoverflow.com/questions/tagged/c%23

  3. C/C++/C# - общие вопросы — Форум CodeNet. http://forum.codenet.ru/questions/theme/30

  4. Александров П. С. Курс аналитической геометрии и линейной алгебры. — М.: Наука, Главная редакция физико-математической литературы, 1979, 512 с.

  5. Виноградов И. М. Аналитическая геометрия.— М.: Наука. Гл. ред, физ.-мат. лит., 1986.- 176 с.

  6. Полный справочник по C++. Герберт Шилдт. 2006

Приложение. Исходный код программы с комментариями

1. Form1.H

#include "circle.h"

#include "math.h" // для математики: sqrt(), pow()

#include "form2.h"

public ref class Form1 : public System::Windows::Forms::Form

{

public:

List<circle ^> ^elements;

bool flag; // флаг для переключения режимов

Form1(void)

{

InitializeComponent();

//

elements = gcnew List<circle ^>();

timer1->Start();

flag = 1; // по умолчанию – «добавление шаров»

}

private: System::Windows::Forms::Button^ button1;

public:

private: System::Windows::Forms::Timer^ timer1;

public:

void Dvig(){

float dt = 0.01F; // приращение времени

int sz = elements->Count; // Количество элементов в массиве

circle ^c1, ^c2;

//Просчет столкновений

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

{

for(int j=0;j<sz;j++)

{

if (i==j) continue;

c1 = elements[i];

c2 = elements[j];

float dx,dy;

dx = c1->GetCenterX() - c2->GetCenterX();

dy = c1->GetCenterY() - c2->GetCenterY();

float dist = sqrt(pow(dx,2.f)+pow(dy,2.f)); // расстоя-

ние между шарами

if (c1->GetVX()*dx+c1->GetVY()*dy < 0.0f)

{

if ((c1->GetRadius()+c2->GetRadius())*0.5f > dist)

{

float nx, ny;

float tx,ty;

nx = dx/dist; // нормаль

ny = dy/dist; // нормаль

tx = -ny; // тангент-вектор

ty = nx; // тангент-вектор

// сложный подсчет физики

float sx,sy;

sx = -c1->GetVX() * nx + c1->GetVY() * ny;

sy = c1->GetVX() * tx - c1->GetVY() * ty;

float vx1,vy1,vx2,vy2;

vx1 = -sy*nx; vy1 = -sy*ny;

vx2 = sx*tx; vy2 = sx*ty;

// сначала записываем приращение скоростей

в переменную буфер

c1->v_res_x = vx1-vx2;

c1->v_res_y = -vy1+vy2;

c1->numcolis++;//Если шар столкнулся с другим шаром то Numcolis увеличивается на 1

}

}

}

}

// Потом в цикле

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

{

if (elements[i]->numcolis)

elements[i]->SetSpeed(elements[i]->v_res_x/elements[i]->numcolis,elements[i]->v_res_y/elements[i]->numcolis);

}

}

public:

virtual void OnPaint(System::Windows::Forms::PaintEventArgs^ e) override

{

Form::OnPaint( e );

float dt = 0.01F; // приращение времени

int sz = elements->Count;// Количество элементов в массиве

// рисуем шары

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

{

elements[i]->update(e, dt);

elements[i]->setV_res_x(elements[i]->GetVX());

elements[i]->setV_res_y(elements[i]->GetVY());

elements[i]->setNumcolis(0);

}

}

}

//таймер вызывается каждый определенный промежуток времени

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

Refresh();//Обновление таймера

}

// кнопка смены режима

private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {

if (flag == 1)

{

flag = 0;

button1->Text = "Движение шаров";

}

else

{

flag = 1;

button1->Text = "Добавление шаров";

}

}

private: System::Void Form1_Shown(System::Object^ sender, System::EventArgs^ e) {

MessageBox::Show("У Вас на столе нет ни одного шара. Введите пожалуйста диаметр шаров и при нажатии на экран добавляйте шары в нужное вам место.", "Подсказка");

txtd->Focus();

}

private: System::Void mnuExit_Click(System::Object^ sender, System::EventArgs^ e) {

Close();//Закрытие окна программы

}

// обработка нажатий мыши

private: System::Void Form1_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {

int sz = elements->Count;

if (txtd->Text == "")//Если диаметр не введён

{

MessageBox::Show("Введите диаметр окружности и добавьте шары", "Предупреждение");

txtd->Focus();

return;

}

int d= Convert::ToSingle(txtd->Text);// Считывание диаметра окружности

if (d >70 || d < 10 )//Если диаметр не входит в интервал

{

MessageBox::Show("Недопустимый диаметр. Диаметр должен находиться в диапазоне [10;70].", "Ошибка");

txtd->Focus();

return;

}

if (flag == 1)

{

// Добавляем шар

elements->Add(gcnew circle(e->X,e->Y,d));

}

else

{

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

{

// получаем данные о шаре

float x = elements[i]->GetCenterX();

float y = elements[i]->GetCenterY();

// толкаем шар

elements[i]->SetSpeed(x - e->X, y - e->Y);

}

}

}

private: System::Void mnuSp_Click(System::Object^ sender, System::EventArgs^ e) {

form2^ form = gcnew form2;//Создание экземпляра формы

form->Show();//Переход на форму

}

};

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]