Hola!
Por favor necesito ayuda urgente.
Soy una principiante en la programación.
Tengo un trabajo de la facu que me esta dando dolores de cabeza hace semanas, porque no el encuentro donde esta fallando mi código.
Tengo que realizar un programa que dibujo la alfombra de sierpinski utilizando recursividad,
una introducción al tema lo vana a encontrar aqui:
[url]http://es.wikipedia.org/wiki/Alfombra_de_Sierpinski[url]
La construcción de la alfombra de Sierpinski se define de forma recursiva:
1º) Comenzamos con un cuadrado.
2º)El cuadrado se corta en 9 cuadrados congruentes, y eliminamos el cuadrado central.
3º) El paso anterior vuelve a aplicarse recursivamente a cada uno de los 8 cuadrados restantes.
El programa que cree posee una función que dibuja el cuadrado y lo divide en 9 cuadrados, y esta función se llama a sí misma 8 veces.
El problema es que la llamada a la función se queda en la 1º de las 8, por ello es que no se crea la alfombra en su totalidad.
Es decir que para el nivel de recursividad igual o mayor a 2, se crea un cuadrado que es divido en 9 cuadrados. Y cada uno de estos cuadrados deben ser divididos en 9 cuadrados a su vez y asi sucesivamente (dependiendo el nivel de recursividad que determine). Pero nose porque la división de cuadrados solo se aplica en el 1º de los 9 cuadrados.
Se entiende??
Desde ya agradezco cualquier ayuda que puedan brindarme.
Aca esta el código principal de mi programa, la llamada que inicia esta clase se realiza desde otro formulario donde se define el nivel de recursividad, (N) que varia desde 0 a 10.
Por favor necesito ayuda urgente.
Soy una principiante en la programación.
Tengo un trabajo de la facu que me esta dando dolores de cabeza hace semanas, porque no el encuentro donde esta fallando mi código.
Tengo que realizar un programa que dibujo la alfombra de sierpinski utilizando recursividad,
una introducción al tema lo vana a encontrar aqui:
[url]http://es.wikipedia.org/wiki/Alfombra_de_Sierpinski[url]
La construcción de la alfombra de Sierpinski se define de forma recursiva:
1º) Comenzamos con un cuadrado.
2º)El cuadrado se corta en 9 cuadrados congruentes, y eliminamos el cuadrado central.
3º) El paso anterior vuelve a aplicarse recursivamente a cada uno de los 8 cuadrados restantes.
El programa que cree posee una función que dibuja el cuadrado y lo divide en 9 cuadrados, y esta función se llama a sí misma 8 veces.
El problema es que la llamada a la función se queda en la 1º de las 8, por ello es que no se crea la alfombra en su totalidad.
Es decir que para el nivel de recursividad igual o mayor a 2, se crea un cuadrado que es divido en 9 cuadrados. Y cada uno de estos cuadrados deben ser divididos en 9 cuadrados a su vez y asi sucesivamente (dependiendo el nivel de recursividad que determine). Pero nose porque la división de cuadrados solo se aplica en el 1º de los 9 cuadrados.
Se entiende??
Desde ya agradezco cualquier ayuda que puedan brindarme.
Aca esta el código principal de mi programa, la llamada que inicia esta clase se realiza desde otro formulario donde se define el nivel de recursividad, (N) que varia desde 0 a 10.
Código (vbnet) [Seleccionar]
Public Class Alfombra
Inherits System.Windows.Forms.Form
Public nIteracion As Integer
Public x, y, ancho, alto As Double
Public Sub iniciar_Alfombra(ByRef n As Integer, ByRef x As Double, ByRef y As Double, ByRef ancho As Double, ByRef alto As Double)
If n = 0 Then
dibujar_Rectangulo(x, y, ancho, alto)
Else
calcular_Rectangulo(n, x, y, ancho, alto)
End If
End Sub
Public Sub calcular_Rectangulo(ByRef n As Integer, ByRef x As Double, ByRef y As Double, ByRef ancho As Double, ByRef alto As Double)
Dim x1, x2, x3, x4, x5, x6, x7, x8 As Double
Dim y1, y2, y3, y4, y5, y6, y7, y8 As Double
Dim nuevo_Ancho, nuevo_Alto As Double
If n > 0 Then
n = n - 1
nuevo_Ancho = ancho / 3 '1/3 del ancho
nuevo_Alto = alto / 3 '1/3 del alto
' Primer rectangulo. Punto origen
dibujar_Rectangulo(x, y, nuevo_Ancho, nuevo_Alto)
' Segundo rectangulo
x1 = x + nuevo_Ancho
y1 = y
dibujar_Rectangulo(x1, y1, nuevo_Ancho, nuevo_Alto)
' Tercer rectangulo
x2 = x + (2 * nuevo_Ancho)
y2 = y
dibujar_Rectangulo(x2, y2, nuevo_Ancho, nuevo_Alto)
' Cuarto rectangulo
x3 = x
y3 = y + nuevo_Alto
dibujar_Rectangulo(x3, y3, nuevo_Ancho, nuevo_Alto)
' Quinto rectangulo: rectangulo del centro
'x4 = x + nuevo_Ancho
'y4 = y + nuevo_Alto
'Sierpinski.pbDibujo.CreateGraphics.DrawRectangle(Pens.White, CInt(x4), CInt(y4), CInt(nuevo_Ancho), CInt(nuevo_Alto))
'Sierpinski.pbDibujo.CreateGraphics.FillRectangle(Brushes.White, CInt(x4), CInt(y4), CInt(nuevo_Ancho), CInt(nuevo_Alto))
' Sexto rectangulo
x5 = x + (2 * nuevo_Ancho)
y5 = y + nuevo_Alto
dibujar_Rectangulo(x5, y5, nuevo_Ancho, nuevo_Alto)
' Septimo rectangulo
x6 = x
y6 = y + (2 * nuevo_Alto)
dibujar_Rectangulo(x6, y6, nuevo_Ancho, nuevo_Alto)
' Octavo rectangulo
x7 = x + nuevo_Ancho
y7 = y + (2 * nuevo_Alto)
dibujar_Rectangulo(x7, y7, nuevo_Ancho, nuevo_Alto)
' Noveno rectangulo
x8 = x + (2 * nuevo_Ancho)
y8 = y + (2 * nuevo_Alto)
dibujar_Rectangulo(x8, y8, nuevo_Ancho, nuevo_Alto)
' Se llama a sí mismo 8 veces
Call calcular_Rectangulo(n, x, y, nuevo_Ancho, nuevo_Alto)
Call calcular_Rectangulo(n, x1, y1, nuevo_Ancho, nuevo_Alto)
Call calcular_Rectangulo(n, x2, y2, nuevo_Ancho, nuevo_Alto)
Call calcular_Rectangulo(n, x3, y3, nuevo_Ancho, nuevo_Alto)
Call calcular_Rectangulo(n, x5, y5, nuevo_Ancho, nuevo_Alto)
Call calcular_Rectangulo(n, x6, y6, nuevo_Ancho, nuevo_Alto)
Call calcular_Rectangulo(n, x7, y7, nuevo_Ancho, nuevo_Alto)
Call calcular_Rectangulo(n, x8, y8, nuevo_Ancho, nuevo_Alto)
End If
End Sub
Public Sub dibujar_Rectangulo(ByVal x As Double, ByVal y As Double, ByVal ancho As Double, ByVal alto As Double)
Sierpinski.pbDibujo.CreateGraphics.DrawRectangle(Pens.CornflowerBlue, CInt(x), CInt(y), CInt(ancho), CInt(alto))
'Sierpinski.pbDibujo.CreateGraphics.FillRectangle(Brushes.CornflowerBlue, CInt(x), CInt(y), CInt(ancho), CInt(alto))
End Sub
End Class