Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычисление матриц? http://www.cyberforum.ru/cpp/thread1205147.html
1. Составить алгоритм программы для вычисления матриц 2. Написать программу на языке С + + для вычисления матриц
C++ Microsoft Visual C++ Объясните, пожалуйста, что значит эта ошибка: error MSB4062: Невозможно загрузить задачу "MIBPreProcessDependencyGraph" из сборки "Microsoft.Build.CppTasks.Common, Version=4.0.0.0, Culture=neutral,... http://www.cyberforum.ru/cpp/thread1204807.html
C++ Шифратор Дешифратор
Ребят, нужна очень программа которая будет шифровать и дешифровать информацию, слова например. Метод не важен, можно Цезаря например Ключ так же, закрытый или открытый неважно Буду очень...
C++ Переименовать окно приложения
Добрый день. Хочу сделать, чтобы в том случае, если приложение было открыто несколько раз, то их названия писались по разному: 1е окно - "App", 2 окно - "App", 3 окно "App" и т.д. Пытаюсь...
C++ Нужно доработать программу, что бы считала кол-во спичек. Текст задания ниже http://www.cyberforum.ru/cpp/thread1204197.html
Разработать программную модель следующей игры двух игроков(пользователь-компьютер),реализовав выигрышную стратегию для компьютера:На стол выкладываются 50 спичек.Каждый игрок по очереди вынимает...
C++ Логическое высказывание если дано логическое выражение, в котором все сокращается, какой будет ответ? Выполнимо, общезначимо, невыполнимо... подробнее

Показать сообщение отдельно
maxii
1 / 1 / 0
Регистрация: 28.12.2011
Сообщений: 226

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

11.06.2014, 19:20. Просмотров 346. Ответов 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)NULL,
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru