Tortuga Python: Dibuja círculos concéntricos usando el método circle ()

5

Le estaba mostrando a un nieto patrones dibujados con el módulo Turtle de Python, y pidió ver círculos concéntricos. Pensé que sería más rápido usar las tortugas circle()para dibujarlas que escribir mi propio código para generar un círculo. ¡Decir ah! Estoy atascado. Veo que el círculo producido comienza su circunferencia en la ubicación actual de la tortuga y su dirección de dibujo depende de la dirección de movimiento actual de la tortuga, pero no puedo entender qué debo hacer para obtener círculos concéntricos. En este punto, no estoy interesado en una forma eficiente de producir círculos concéntricos: quiero ver qué tengo que hacer para que funcione de esta manera:

def turtle_pos(art,posxy,lift):
    if lift:
        art.penup()
        art.setposition(posxy)
        art.pendown()

def drawit(tshape,tcolor,pen_color,pen_thick,scolor,radius,mv):
    window=turtle.Screen() #Request a screen
    window.bgcolor(scolor) #Set its color

    #...code that defines the turtle trl

    for j in range(1,11):
        turtle_pos(trl,[trl.xcor()+mv,trl.ycor()-mv],1)
        trl.circle(j*radius)

drawit("turtle","purple","green",4,"black",20,30)
2
  • 4
    ¿Podrías publicar tu código actual? 8 de julio de 2014 a las 15:51
  • def turtle_pos (art, posxy, lift): if lift: art.penup () art.setposition (posxy) art.pendown () def drawit (tshape, tcolor, pen_color, pen_thick, scolor, radius, mv): ventana = tortuga .Screen () #Request a screen window.bgcolor (scolor) #Establezca su color #… código que define la tortuga trl para j en el rango (1,11): turtle_pos (trl, [trl.xcor () + mv, trl .ycor () - mv], 1) trl.circle (j * radio) drawit ("tortuga", "púrpura", "verde", 4, "negro", 20,30) - lo siento, no sé cómo formatearlo.
    thelma
    8 de julio de 2014 a las 23:01
5

Puedes hacerlo así:

import turtle

turtle.penup()
for i in range(1, 500, 50):
    turtle.right(90)    # Face South
    turtle.forward(i)   # Move one radius
    turtle.right(270)   # Back to start heading
    turtle.pendown()    # Put the pen back down
    turtle.circle(i)    # Draw a circle
    turtle.penup()      # Pen up while we go home
    turtle.home()       # Head back to the start pos

Lo que crea la imagen a continuación:

ingrese la descripción de la imagen aquí

Básicamente, mueve la tortuga hacia abajo una longitud de radio para mantener el punto central de todos los círculos en el mismo lugar.

2

De la documentación:

The center is radius units left of the turtle.

Entonces, donde sea que esté la tortuga cuando comiences a dibujar un círculo, el centro de ese círculo está a cierta distancia a la derecha. Después de cada círculo, simplemente mueva hacia la izquierda o hacia la derecha algunos píxeles y dibuje otro círculo cuyo radio se ajusta a la distancia que se movió la tortuga. Por ejemplo, si dibuja un círculo con un radio de 50 píxeles y luego se mueve hacia la derecha 10 píxeles, dibujaría otro círculo con un radio de 40 y los dos círculos deberían ser concéntricos.

1
  • 1
    Bajo la tortuga Python actual, esta respuesta ya no parece ser válida. La documentación citada sigue siendo la misma, pero es falsa ya que la ubicación del centro en relación con la tortuga depende del rumbo de la tortuga. Con el título inicial predeterminado, la cita es simplemente incorrecta. Al cambiar al modo 'logo', sería válido solo para el encabezado inicial. Pero su ejemplo específico actualmente es incorrecto, ya que tendría que moverse en la dirección opuesta para hacer que los círculos sean concéntricos. Y no funcionaría para ningún otro título.
    cdlane
    5 de junio de 2018 a las 6:23
0

I am not at this point interested in an efficient way of producing concentric circles: I want to see what I have to do to get this way to work

Para abordar la pregunta del OP, el cambio a su código original para que funcione es trivial:

turtle_pos(trl, [trl.xcor() + mv, trl.ycor() - mv], 1)
trl.circle(j * radius)

se convierte en:

turtle_pos(trl, [trl.xcor(), trl.ycor() - mv], 1)
trl.circle(j * mv + radius)

El código completo con la corrección anterior y algunos cambios de estilo:

import turtle

def turtle_pos(art, posxy, lift):
    if lift:
        art.penup()
        art.setposition(posxy)
        art.pendown()

def drawit(tshape, tcolor, pen_color, pen_thick, scolor, radius, mv):
    window = turtle.Screen()  # Request a screen
    window.bgcolor(scolor)  # Set its color

    #...code that defines the turtle trl
    trl = turtle.Turtle(tshape)
    trl.pencolor(pen_color)
    trl.fillcolor(tcolor)  # not filling but makes body of turtle this color
    trl.width(pen_thick)

    for j in range(10):
        turtle_pos(trl, (trl.xcor(), trl.ycor() - mv), True)
        trl.circle(j * mv + radius)

    window.mainloop()

drawit("turtle", "purple", "green", 4, "black", 20, 30)

ingrese la descripción de la imagen aquí

-1

Así que ahora te estoy dando el código exacto que puede dibujar círculos concéntricos.

import turtle
t=turtle.Turtle()
for i in range(5):
  t.circle(i*10)
  t.penup()
  t.setposition(0,-(i*10))
  t.pendown()
turtle.done()