Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Form1.h ⇐ ПредыдущаяСтр 3 из 3 #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();//Переход на форму }
}; }
|