Mudanças entre as edições de "Simulação de Micélio de Fungo"

De Física Computacional
Ir para: navegação, pesquisa
(Crescimento)
(Implementação)
Linha 34: Linha 34:
 
== Implementação ==
 
== Implementação ==
  
 +
<source lang="python">
 +
</source>
  
 
===Crescimento===
 
===Crescimento===
Linha 71: Linha 73:
 
<source lang="python">
 
<source lang="python">
 
   
 
   
def divisao (x,y):
+
x = x2 - x1
 
+
  y = y2 - y1
 +
 
 
   theta= np.arctan(y/x)
 
   theta= np.arctan(y/x)
  
 
   if (x<0) :
 
   if (x<0) :
     theta= theta+ math.pi
+
     theta= theta + math.pi
  
   angulodivisao= random.random()*math.pi/2 #angulo para divisão de no máximo 90°
+
   angulodivisao= random.normalvariate(0, math.pi/4)
  
 
   angulo1= theta- angulodivisao/2
 
   angulo1= theta- angulodivisao/2
 
   angulo2= theta+ angulodivisao/2
 
   angulo2= theta+ angulodivisao/2
  
   addx1 = r * math.cos(angulo1)
+
   addx1 = r * math.cos(angulo1) * 1/2
   addy1 = r * math.sin(angulo1)
+
   addy1 = r * math.sin(angulo1) * 1/2
  
   addx2= r * math.cos(angulo2)
+
   addx2= r * math.cos(angulo2) * 1/2
   addy2= r * math.sin(angulo2)
+
   addy2= r * math.sin(angulo2) * 1/2
 
    
 
    
   Ax = x + addx1
+
   Ax = x2 + addx1
   Ay = y + addy1
+
   Ay = y2 + addy1
 
    
 
    
   Bx = x + addx2
+
   Bx = x2 + addx2
   By= y +addy2
+
   By= y2 +addy2
  
 
   return (Ax,Ay,Bx,By)
 
   return (Ax,Ay,Bx,By)
 +
 
</source>
 
</source>
  
Intersecção de linhas:
+
 
 +
===Intersecção de linhas===
 +
 
 +
<source lang="python">
 +
 
 +
def check_anastomose(eventos,xf,yf,xi,yi):
 +
  flag = True
 +
  for evento in eventos:
 +
    if (xi == evento[2] and yi == evento[3]):
 +
      continue
 +
    if (xi == evento[0] and yi == evento[1]):
 +
      continue
 +
    D = (evento[3]-evento[1])*(xf-xi) - (evento[2]-evento[0])*(yf-yi)
 +
    uA = ((evento[2]-evento[0])*(yi-evento[1]) - (evento[3]-evento[1])*(xi-evento[0]))/D
 +
    uB = ((xf-xi)*(yi-evento[1])-(yf-yi)*(xi-evento[0]))/D
 +
    flag = True
 +
    if (0<=uA<=1) and (0<=uB<=1):
 +
      flag = False
 +
    if not flag:
 +
      #print("Intersection!")
 +
      #print("X1:",xi," Y1:",yi, " X2:",xf," Y2:",yf)
 +
      #print("X3:",evento[0]," Y3:",evento[1]," X4:",evento[2]," Y4:",evento[3])
 +
      xf, yf = get_intersection_point(uA,xf,yf,xi,yi)
 +
      break
 +
  return xf,yf, flag
 +
 
 +
 
 +
</source>
 +
 
 +
Após se encontrar usa a func:
 +
 
 +
<source lang="python">
 +
 
 +
def get_intersection_point(uA,xf,yf,xi,yi):
 +
  xf = xi + (uA * (xf-xi))
 +
  yf = yi + (uA * (yf-yi))
 +
  return xf,yf
 +
 
 +
</source>
  
 
<ref name = Wikipedia> Line to line intersection. Wikipédia. Disponível em: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection </ref>
 
<ref name = Wikipedia> Line to line intersection. Wikipédia. Disponível em: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection </ref>

Edição das 17h00min de 22 de maio de 2021

Grupo: Arthur Dornelles, Bruno Zanette, Gabriel De David e Guilherme Hoss

O objetivo deste trabalho é modelar computacionalmente o desenvolvimento de micélios em fungos com base em mecanismos gerais pré-estabelecidos. O progresso e a complexidade dos modelos cresceram de maneira gradual ao longo do trabalho através de três modelos de crescimento diferentes. O trabalho foi inspirado - principalmente - nos dois primeiros capítulos do artigo de Steven Hopkins [1].

Motivação e Introdução aos Fungos

Figura 1: Representação computacional de um micélio fungoso.
Figura 2: Processos de ramificação de fungos. À esquerda a ramificação dicotômica (Dichotomous) e à direita o processo de ramificação lateral [1].

Fungos estão integrados em grande parte dos ecossistemas do planeta e cumprem importantes funções na manutenção e sobrevivência dos mesmos. De maneira geral, eles produzem enzimas que são responsáveis pela decomposição de matéria orgânica e - portanto - a reciclagem de diversos nutrientes do ambiente ao seu redor [2]. Em muitos casos, fungos formam fusões simbióticas com plantas ou algas e interagem de diferentes maneiras com diferentes organismos vivos. Neste trabalho, todavia, não faremos a análise dessas interações e focaremos no comportamento individual de crescimento de fungos.

Anatomicamente, fungos são compostos por células que se assemelham a tubos microscópicos, denominadas de hifas. Essas hifas então se ramificam e se fundem umas com as outras em um processo chamado de anastomose, formando uma complexa rede chamada de micélio (figura 1).

A criação de novas hifas, em geral, ocorre ao longo do tempo através de dois processos principais: o primeiro, denominado de ramificação dicotômica, consiste na ponta de uma hifa já existente se dividindo ao meio. O segundo processo é chamado de ramificação lateral, no qual, como o nome sugere, formam-se novos ramos e hifas na lateral de uma hifa já existente, como pode ser visto na figura 2.

Tendo em vista o objetivo deste trabalho, é importante também entender o porquê e quando as ramificações citadas acimas ocorrem, para que possamos programá-las em nosso modelo computacional. A ramificação, portanto, é atribuída ao acúmulo de partículas de nutrientes e materiais no ambiente, o que estimula a extensão das hifas dos fungos em sua direção. Dessa maneira, o crescimento e desenvolvimento dos fungos são altamente dependentes e influenciados pela disponibilidade de nutrientes e materiais no ambiente ao seu redor. Apesar desse fato, fungos podem continuar se desenvolvendo até em ambientes com poucos nutrientes, devido ao processo de translocação, no qual os nutrientes previamente absorvidos pelo fungo podem ser transportados internamente, bancando o crescimento do mesmo em locais com deficiência de nutrientes.

Mecanismos Gerais dos Modelos

Crescimento e divisão

Tipicamente uma hifa cresce apicalmente em linha reta com pouca variação em sua orientação, enquanto em algumas espécies de fungo as mudanças o ângulo de crescimento seguem uma distribuição normal.

A distribuição de nutrientes ocorre de maneira discreta, não contínua.

Construção do modelo computacional

Primeiro modelo de Fungo

  • Branching na ponta
  • Computar só os da ponta
  • Crescimento ocorre só com o nutriente que o ponto final está

Segundo modelo de Fungo

  • Junção (anastomosis)

Implementação

Crescimento

def crecimento (x1,y1,x2,y2):
  x = x2 - x1
  y = y2 - y1
 
  theta= np.arctan(y/x)

  
  if (x<0) :
    theta= theta+ math.pi
  
  aleatorio_theta = random.normalvariate(0, math.pi/4) # angulo de 
  
  theta=theta+aleatorio_theta

  addx = r * math.cos(theta)
  addy = r * math.sin(theta)
  

  fx = x2 + addx
  fy = y2 + addy 


  return (fx,fy)

Divisão

x = x2 - x1
  y = y2 - y1
  
  theta= np.arctan(y/x)

  if (x<0) :
    theta= theta + math.pi

  angulodivisao= random.normalvariate(0, math.pi/4) 

  angulo1= theta- angulodivisao/2
  angulo2= theta+ angulodivisao/2

  addx1 = r * math.cos(angulo1) * 1/2
  addy1 = r * math.sin(angulo1) * 1/2

  addx2= r * math.cos(angulo2) * 1/2
  addy2= r * math.sin(angulo2) * 1/2
  
  Ax = x2 + addx1
  Ay = y2 + addy1
  
  Bx = x2 + addx2
  By= y2 +addy2

  return (Ax,Ay,Bx,By)


Intersecção de linhas

def check_anastomose(eventos,xf,yf,xi,yi):
  flag = True
  for evento in eventos:
    if (xi == evento[2] and yi == evento[3]):
      continue
    if (xi == evento[0] and yi == evento[1]):
      continue
    D = (evento[3]-evento[1])*(xf-xi) - (evento[2]-evento[0])*(yf-yi)
    uA = ((evento[2]-evento[0])*(yi-evento[1]) - (evento[3]-evento[1])*(xi-evento[0]))/D
    uB = ((xf-xi)*(yi-evento[1])-(yf-yi)*(xi-evento[0]))/D
    flag = True
    if (0<=uA<=1) and (0<=uB<=1):
      flag = False
    if not flag:
      #print("Intersection!")
      #print("X1:",xi," Y1:",yi, " X2:",xf," Y2:",yf)
      #print("X3:",evento[0]," Y3:",evento[1]," X4:",evento[2]," Y4:",evento[3])
      xf, yf = get_intersection_point(uA,xf,yf,xi,yi)
      break
  return xf,yf, flag

Após se encontrar usa a func:

def get_intersection_point(uA,xf,yf,xi,yi):
  xf = xi + (uA * (xf-xi))
  yf = yi + (uA * (yf-yi))
  return xf,yf

[3] [3]

Referências

[1]HOPKINS, Steven. A Hybrid Mathematical Model of Fungal Mycelia: Tropisms, Polarised Growth and Application to Colony Competition, tese de doutorado, 2011.(https://core.ac.uk/download/pdf/6117416.pdf)

[2]DA SILVA, Priscila. Reino Fungi. InfoEscola (2018). Disponível em: https://www.infoescola.com/biologia/reino-fungi. Acesso em: 15 de Maio de 2021.

[3] Line to line intersection. Wikipédia. Disponível em: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection

  1. 1,0 1,1 HOPKINS, Steven. A Hybrid Mathematical Model of Fungal Mycelia: Tropisms, Polarised Growth and Application to Colony Competition, tese de doutorado, 2011.(https://core.ac.uk/download/pdf/6117416.pdf)
  2. DA SILVA, Priscila. Reino Fungi. InfoEscola (2018). Disponível em: https://www.infoescola.com/biologia/reino-fungi. Acesso em: 15 de Maio de 2021.
  3. Line to line intersection. Wikipédia. Disponível em: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection