quarta-feira, 22 de setembro de 2010

L-System em Python

Nesse fim de semana fiz mais um dos meus projetos. Estava já a um tempo vendo sobre fractais, sempre fui fascinado pela teoria do caos, e não precisou muito para que os fractais chamassem minha atenção. Fiz um gerador do fractal de mandelbrot. E quando vi sobre L-System achei incrível. Para que não sabe L-System é uma gramática formal, que com ela é possível criar algoritmos para arvores até para um floco de neve. L-System funciona assim:


  1.  É passado o estado inicial, por exemplo uma string "F" que chamaremos de string_inicial.
  2. Logo depois são criadas regras, por exemplo, substituir onde há "F" na string_inicial por "F+F-F-F+F".
  3. Fazemos o processo de substituição por N vezes. Perceba que quanto maior N mais complexo vai ser nossa string.
  4. Depois de gerar a string final após as N substituições, essa string vai ser interpretada caracter por caracter e gerará uma imagem. O processo mais comum é que "F" seja uma linha reta, "+" seja somar um anglo determinado ao ângulo da última reta para a próxima reta - Por exemplo, a última reta era horizontal (90°) e o ângulo determinado pra esse sistema é 30°, a próxima reta terá um anglo de 120° - e "-" subtrai o ângulo determinado do ângulo da reta anterior.
Esse é basicamente o L-System, temos também caracteres como "[" e "]", onde "[" salva os valores atuais de anglo e localização da última linha e "]" retoma esses valores para a próxima linha.
Segue alguns exemplos:
Triângulo de Sierpinski:
  • Início = "F"
  • Regra = "F" => "F+F-F-F+F"
  • Ângulos das curvas = 240° 
  • Complexidade = 6






















Variante da Curva de Koch:
  • Início = "F"
  • Regra = "F" => "F+F-F-F+F"
  • Ângulo das curvas = 270°
  • Complexidade = 6




Planta Fractal:
  • Início = "F"
  • Regra = "F" => "FF-[-F+F+F]+[+F-F-F]"
  • Ângulo das curvas = 22.5°
  • Complexidade = 4

Obs.:As cores das linhas veriam de acordo com o ângulo que elas formam com a base da figura.

As duas primeira imagens tem o mesmo início e a mesma regra, o que muda é somente o ângulo, gerando uma imagem bem diferente. A complexidade dos sistemas é quantas substituições consecutivas elas geram. Um exemplo de como o tamanho do sistema cresce de forma exponencial em relação a complexidade está aqui:
  • Complexidade 1 => "F"
  • Complexidade 2 => "F+F-F-F+F"
  • Complexidade 3 => "F+F-F-F+F+F+F-F-F+F-F+F-F-F+F-F+F-F-F+F+F+F-F-F+F"
  • Complexidade 4 => "F+F-F-F+F+F+F-F-F+F-F+F-F-F+F-F+F-F-F+F+F+F-F-F+F+F+F-F-F+F+F+F-F-F+F-F+F-F-F+F-F+F-F-F+F+F+F-F-F+F-F+F-F-F+F+F+F-F-F+F-F+F-F-F+F-F+F-F-F+F+F+F-F-F+F-F+F-F-F+F+F+F-F-F+F-F+F-F-F+F-F+F-F-F+F+F+F-F-F+F+F+F-F-F+F+F+F-F-F+F-F+F-F-F+F-F+F-F-F+F+F+F-F-F+F"
Para quem estiver interessado, segue o script em python: script L-System(Necessita da biblioteca PyGame).


No próximo post (provavelmente no sábado), postarei novidades usando o L-System.

terça-feira, 21 de setembro de 2010

Big Bang

Esse é o meu primeiro post aqui no MZ Experiments e aqui falarei o que esse blog será e o motivo de ele existir.
Meu nome é Mateus Zitelli (Dai o nome MZ Experimets), tenho 16 anos, sou estudante de ensino médio. Sempre fui muito curioso com tudo, então com o tempo desenvolvi muitos Hobbies, como por exemplo: Estudar Astronomia, Física (matérias extra curriculares, sem ligação com a escola), matemática (também extra curricular) e como meu principal Hobbie a programação. Venho ao longo de 2 anos frequentemente estudando linguagens e fazendo programinhas, simplesmente peguei o tempo que usava pra jogar MMORPG's para programar. Sinceramente acho muito mais divertido e sem dúvida mais produtivo.

Esse blog será meu mural, onde colocarei minhas idéias, meus programas, abertos a todos. E espero que receba críticas, elogios e principalmente conheça pessoas novas com os mesmos interesses.

Imagem do meu ultimo projetinho de fim
de semana (Tema do próximo post).