Introducción al dibujo gráfico en Python con el módulo Turtle

Cuarto dibujo

¿Sabéis lo que son los poligonos regulares? Son polígonos cuyos lados y ángulos interiores son iguales entre sí. La magia que tienen es que cuantos más lados tienen más se parecen a un círculo, y de hecho dícese que un círculo perfecto sería un polígono de infinitos lados. De ahí que en geometría se trabaje tanto con límites.

Bueno, sea como sea creo que es interesante adaptar nuestra función para que no sólo dibuje cuadrados y rectángulos, sino cualquier tipo de polígono regular.

Para ello le pasaremos un parámetro extra con el número de costados que queremos dibujar, y en lugar de un ancho y una altura simplemente utilizaremos un radio. Ese radio nos servirá para crear la circunferencia circunscrita que será la base del polígono regular, que por cierto, podemos crear utilizando la acción circle de la tortuga, que toma precisamente ese radio. Fijaros:

def poligono_regular(px, py, radio, lados):
    t.penup()
    t.goto(px, py - radio)  
    t.pendown()
    t.circle(radio)

poligono_regular(0, 0, 100, 7)

Ahora tenemos que calcular los grados que debemos girar y trazar nuestras líneas. En el caso del cuadrado era muy fácil, pues sabemos que hay que girar 90 grados. ¿Pero cómo lo haremos aquí? Bueno, sabemos que 90º es una cuarta parte de 360, así que extrapolando eso podemos calcular el ángulo dividiendo 360 entre el número de lados del polígono regular: angulo = 360 / lados print(angulo)

Sabiendo el ángulo, podemos posicionarnos en el centro de nuestro círculo y trazar líneas hacia fuera con la longitud del radio tantas veces como lados tenemos mientras vamos incrementando el ángulo que hemos conseguido. Fijaros:

    angulo = 360 / lados
    print(angulo)
    
    for i in range(lados):
        t.penup()           # Nos posicionamos al centro
        t.goto(px, py)  
        t.pendown()
        
        t.seth(angulo*i+1)  # Trazamos radios hacia afuera
        t.forward(radio)
        print( t.pos() )

Woo! Que bonito quesito nos ha quedado eh? Pero lo más importante es que tenemos todas las coordenadas de los vértices de nuestro polígono:

Podríamos almacenarlas en una lista:

    vertices = []  # La declaramos
    
    for i in range(lados):
        t.penup()          
        t.goto(px, py)  
        t.pendown()
        
        t.seth(angulo*i+1) 
        t.forward(radio)
        vertices.append(t.pos())  # Los vamos añadiendo

Y ahora viene la magia. Vamos a hacer que la tortuga trace líneas entre esos vértices yendo de unos a otros utilizando la acción goto:

    # Nos posicionamos en la coordenada del último vértice
    t.penup()
    t.goto(vertices[-1])  
    t.pendown()
    
    # Y hacemos que la tortuga se mueva a cada uno de ellos
    for v in vertices:
        t.goto(v)  

¡Siiii y ahí lo tenemos!

Sólo deberíamos hacer algunos ajustes a nuestro programa para que la tortuga sólo dibuje los costados:

def poligono_regular(px, py, radio, lados):
    
    # Desactivamos el trazo
    t.penup()
    
    # Calculamos el ángulo
    angulo = 360 / lados
    print(angulo)
    
    # Creamos la lista para almacenar los vértices
    vertices = []
    
    for i in range(lados):
        t.goto(px, py) 
        t.seth(angulo*i+1)
        t.forward(radio)
        vertices.append(t.pos()) 
        
    # Nos posicionamos en la coordenada del último vértice
    t.goto(vertices[-1])  
    
    # Empezamos a dibujar
    t.pendown()
    
    # Y hacemos que la tortuga se mueva a cada uno de ellos
    for v in vertices:
        t.goto(v) 

¡Genial!

Evidentemente hay otras formas de hacerlo, pero lo interesante es que hemos conseguido que la tortuga trabaje por nosotros y busque todos los vértices para trazar el polígono.

Lo bueno es que podemos juguetear un montón utilizando bucles por ejemplo:

# Hacemos que la tortuga se mueva muy rápido y dibujamos
# los polígonos regulares de 3 a 20 costados
t.speed(200)
for n in range(3, 21):
    poligono_regular(0, 0, n*10, n)

Sin duda nuestra tortuga está hecha toda una artista.

Por cierto, ¿os habéis fijado que cuantos más costados, más se parece a una redonda? Es lo que os decía al principio.