С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2014, 19:20
Ответы с готовыми решениями:

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

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

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

1
3 / 3 / 1
Регистрация: 28.12.2011
Сообщений: 253
13.06.2014, 13:13  [ТС]
Что никто не может подсказать как привязать скорость к цвету частицы? Точнее проблема в том как поделитьти частицы с помощью каокго цыкла. Во втором коде пишет vec3 is not found. Наверное там надо подключить Gsls, как єтос делать. И как єтот тип вообще работает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2014, 13:13
Помогаю со студенческими работами здесь

Как переделать код .com в .exe
Есть вот код для проги .com. Как его переделать, чтобы можно было скомпилить в тасме в .exe? .model tiny .code org 100h .startup ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru