Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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();//Переход на форму

}

 

};

}

Date: 2015-07-17; view: 205; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.009 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию