Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
3 / 3 / 1
Регистрация: 28.12.2011
Сообщений: 253
1

Как переделать код для р8я частиц

11.06.2014, 19:20. Показов 552. Ответов 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(points),+sizeof(colors)N ULL,
GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER,0,sizeofpoints,points);
glBufferSubData(GL_ARRAY_BUFFER,sizeof(points),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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2014, 19:20
Ответы с готовыми решениями:

Код написан в Dev C. Не работает в Visual. Как нужно переделать код?
Здравствуйте. Столкнулась с такой проблемой: код был написан в Dev C, но в Visual он выдаёт...

Переделать код для unordered_set
Здравствуйте! У меня просьба к более опытным программистам данного форума. Можно ли как-то...

Как переделать код для ACCESS?
Option Compare Database Private Sub Кнопка2_Click() Dim i&amp; Set icell = ActiveCell For i = 3 To...

Как переделать комовский код для .exe
Есть вот код для проги .com. Как его переделать, чтобы можно было скомпилить в тасме в .exe?...

1
3 / 3 / 1
Регистрация: 28.12.2011
Сообщений: 253
13.06.2014, 13:13  [ТС] 2
Что никто не может подсказать как привязать скорость к цвету частицы? Точнее проблема в том как поделитьти частицы с помощью каокго цыкла. Во втором коде пишет vec3 is not found. Наверное там надо подключить Gsls, как єтос делать. И как єтот тип вообще работает?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2014, 13:13

Как переделать код чтобы он работал для .xlsx файлов
Есть код, который извлекает информацию из .xls файлов с помощью ExcelExtractor : package main;...

Как переделать код для экспорта данных в Excel под OpenOffice Calc?
Пишу дипломную. Есть код для копирования из таблицы String Grid в программу Microsoft Excel (то...

Переделать код для сортировки массива на код для сортировки двумерной матрицы
возникла проблема, не могу переделать код для сортировки массива на код для сортировки двумерной...

Переделать код для Qt
Здравствуйте, уважаемые форумчане. Меня попросили помочь написать несложную программу на С++, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.