<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=Grupo_-_BOIDS%2Fcodigo_barreira_fronteira</id>
	<title>Grupo - BOIDS/codigo barreira fronteira - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=Grupo_-_BOIDS%2Fcodigo_barreira_fronteira"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_barreira_fronteira&amp;action=history"/>
	<updated>2026-04-09T22:08:56Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_barreira_fronteira&amp;diff=2252&amp;oldid=prev</id>
		<title>Alvaroe: Criou página com '&lt;br /&gt;  &lt;source lang=&quot;c&quot;&gt; #include&lt;stdio.h&gt; #include&lt;math.h&gt;               #include&lt;stdlib.h&gt; #include&lt;time.h&gt;  // programa particulas boids para CC periodica.   #define N 500...'</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_barreira_fronteira&amp;diff=2252&amp;oldid=prev"/>
		<updated>2018-01-25T08:14:11Z</updated>

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