正方形不对齐 - 多边形和圆形
Squares not aligning - polygons and circles
我正在编写代码来沿着圆的圆周绘制正方形。我试图让方块正确对齐,而不是任意旋转。但是,似乎没有任何效果。如何修复此代码?我尝试了多种方法,但这是我能想到的。我还尝试了另一种方法,其中没有定义中心;换句话说,我们从圆周开始画圆(并且对齐很好)。但是对于问题的下一部分,我们必须绘制同心圆,没有中心会遇到麻烦。
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()
虽然我不是 100% 确定正方形应该如何排列(您可以取消注释 45 度旋转以在下面的代码中的两种方法之间切换),但有一个通用模式似乎让您进入球场。想法是在圆的圆周上定位每个 n
点,如下所示:
for i in range(n):
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.backward(size / 2)
t.left(90)
t.forward(size / 2)
t.right(90)
除了方框大小之外,我还添加了半径作为参数以实现可调整性。中心 x/y 也不会是一个糟糕的补充,但对于手头的任务来说似乎还为时过早。
完整代码如下:
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()
我认为我们可以比您的解决方案或@ggorlen 使用 turtle 的 circle()
方法更省力地完成此操作,不是画圆而是在圆形路径中移动。我们使用它的 extent
和 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()
我正在编写代码来沿着圆的圆周绘制正方形。我试图让方块正确对齐,而不是任意旋转。但是,似乎没有任何效果。如何修复此代码?我尝试了多种方法,但这是我能想到的。我还尝试了另一种方法,其中没有定义中心;换句话说,我们从圆周开始画圆(并且对齐很好)。但是对于问题的下一部分,我们必须绘制同心圆,没有中心会遇到麻烦。
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()
虽然我不是 100% 确定正方形应该如何排列(您可以取消注释 45 度旋转以在下面的代码中的两种方法之间切换),但有一个通用模式似乎让您进入球场。想法是在圆的圆周上定位每个 n
点,如下所示:
for i in range(n):
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.backward(size / 2)
t.left(90)
t.forward(size / 2)
t.right(90)
除了方框大小之外,我还添加了半径作为参数以实现可调整性。中心 x/y 也不会是一个糟糕的补充,但对于手头的任务来说似乎还为时过早。
完整代码如下:
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()
我认为我们可以比您的解决方案或@ggorlen 使用 turtle 的 circle()
方法更省力地完成此操作,不是画圆而是在圆形路径中移动。我们使用它的 extent
和 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()