http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_barreira_fronteira&feed=atom&action=history
Grupo - BOIDS/codigo barreira fronteira - Histórico de revisão
2024-03-29T07:26:34Z
Histórico de revisões para esta página neste wiki
MediaWiki 1.39.4
http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_barreira_fronteira&diff=2252&oldid=prev
Alvaroe: Criou página com '<br /> <source lang="c"> #include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> // programa particulas boids para CC periodica. #define N 500...'
2018-01-25T08:14:11Z
<p>Criou página com '<br /> <source lang="c"> #include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> // programa particulas boids para CC periodica. #define N 500...'</p>
<p><b>Página nova</b></p><div><br /><br />
<br />
<source lang="c"><br />
#include<stdio.h><br />
#include<math.h> <br />
#include<stdlib.h><br />
#include<time.h><br />
<br />
// programa particulas boids para CC periodica. <br />
<br />
#define N 500 //numero de particulas<br />
#define T 2400 //numero de passos<br />
#define C 0.05 //constante de coesao<br />
#define S 0.3 // constante de separaçao<br />
#define M 0.15 // media das velocidades<br />
#define ini 0.1 // valor maximo das componentes da velocidade<br />
// valor maximo da velocidade (sqrt(2)*ini)<br />
#define E 10 // valor de excesso que a barreira trava os BOIDS<br />
#define EE 0.1 // valor constante barreira nas fronteiras<br />
#define PI 3.1415926538979 // aprox de pi<br />
#define I 15 // Quantidade de passos passados para plotar no gif<br />
<br />
double norm(double x, double y){ //funçao norma<br />
return sqrt(x*x + y*y);<br />
}<br />
<br />
<br />
main(){<br />
<br />
double r[N][2], v[N][2], epsilon=0.01, R=20, rmin=3, erre=12, ERRE=5, dt = 0.1;<br />
double random;<br />
double x=0., y=0., L=100, vmx=0, vmy=0;<br />
int i=0, j=0, k=0, l=0, m=0, t=0, a=0, b=0;<br />
int cont=0, kont=0; //conta o numero de vizinhos proximos da particula<br />
int vizinhos[N][2]; //nao deixa a velocidade explodir nem tender a 0<br />
<br />
<br />
//**********Inicializar Particulas (posicao e velocidade)**********//<br />
<br />
printf("set terminal gif animate delay 1.0E-5\n");// Produz arquivo .gif<br />
printf("set output 'boidsvelviz.gif'\n"); //<br />
printf("set size square\n"); // caso rode com<br />
printf("set title 'Tempo t = 0.0'\n"); // |gnuplot apa-<br />
printf("set xrange [0:%lf]\n", L); // recem os graficos.<br />
printf("set yrange [0:%lf]\n", L); // <br />
printf("plot '-' w p pt 3 title sprintf(\"BOIDS\")\n"); //<br />
<br />
for(i=0;i<N;i++){<br />
r[i][0] = L*rand()/RAND_MAX; //<br />
r[i][1] = L*rand()/RAND_MAX; // Inicializa as pos e vel<br />
v[i][0] = ini*(2.*rand()/RAND_MAX - 1); // das particulas aleatoriamente<br />
v[i][1] = ini*(2.*rand()/RAND_MAX - 1); //<br />
printf("%lf %lf \n", r[i][0], r[i][1]); // <br />
}<br />
<br />
printf("e \n"); // Final da impressao dos BOIDS<br />
<br />
<br />
//**********Dinamica das Particulas**********//<br />
<br />
<br />
do{ //inicio do passo de tempo<br />
t++; //passo de tempo<br />
if(t%I == 0){<br />
printf("set size square\n"); //<br />
printf("set title 'Tempo t = %.1lf'\n", t*dt); // <br />
printf("set xrange [-0:%lf]\n", L); // Caso rode com |gnuplot <br />
printf("set yrange [-0:%lf]\n", L); // sao gerados os graficos<br />
printf("plot '-' w p pt 3 title sprintf(\"BOIDS\")\n"); // <br />
}<br />
<br />
<br />
for(j=0;j<N;j++){ // dinamica de cada particula<br />
<br />
cont=0; // contador para coesao das particulass<br />
x = 0; // media das particulas vizinhas para coesao<br />
y = 0; // media das particulas vizinhas para coesao<br />
<br />
kont = 0; // contador para media das velocidades<br />
vmx = 0; // media das veloc. das particulas<br />
vmy = 0; // media das veloc. das particulas<br />
<br />
<br />
//**********Alinhamento**********//<br />
<br />
<br />
for(k=0;k<N;k++){ // laço para todas as particulas<br />
if(k == j){ // se eh a mesma particula nao faz nada<br />
} else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])<erre){ <br />
kont++; // se eh outra particula acrescenta no contador<br />
vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x<br />
vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y<br />
}<br />
}<br />
<br />
if(kont > 1){<br />
v[j][0] = (1-M)*v[j][0] + M*vmx/kont; // media para a velocidade<br />
v[j][1] = (1-M)*v[j][1] + M*vmy/kont; // dos vizinhos e a propria<br />
}<br />
<br />
<br />
//**********Coesao Entre Particulas e CM**********//<br />
<br />
<br />
for(m=0;m<N;m++){ // laço das particulas <br />
if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])<R){// se as particulas tiverem<br />
// a uma distancia menor q<br />
// "R"<br />
cont++; // acrescenta no contador <br />
x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x<br />
y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y<br />
} <br />
}<br />
<br />
if(cont>1){ // se contador for cont > 1<br />
x = x/cont; // media aritmetica na componente x <br />
y = y/cont; // media aritmetica a componente y<br />
<br />
v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c poten-<br />
// cial de mola na componente x<br />
v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c poten- <br />
} // cial de mola na componente y<br />
<br />
<br />
//**********Separacao Entre Particulas**********//<br />
<br />
for(l=0;l<N;l++){ //laço para particulas<br />
if(l==j){ // se a particula for ela mesma nao faz nada <br />
<br />
}else{ // se nao é ela entao<br />
<br />
if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])<rmin){ // se as particulas<br />
// estao a uma distancia menor que "rmin"<br />
v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente x<br />
v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente y<br />
}<br />
}<br />
}<br />
<br />
<br />
//**********Velocidade Pela Densidade de Vizinhos**********//<br />
<br />
<br />
if(cont + kont < 0.1*N){ // se o numero de vizinhos for menor que 0.1*N<br />
vizinhos[j][0] = 1; // chave 1 fecha<br />
vizinhos[j][1] = 0; // chave 2 abre<br />
}else{<br />
vizinhos[j][0] = 0; // chave 1 abre<br />
}<br />
<br />
if(norm(v[j][0],v[j][1]) > 0.5*ini){ // se a velocidade media do passo anterior for maior<br />
// que 0.7*ini<br />
vizinhos[j][1] = 0; // chave 2 "abre"<br />
}<br />
<br />
if(vizinhos[j][0] == 0){ // se chave 1 aberta <br />
if(vizinhos[j][1] == 1){ // se chave 2 fechada entao nao faz nada<br />
<br />
}else if(cont +kont >0.5*N){ // se vizinhos > 0.5*N entao <br />
v[j][0] = 0.8*v[j][0]; // velocidade reduz 20% <br />
v[j][1] = 0.8*v[j][1]; // velocidade reduz 20%<br />
<br />
}else if(cont + kont > 0.4*N){ // se vizinhos 0.5> e >0.4 entao<br />
v[j][0] = 0.85*v[j][0]; // velocidade reduz 15%<br />
v[j][1] = 0.85*v[j][1]; // velocidade reduz 15%<br />
<br />
}else if(cont + kont > 0.3*N){ // se vizinhos 0.4> e >0.3 entao<br />
v[j][0] = 0.9*v[j][0]; // velocidade reduz 10%<br />
v[j][1] = 0.9*v[j][1]; // velocidade reduz 10%<br />
<br />
}else if(cont + kont > 0.2*N){ // se vizinhos 0.3> e >0.2 entao<br />
v[j][0] = 0.95*v[j][0]; // velocidade reduz 5%<br />
v[j][1] = 0.95*v[j][1]; // velocidade reduz 5%<br />
}<br />
vizinhos[j][1] = 1; // chave 2 fecha<br />
}<br />
<br />
<br />
//**********Ruido Particulas**********//<br />
<br />
<br />
if(rand()%2 == 0){ // criterio para decidir a fase<br />
random = - rand()/RAND_MAX; // fase<br />
}else{<br />
random = rand()/RAND_MAX; // fase<br />
}<br />
v[j][0] = cos(PI*random)*v[j][0] - sin(PI*random)*v[j][1]; // rotaçao<br />
v[j][1] = sin(PI*random)*v[j][0] + cos(PI*random)*v[j][1]; // rotaçao<br />
<br />
<br />
//*********Um Pouco de Barreira nas Fronteiras**********//<br />
<br />
if(r[j][0] - L < E){<br />
v[j][0] = v[j][0] - EE*exp(-pow((L-r[j][0])/E,2));// Atualiza velocidade c <br />
// potencial gaussiano na componente x<br />
}<br />
if(r[j][0] < E){<br />
v[j][0] = v[j][0] + EE*exp(-pow(r[j][0]/E,2)); // Atualiza velocidade c pot<br />
// gaussiano na componente x<br />
}<br />
if(r[j][1] - L < E){<br />
v[j][1] = v[j][1] - EE*exp(-pow((L-r[j][1])/E,2));// Atualiza velocidade c pot<br />
// gaussiano na componente y<br />
}<br />
if(r[j][1] < E){<br />
v[j][1] = v[j][1] + EE*exp(-pow(r[j][1]/E,2)); // Atualiza velocidade c pot<br />
// gaussiano na componente y<br />
}<br />
<br />
//**********Passo das particulas com CC periodica**********//<br />
<br />
if(L-r[j][0] < epsilon){ // final do dominio na componente x <br />
r[j][0] = L - r[j][0]; // recomeça no inicio do dominio em x <br />
}else if(r[j][0] < 0){ // inicio do dominio na coomponente x<br />
r[j][0] = L + r[j][0]; // recomeça no finaldo dominio em x<br />
}<br />
<br />
r[j][0] = r[j][0] + v[j][0]*dt; // atualiza a posiçao da particula em x<br />
<br />
if(L-r[j][1] < epsilon){ // final do dominio em y<br />
r[j][1] = L - r[j][1]; // recomeça no inicio do dominio em y<br />
}else if(r[j][1] < 0){ // inicio do dominio em y<br />
r[j][1] = L + r[j][1]; // recomeça no final do dominio em y<br />
}<br />
<br />
r[j][1] = r[j][1] + v[j][1]*dt; // atualiza a posiçao da particula em y<br />
<br />
if(t%I == 0){<br />
printf("%lf %lf \n", r[j][0], r[j][1]); //imprime a posiçao da particula<br />
}<br />
}<br />
<br />
if(t%I == 0){<br />
printf("e\n"); // final do grafico para |gnuplot <br />
}<br />
<br />
}while(t<T);<br />
<br />
printf("\n\n");<br />
}<br />
</source><br /></div>
Alvaroe