Среда программирования:
Code::Blocks
Статья по теме:
Код программы:
#include <gl\glut.h> #include <cmath> #include <vector> #include <cstdlib> #include <ctime> #include <iostream> #include <memory.h> #include <windows.h> #include <map> using namespace std; double mov = 0; struct point {double x, y, vx, vy, c1, c2, c3;}; //координаты, направление движения и цвет точки int dots = 50000; //количество точек vector<point> points; //вектор двигающихся точек vector<point> stopped; //вектор статичных точек int matrix[500][500]; //матрица точек на экране void Draw(void) { glClear(GL_COLOR_BUFFER_BIT); for(auto i = points.begin(); i != points.end(); i++){ i->c1 = (double)(rand()%100)/100; //------------------- i->c2 = (double)(rand()%100)/100; //изменение i->c3 = (double)(rand()%100)/100; //цвета точки glColor3f(i->c1, i->c2, i->c3); //------------------- glBegin(GL_POINTS); if(i->x+i->vx >= 0 && i->x+i->vx < 400) //перемещение точки по х i->x += i->vx; if(i->y+i->vy <= 0 && i->y+i->vy > -400)//перемещение точки по у i->y += i->vy; glVertex2f(i->x, i->y); //прорисовка точки if(i->vx != 0){ //изменение направления движения точки i->vx = pow(-1, rand()%2); i->vy = pow(-1, rand()%2); } glEnd(); } for(auto i = stopped.begin(); i != stopped.end(); i++){ //прорисовка дерева if(i==stopped.begin()) continue; glColor3f(i->c1, i->c2, i->c3); glBegin(GL_LINES); glVertex2f(i->x, i->y); glVertex2f(i->vx, i->vy); // рисуем линию от одной остановленной точки до другой glEnd(); } int ind = 0; for(auto i = points.begin(); i != points.end(); i++, ind++){ int x = i->x, y = -1*(i->y); int flag = 0; for(int a = -1; a <= 1; a++){ for(int b = -1; b <= 1; b++){ if(x+a >= 0 && x+a < 400 && y+b >=0 && y+b <400) //если не вышли за границы экрана if(matrix[x+a][y+b]){ //если есть статичная точка вокруг не статичной cout << "touched\n"; auto par = stopped[matrix[x+a][y+b]-1];//статична точка точка point e; e.x = i->x; e.y = i->y; e.vx = par.x; e.vy = par.y; if(matrix[x+a][y+b] != 1){ //меняем цвет новой статичной точки e.c1 = 0.9*par.c1+0.1*i->c1; e.c2 = 0.9*par.c2+0.1*i->c2; e.c3 = 0.9*par.c3+0.1*i->c3; } else { e.c1 = i->c1; e.c2 = i->c2; e.c3 = i->c3; } stopped.push_back(e); //добавляем в массив статичных точек points.erase(i); //удаляем из массива точек i--; flag = 1; break; } } if(flag) break; } if(flag) matrix[x][y] = stopped.size(); //запоминает номер точки в массиве статичных точек } glFlush(); glutSwapBuffers(); } void Timer(int value){ glutPostRedisplay(); glutTimerFunc(50, Timer, 0); } int main(int argc, char *argv[]) { srand(time(0)); point n; // n.x = 200; // n.y = -200; // n.vy = 0; // n.vx = 0; //центральная статичная точка n.c1 = 1.0f;// n.c2 = 0.0f;// n.c3 = 0.0f;// matrix[200][200] = 1; stopped.push_back(n); for(int i = 0; i < dots; i++){ //инициализация двигающихся точек point p; p.x = rand()%400; p.vx = pow(-1, rand()%2); p.vy = pow(-1, rand()%2); p.y = -rand()%400; p.c1 = (double)(rand()%100)/100; p.c2 = (double)(rand()%100)/100; p.c3 = (double)(rand()%100)/100; int x = p.x, y = -p.y; points.push_back(p); } glutInit(&argc, argv); glutInitWindowSize(400, 400); glutInitWindowPosition(100, 100); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow("lab"); glutReshapeFunc(Reshape); glutDisplayFunc(Draw); glClearColor(0, 0, 0, 0); glutPassiveMotionFunc(mouseMove); glutTimerFunc(5, Timer, 0); glutMainLoop(); return 0; }