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
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