Spanish OT: Copo de nieve de Koch

edgar_ortiz

Active Member
Licensed User
Longtime User
Perdon por "postear" algo "irrelevante", pero mi hijo pequeño que está estudiando una ingenieria en electronica me dijo: "Vos podes hacer un programa para diagramar un copo de Nieve de Kock" y por supuesto le dije: "NO sé que es eso pero si me lo explicas, claro que lo puedo hacer" y ese fué MI ERROR.

Que es el Copo de nieve de Kock:

Ya logré determinar los "segmentos"

Calcular los Segmentos existentes:
Sub Calcular_Segmentos
    Dim lcSize As Int = 0
    Dim lcNivelAnte As Int = 0
    '
    For i = 1 To etVeces.Text
        lcSize    = Lista_Copos.Size -1
        For x = 0 To lcSize
            Dim lcCopo As T_Segmento
            lcCopo.Initialize
            lcCopo    = Lista_Copos.Get(x)
            lcNivelAnte    = i-1
            If lcCopo.Nivel = lcNivelAnte Then
                Copo(i, Lista_Copos.Get(x))
            End If
        Next
    Next
    '
    ' Solo se utilizan los segmentos de la ultima Iteraccion
    For i = 0 To Lista_Copos.Size-1
        Dim lcCopo As T_Segmento
        lcCopo.Initialize
        lcCopo    = Lista_Copos.Get(i)
        If lcCopo.Nivel = etVeces.Text Then
            Diagrama.Add(lcCopo)
        End If
    Next
    '
End Sub


Sub Copo (ParIterraccion As Int, ParSegmento As T_Segmento)
    Dim lcLargo    As Long
    Dim Copo1 As T_Segmento
    Dim Copo2 As T_Segmento
    Dim Copo3 As T_Segmento
    Dim Copob1 As T_Segmento
    Dim Copob2 As T_Segmento
    Dim Copob3 As T_Segmento
    '
    lcLargo        = ParSegmento.Largo / 3
    '
    ' Se calcula el primer segmento
    Copo1.Initialize
    Copo1.Nivel        = ParIterraccion
    Copo1.Tipo        = "Linea"
    Copo1.Inicio_X    = 0
    Copo1.Inicio_Y    = 0
    Copo1.Largo        = lcLargo
    Copo1.Final_X    = 0
    Copo1.Final_Y    = 0
    Lista_Copos.Add(Copo1)
    '
    ' Se calcula el segundo segmento
    Copo2.Initialize
    Copo2.Nivel        = ParIterraccion
    Copo2.Tipo        = "Triangulo"
    Copo2.Inicio_X    = 0
    Copo2.Inicio_Y    = 0
    Copo2.Largo        = lcLargo
    Copo2.Final_X    = 0
    Copo2.Final_Y    = 0
    Lista_Copos.Add(Copo2)
    '
    ' Se calcula el tercer segmento
    Copo3.Initialize
    Copo3.Nivel        = ParIterraccion
    Copo3.Tipo        = "Linea"
    Copo3.Inicio_X    = 0
    Copo3.Inicio_Y    = 0
    Copo3.Largo        = lcLargo
    Copo3.Final_X    = 0
    Copo3.Final_Y    = 0
    Lista_Copos.Add(Copo3)
    '
    If ParSegmento.Tipo = "Triangulo" Then
        '
        ' Se procesa el otro segmento del triangulo (lado "B")
        '
        ' Se calcula el primer segmento
        Copob1.Initialize
        Copob1.Nivel    = ParIterraccion
        Copob1.Tipo        = "Linea"
        Copob1.Inicio_X    = 0
        Copob1.Inicio_Y    = 0
        Copob1.Largo    = lcLargo
        Copob1.Final_X    = 0
        Copob1.Final_Y    = 0
        Lista_Copos.Add(Copob1)
        '
        ' Se calcula el segundo segmento
        Copob2.Initialize
        Copob2.Nivel    = ParIterraccion
        Copob2.Tipo        = "Triangulo"
        Copob2.Inicio_X    = 0
        Copob2.Inicio_Y    = 0
        Copob2.Largo    = lcLargo
        Copob2.Final_X    = 0
        Copob2.Final_Y    = 0
        Lista_Copos.Add(Copob2)
        '
        ' Se calcula el tercer segmento
        Copob3.Initialize
        Copob3.Nivel    = ParIterraccion
        Copob3.Tipo        = "Linea"
        Copob3.Inicio_X    = 0
        Copob3.Inicio_Y    = 0
        Copob3.Largo    = lcLargo
        Copob3.Final_X    = 0
        Copob3.Final_Y    = 0
        Lista_Copos.Add(Copob3)
    End If
End Sub

Pero NO logro posicionarlos en el plano cartesiano para así poder dibujarlos.

SI alguien NO tiene nada que hacer o si se quiere "divertir un rato", agradezco sus comentarios.

Saludos,

Edgar

P.D.:
Me llama mucho la atención este concepto (aunque AUN NO lo entiendo)
Representación como sistema Lindenmayer
La curva de Koch se puede expresar en el sistema Lindenmayer

Alfabeto : F
Constantes : +, −
Axioma : F++F++F
Reglas de producción:
F → F−F++F−F
 

josejad

Expert
Licensed User
Longtime User
Hola Edgard. Conocia ese tipo de figura porque lei algo sobre ello una vez, y creo que se aplicaba a las antenas de los móviles o algo asi.
No he intentado hacerlo, pero al ver lo de Lindenmayer he reocrdado la libreria B4XTurtle de Erel para enseñar programacion, y algo parecido que podrias adaptar

saludos,
 

edgar_ortiz

Active Member
Licensed User
Longtime User
Hola Edgard. Conocia ese tipo de figura porque lei algo sobre ello una vez, y creo que se aplicaba a las antenas de los móviles o algo asi.
No he intentado hacerlo, pero al ver lo de Lindenmayer he reocrdado la libreria B4XTurtle de Erel para enseñar programacion, y algo parecido que podrias adaptar

saludos,

José,

Muchas Gracias por tu tiempo, ahí se puede dibujar muy fácil (en lo personal siempre he preferido el razonamiento lógico al razonamiento matematico), pero no obtengo las coordenadas cartesianas.

Saludos,

Edgar
 
Top