J'écris du code pour dessiner des carrés le long de la circonférence d'un cercle. J'essaie d'aligner correctement les carrés, pas de tourner arbitrairement. Cependant, rien ne semble fonctionner. Comment corriger ce code? J'ai essayé plusieurs méthodes, mais c'est ce que je pourrais proposer. J'ai également essayé une méthode alternative dans laquelle aucun centre n'est défini; en d'autres termes, nous commençons à dessiner le cercle à partir de la circonférence (et l'alignement y était bon). Cependant, pour la partie suivante de la question, où nous devons dessiner des cercles concentriques, ne pas avoir de centre pose problème.

t.speed(0)
t.width(3)
turtle.bgcolor("grey")

def drawSquare(t, size,color):
    for i in range (0,4):
        t.forward(size)
        t.right(90)


def drawCircle(t,size, n):
    t.penup()
    t.setpos(0,0)
    t.dot(4)
    t.right(90)
    t.goto(t.pos()+(0,10))
    t.penup()
    angle=360/n

    for i in range(n):
        current=i
        t.penup()
        t.setpos(0,0)
        t.penup()
        t.forward(50)
        t.left(angle)
        t.pendown()
        parity= (current) % 2 
        print (parity)
    
        if parity == 0 : 
            color=t.color("white")
            size=30
            drawSquare(t, size,color)
            t.penup()
            t.forward(30)
            t.pendown()
        else:
            color=t.color("black")
            size=30
            drawSquare(t, size,color)
            t.penup()
            t.forward(30)
            t.pendown()
            
size=30
n=10
drawCircle(t,size,n)
turtle.done()
main()
0
user12624554 18 oct. 2020 à 03:56

2 réponses

Meilleure réponse

Bien que je ne sois pas sûr à 100% de la façon dont les carrés doivent s'aligner (vous pouvez décommenter une rotation de 45 degrés pour basculer entre deux approches dans le code ci-dessous), il existe un schéma général qui semble vous mettre dans le bon sens. L'idée est de localiser chacun des points n dans la circonférence du cercle comme suit:

for i in range(n):
    angle = 360 / n * i
    x = cos(radians(angle)) * r
    y = sin(radians(angle)) * r
    t.setpos(x, y)

Pour chaque point, commencez par faire face à l'origine:

t.setheading(t.towards(0, 0))

Nous sommes maintenant sur le point d'exécuter votre routine de dessin carré pour un point, mais avant cela, la tortue doit être placée de manière à dessiner la boîte autour de l'emplacement actuel plutôt que d'utiliser l'emplacement actuel comme coin. Ceci peut être réalisé en s'éloignant du centre de la moitié de la distance du côté carré, puis en effectuant un mouvement vers la gauche de la même distance et en pointant à nouveau vers l'origine.

t.backward(size / 2)
t.left(90)
t.forward(size / 2)
t.right(90)

J'ai ajouté le rayon comme paramètre en plus de la taille de la boîte pour la possibilité de réglage. Center x / y ne serait pas non plus un mauvais ajout, mais semble prématuré pour la tâche à accomplir.

Voici le code complet:

import turtle
from math import cos, radians, sin

def draw_square(t, size):
    for _ in range(4):
        t.forward(size)
        t.right(90)

def draw_squares_in_circle(t, r, size, n, colors=["black", "white"]):
    for i in range(n):
        t.color(colors[i%len(colors)])
        angle = 360 / n * i
        x = cos(radians(angle)) * r
        y = sin(radians(angle)) * r
        t.setpos(x, y)
        t.setheading(t.towards(0, 0))
        t.dot(5)
        #t.left(45) # optionally rotate the square 45 degrees
        t.backward(size / 2)
        t.left(90)
        t.forward(size / 2)
        t.right(90)
        t.pendown()
        draw_square(t, size)
        t.penup()

if __name__ == "__main__":
    turtle.bgcolor("grey")
    t = turtle.Turtle()
    t.screen.setup(500, 500)
    t.speed(1)
    t.width(3)
    t.dot(4)
    t.penup()
    draw_squares_in_circle(t, 88, 40, 10)
    turtle.exitonclick()
1
ggorlen 18 oct. 2020 à 03:19

Je pense que nous pouvons le faire avec moins d'effort que votre solution ou celle de @ ggorlen en utilisant la méthode circle() de la tortue, non pas pour dessiner un cercle mais plutôt pour se déplacer dans un chemin circulaire. Nous contrôlons cela en utilisant ses arguments extent et sides:

from turtle import Screen, Turtle
from math import pi, sin

COLORS = ['black', 'white']

def drawSquare(t, size, color):
    t.color(color)

    t.pendown()

    for _ in range(4):
        t.right(pi / 2)
        t.forward(size)

    t.penup()

def drawCircle(t, size, sides):
    angle = pi / sides
    radius = size / (2 * sin(angle))

    t.penup()
    t.dot()

    t.right(pi / 2)  # center circle() on current location
    t.forward(radius)
    t.left(pi / 2)

    for side in range(sides):
        t.circle(radius, extent=angle * 2, steps=1)

        color = COLORS[side % 2]

        t.right(angle)
        drawSquare(t, size, color)
        t.left(angle)

screen = Screen()
screen.bgcolor('grey')

turtle = Turtle()
turtle.speed('fastest')
turtle.radians()
turtle.width(3)

drawCircle(turtle, 30, 10)

turtle.hideturtle()
screen.exitonclick()

enter image description here

1
cdlane 18 oct. 2020 à 07:58