Fractal Estocástico

Publicado por Roberto Júnior 30/10/2006

[ Hits: 8.766 ]

Homepage: http://sites.google.com/site/dibetao

Download pontos2.c




Este programa gera um fractal dito ser aleatório, pois é gerado por um processo estocástico. Uma matriz é usada para armazenar os valores. As dimensões da matriz poderão ser alteradas no fonte do programa.

PS: É necessário o GNUPLOT para gerar o gráfico.

  



Esconder código-fonte

/**
FRACTAL 1

Autor: Roberto Lima
Data: 06/08/2006
Email: dibetao@gmail.com

 - Este programa gera um fractal simples.
 - Ajuste o numero de linha e colunas da
   matriz em LIN e COL respectivamente.
 - Ajuste as dimensoes de A[][], para valores
   maiores que LIN e COL.
 - O programa finaliza assim que ocorre a
   percolacao.
 - Um arquivo 'pontos.txt' eh gerado, e o grafico
   poderá ser visualizado com o GNUPLOT, com o comando
   --> plot 'pontos.txt'.
 
*/

#include <stdio.h>
#include <stdlib.h>

#define LIN 211
#define COL 211


int A[251][251],pp[5],i,j;

//---------------------------------------------------------------------

int vv(int ii,int jj) //verifica vizinhanca
{
int val;
val=0;
if (A[ii+1][jj]==1) val=1;
if (A[ii-1][jj]==1) val=1;
if (A[ii][jj+1]==1) val=1;
if (A[ii][jj-1]==1) val=1;
return(val);
}

//---------------------------------------------------------------------

np()//nova particula
{
int c1=0,pos;
do
   {
   
   pos=rand() % 4;
   switch (pos)
   {
   case 0:   {
         if(pp[2]==1) continue;
         i=1; j= (rand() % COL) +1;
         break;
         }
   case 1:   {
         if (pp[4]==1) continue;
         j=1; i= (rand() % LIN) +1;
         break;
         }
   case 2:   {
         if (pp[1]==1) continue;
         i=LIN; j= (rand() % COL) +1;
         break;
         }
   case 3:   {
         if (pp[3]==1) continue;
         j=COL; i= (rand() % LIN) +1;
         break;
         }
   }
   
   if (A[i][j]==0)   {
         A[i][j]=1;
         c1=1;
         }
   }while (c1!=1);
}

//---------------------------------------------------------------------

mov() //prob movimento
{
int p,ii,jj;

A[i][j]=0;
p=(rand() % 4)+1;
switch (p)
   {
   case 1: j=j+1; break;
   case 2: j=j-1; break;
   case 3: i=i+1; break;
   case 4: i=i-1; break;
   }

if (i>LIN || i<1 || j>COL || j<1) np();
else{
   A[i][j]=1;
   if (vv(i,j)==1){
            if (i==LIN || i==1 || j==COL || j==1)
               {
               if(i==LIN) pp[1]=1;
               if(i==1) pp[2]=1;
               if(j==COL) pp[3]=1;
               if(j==1) pp[4]=1;
               i=0; j=0;
               }else np();
            }
   }

}

//---------------------------------------------------------------------

salva()
{
int ii,jj;
FILE *arq;

arq=fopen("pontos.txt","w+");
  for (ii=1; ii<=LIN; ii++)
   for (jj=1; jj<=COL; jj++)
   if (A[ii][jj]!=0)
   fprintf(arq,"%d %d %d\n",ii,jj,A[ii][jj]);
fclose(arq);
}

//---------------------------------------------------------------------

int main()
{
int ii,jj,parar;
float step=0;

srand(time(NULL));

step=0;
parar=0;

for(ii=1;ii<=4;ii++) pp[ii]=0;
for (ii=1; ii<=LIN; ii++) for (jj=1; jj<=COL; jj++) A[ii][jj]=0;

A[LIN/2+1][COL/2+1]=1; //particula no meio da matriz
np();

while (parar!=1)
{
//if(step%10000==0)printf("%f\n",step);//Se necessario verificar loop infinito

if(pp[1]==1 && pp[2]==1 && pp[3]==1 && pp[4]==1)//Quando percolar
  {
  parar=1;  
  printf("ACABOU - TOTAL= %f steps\n",step);
  salva();
  }
else
  {
  step=step+0.001;
  mov();
  }

}


}
//FIM

Scripts recomendados

Números Pseudos Aleatórios

Escritor de números

Calcular dia da semana a partir de uma data sugerida

Conversor decimal para binario para GNU/LINUX

Media de N numeros


  

Comentários
[1] Comentário enviado por dibetao em 20/09/2006 - 18:37h

Disponibilizei uma figura resultante deste programa em:
http://dibetao.googlepages.com/fractal
Cconfira.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts