#include "widget.h" #include #include Widget *window;// вказівник на вікно програми struct object // клас об'єкт { float x,y, // координати vx,vy, // проекції швидкості radius; // радіус круга QColor color; // колір круга void paint(QPainter &painter) // метод відображення об'єкта { painter.setBrush(QBrush(color, Qt::SolidPattern)); // встановлення кольору пензлика painter.drawEllipse(QPointF(x,y), radius, radius); // малювання круга } void move() // метод опрацювання руху об'єкта { x += vx; // прямолінійний рівномірний рух y += vy; // відбивання від стінок if((x>window->width() -radius && vx>0.0f) || (x<0.0f+radius && vx<0.0f)) vx = -vx; if((y>window->height()-radius && vy>0.0f) || (y<0.0f+radius && vy<0.0f)) vy = -vy; } }*objects[2];// вказівники на об'єкти int objects_count = 0;// загальна кількість об'єктів void Step(QPainter &painter) { for(int i=0;imove(); objects[i]->paint(painter); } if(objects_count>1) // перевірка злиття об'єктів { float dx = objects[0]->x-objects[1]->x; float dy = objects[0]->y-objects[1]->y; float contact_radius = objects[0]->radius+objects[1]->radius; // якщо об'єкти дотикаються або перетинаються if(dx*dx+dy*dyradius += objects[1]->radius; objects[0]->color = QColor(255,128,0); objects[0]->x = (objects[0]->x+objects[1]->x)*0.5f; objects[0]->y = (objects[0]->y+objects[1]->y)*0.5f; objects[0]->vx = (objects[0]->vx+objects[1]->vx)*0.5f; objects[0]->vy = (objects[0]->vy+objects[1]->vy)*0.5f; delete objects[1]; // видалення зайвого об'єкта objects_count = 1; } } } int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; // створення вікна w.show(); window = &w; // створення об'єктів objects[0] = new object{rand()%w.width(), rand()%w.height(), (rand()%2001)*0.001f-1.0f, (rand()%2001)*0.001f-1.0f, 30.0f, Qt::red}; objects[1] = new object{rand()%w.width(), rand()%w.height(), (rand()%2001)*0.001f-1.0f, (rand()%2001)*0.001f-1.0f, 30.0f, Qt::yellow}; objects_count = 2; return a.exec();// запуск основного циклу програми }