|
3 / 3 / 1
Регистрация: 28.12.2011
Сообщений: 253
|
|
Как переделать код для р8я частиц11.06.2014, 19:20. Показов 882. Ответов 1
Метки нет (Все метки)
Надо чтобы они имели скоростя одинаковы но соответсвенно их цвету--то есть как их поделить хотя бы на трир цвета с разными скоростями
#include <stdio.h> #include <cstdlib> #include <time.h> #include <math.h> #include <iostream> #include "windows.h" #include <gl\glut.h> /*Ekran*/ #define WIDTH 400 #define HEIGHT 400 /*Zagalni*/ #define GLOBAL 0.3 #define PERSONAL 0.3 #define INERT 0.3 #define DELAY 100 /*Riy*/ #define N 60 //NUmber of agents #define K 200 //Number of moves /* Obmezhennya */ #define Xmin -4 #define Xmax 6 #define Ymin -4 #define Ymax 6 double velocity[N][2]; double swarm[N][2]; double BestPers[N][3]; double BestGlob[3]; float Lrand(float min, float max) { return (min + ((rand() % 10000) / 1e4) * (max - min)); } void init() //Generate initial positions and directions { srand(time(NULL)); glClearColor(1, 1, 1, 0); glMatrixMode(GL_PROJECTION); gluOrtho2D(Xmin, Xmax, Ymin, Ymax); for(int i = 0; i < N; i++) { swarm[i][0] = Lrand(Xmin, Xmax); swarm[i][1] = Lrand(Ymin, Ymax); velocity[i][0] = Lrand(-1, 1); velocity[i][1] = Lrand(-1, 1); BestPers[i][2] = 100000; } BestGlob[2] = 100000; } void MoveWasp() //Moves the whole wasp { for(int i = 0; i < N; i++) { for(int a = 0; a < 2; a++) { velocity[i][a] = INERT * velocity[i][a] + Lrand(-1, 1) * GLOBAL * (BestGlob[a] - swarm[i][a]) + Lrand(-1, 1) * PERSONAL * (BestPers[i][a] - swarm[i][a]); swarm[i][a] = swarm[i][a] + velocity[i][a]; } } } int chkBrd(int i) //Verifies agent's position { if((Xmin <= swarm[i][0]) && (swarm[i][0] <= Xmax) && (Ymin <= swarm[i][1]) && (swarm[i][1] <= Ymax)) return 1; else return 0; } double calculate(int i) { double f; double a = swarm[i][0], b = swarm[i][1]; f = - 0.1 * fabs(1 - b) - 0.1 * fabs(1 - a) - j0(20 * a * a + b * b); // f = - 0.1 * fabs(1 - b) - 0.1 * fabs(1 - a) - j0(a * a + b * b); // f = a * sin(4 * a) + 1.1 * b * sin(2 * b); return f; } void checkBP(int i, double a) { if(a < BestPers[i][2]) { BestPers[i][2] = a; BestPers[i][1] = swarm[i][1]; BestPers[i][0] = swarm[i][0]; } } void checkBG(int i, double a) { if(a < BestGlob[2]) { BestGlob[2] = a; BestGlob[1] = swarm[i][1]; BestGlob[0] = swarm[i][0]; } } void draw(void) { glColor3f(1, 1, 0); glBegin(GL_POINTS); for(int i = 0; i < N; i++) glVertex2dv(swarm[i]); glVertex2d(BestGlob[0], BestGlob[1]); glEnd(); glFlush(); glutSwapBuffers(); } void display(int i) { std::cout << i << "\t" << BestGlob[0] << "\t" << BestGlob[1] << "\t" << BestGlob[2] << "\n"; } void go() { double a; for(int k = 0; k < K; k++) { for(int i = 0; i < N; i++) { if(chkBrd(i)) { a = calculate(i); checkBP(i, a); checkBG(i, a); } } display(k); draw(); MoveWasp(); glClear(GL_COLOR_BUFFER_BIT); Sleep(DELAY); } return; } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(600,220); glutInitWindowSize(WIDTH, HEIGHT); glutCreateWindow("Рій Комах"); glPointSize(2.0); glEnable(GL_POINT_SMOOTH); init(); glutDisplayFunc(go); glutIdleFunc(go); glutMainLoop(); } Добавлено через 22 минуты Первоначальный код -- но там надо GLSL, а я на глуте работаю и не знаю все таки как там переделывать point4 в vec4. Как там определить position[j] (0..3); typedef point4 vec4; typedefstructparticle { int color; point4 position; vec4 velocity; float mass; }particle; intnum_particles; for(inti=0;i<num_particles;i++) { particles[i].mass=1.0; particles[i].color=i%NUM_COLORS; for(intj=0;j<3;j++) { particles[i].position[j]=2.0*((float)rand()/RAND_MAX)-1.0; particles[i].velocity[j]=speed*2.0*((float) rand()/RAND_MAX)-1.0; } p articles[i].position[3]=1.0; particles[i].velocity[3]=0.0; } voiddisplay(void) { glClear(GL_COLOR_BUFFER_BIT); for(i=0;i<num_particles;i++) { point_colors[i+24]=colors[particles[i].color]; points[i+24]=particles[i].position; } glBindBuffer(GL_ARRAY_BUFFER,buffers[0]); glBufferData(GL_ARRAY_BUFFER,sizeof(poin ts),+sizeof(colors)NULL, GL_DYNAMIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER,0,sizeof points,points); glBufferSubData(GL_ARRAY_BUFFER,sizeof(p oints),sizeof(colors),colors); glDrawArrays(GL_POINTS,24,num_particles) ; glutSwapBuffers(); } float last_time,present_time; voididle(void) { inti,j; floatdt; present_time=glutGet(GLUT_ELAPSED_TIME);/*inmilliseconds*/ dt=0.001*(present_time-last_time);/*inseconds*/ for(i=0;i<num_particles;i++) { for(j=0;j<3;j++) { p articles[i].position[j]+=dt*particles[i].velocity[j]; particles[i].velocity[j]+=dt*forces(i,j)/particles[i].mass; } collision(i); } last_time=present_time; glutPostRedisplay(); } floatcoef;/*coefficientofrestitution*/ voidcollision(intn) { inti; for(i=0;i<3;i++) { if(particles[n].position[i]>=1.0) { particles[n].velocity[i]=-coef*particles[n].velocity[i]; particles[n].position[i]=1.0-coef* (particles[n].position[i]-1.0); } if(particles[n].position[i]<=-1.0) { particles[n].velocity[i]=-coef*particles[n].velocity[i]; particles[n].position[i]=-1.0-coef* (particles[n].position[i]+1.0); } } } bool gravity=TRUE; floatforces(inti,intj) { if(!gravity)return(0.0); elseif(j==1)return(-1.0); elsereturn(0.0); } Добавлено через 3 минуты Извиняюсь предыдущий код был первоначальным для следуещего: #include <GL/gl.h> #include <GL/glut.h> #include <windows.h> #include <stdio.h> #include <math.h> #define MAX_NUM_PARTICLES 100 typedef struct particle { int colorr; int colorg; int colorb; float positionx; float positiony; float positionz; float velocityx; float velocityy; float velocityz; float mass; } particle; particle particles[MAX_NUM_PARTICLES]; int speed=2.0; int num_particles=60; void init () { for(int i=0; i<num_particles; i++) { particles[i].mass = 1.0; particles[i].positionx = 2.0*((float) rand()/RAND_MAX)-1.0; particles[i].positiony = 2.0*((float) rand()/RAND_MAX)-1.0; particles[i].positionz = 2.0*((float) rand()/RAND_MAX)-1.0; if (i<num_particles/3) { particles[i].velocityx = speed*1.0*((float) rand()/RAND_MAX)-1.0; particles[i].velocityy = speed*1.0*((float) rand()/RAND_MAX)-1.0; particles[i].velocityz = speed*1.0*((float) rand()/RAND_MAX)-1.0; particles[i].colorr =255; particles[i].colorr =255; particles[i].colorr =0; } else if ((num_particles/3=<i) && (i<2*num_particles/3)) { particles[i].velocityx = speed*2.0*((float) rand()/RAND_MAX)-1.0; particles[i].velocityy = speed*2.0*((float) rand()/RAND_MAX)-1.0; particles[i].velocityz = speed*2.0*((float) rand()/RAND_MAX)-1.0; particles[i].colorr =255; particles[i].colorr =0; particles[i].colorr =0; } else { particles[i].velocityx = speed*2.0*((float) rand()/RAND_MAX)-1.0; particles[i].velocityy = speed*2.0*((float) rand()/RAND_MAX)-1.0; particles[i].velocityz = speed*2.0*((float) rand()/RAND_MAX)-1.0; particles[i].colorr =255; particles[i].colorr =0; particles[i].colorr =255; }; } } void display(void) { glClear(GL_COLOR_BUFFER_BIT); for(int i=0; i<num_particles; i++) { point_colors[i+24] [3] = colors[particles[i].color]; points[i+24] [3] = particles[i].positionx; } glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(points), +sizeof(colors)NULL, GL_DYNAMIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(points),points); glBufferSubData(GL_ARRAY_BUFFER, sizeof(points), sizeof(colors),colors); glDrawArrays(GL_POINTS, 24, num_particles); glutSwapBuffers(); } float last_time, present_time; void idle(void) { int i, j; float dt; present_time = glutGet(GLUT_ELAPSED_TIME); /* in milliseconds */ dt = 0.001*(present_time - last_time); /* in seconds */ for(i=0; i<num_particles; i++) { particles[i].positionx+=dt*particles[i].velocityx; particles[i].velocityx+=dt*forces(i,1)/particles[i].mass; particles[i].positiony+=dt*particles[i].velocityy; particles[i].velocityy+=dt*forces(i,2)/particles[i].mass; particles[i].positionz+=dt*particles[i].velocityz; particles[i].velocityz+=dt*forces(i,3)/particles[i].mass; } collision(i); } last_time = present_time; glutPostRedisplay(); } float coef=1; /* coefficient of restitution */ void collision(int n) { if(particles[n].positionx>=1.0) { particles[n].velocityx = -coef*particles[n].velocityx; particles[n].positionx = 1.0-coef* (particles[n].positionx-1.0); } if(particles[n].positionx<=-1.0) { particles[n].velocityx = -coef*particles[n].velocityx; particles[n].positionx= -1.0-coef* (particles[n].positionx+1.0); } if(particles[n].positiony>=1.0) { particles[n].velocityy = -coef*particles[n].velocityy; particles[n].positiony = 1.0-coef* (particles[n].positiony-1.0); } if(particles[n].positiony<=-1.0) { particles[n].velocityy = -coef*particles[n].velocityy; particles[n].positiony= -1.0-coef* (particles[n].positiony+1.0); } if(particles[n].positionz>=1.0) { particles[n].velocityz = -coef*particles[n].velocityz; particles[n].positionz= 1.0-coef* (particles[n].positionz-1.0); } if(particles[n].positionz<=-1.0) { particles[n].velocityz = -coef*particles[n].velocityz; particles[n].positionz= -1.0-coef* (particles[n].positionz+1.0); } } bool gravity = TRUE; float forces(int i, int j) { if(!gravity) return(0.0); else if(j==1) return(-1.0); else return(0.0); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(600,220); glutInitWindowSize(WIDTH, HEIGHT); glutCreateWindow("Рій Комах"); glPointSize(2.0); glEnable(GL_POINT_SMOOTH); init(); glutDisplayFunc(display); glutIdleFunc(display); glutMainLoop(); }
0
|
|
| 11.06.2014, 19:20 | |
|
Ответы с готовыми решениями:
1
Код написан в Dev C. Не работает в Visual. Как нужно переделать код? Переделать код для unordered_set Как переделать код для ACCESS? |
|
3 / 3 / 1
Регистрация: 28.12.2011
Сообщений: 253
|
|
| 13.06.2014, 13:13 [ТС] | |
|
Что никто не может подсказать как привязать скорость к цвету частицы? Точнее проблема в том как поделитьти частицы с помощью каокго цыкла. Во втором коде пишет vec3 is not found. Наверное там надо подключить Gsls, как єтос делать. И как єтот тип вообще работает?
0
|
|
| 13.06.2014, 13:13 | |
|
Помогаю со студенческими работами здесь
2
Как переделать код .com в .exe Как переделать код чтобы он работал для .xlsx файлов
Переделать код для сортировки массива на код для сортировки двумерной матрицы Переделать код для Qt Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|