海龟:使用 for 循环在 y 轴上移动
Turtles: shifting on the y axis using a for loop
所以我正在尝试使用海龟图形创建曲面细分,并且我有一些我认为应该可以工作的代码,但显然不是。它应该采用用户输入来确定十六进制的大小,然后通过将输入加倍并移动到下一个十六进制来使用相同的输入来进行间距。只要一行六边形,它就可以工作。但是,当我尝试通过将 size * 2 添加到 y 坐标(请参阅:for a in range(20): loop))来使用相同的方法时,它只会运行同一行十六进制 20 次。如何获得 y 坐标以使用大小将下一行六角形放在第一行下方,依此类推?
这是为学校准备的,但我已经做了 6 个小时了,我还有 4 个小时的计算时间,所以我有点绝望。
谢谢!
#learned nifty * trick
from turtle import *
x = -500
y = 300
size = float(input("How large would you like the hexagons to be? 1-50" ))
#Should only need one turtle
#Need shapes - Picked hexagon
bgcolor("gray")
speed(10)
begin_fill()
color("red")
for a in range(20):
penup()
goto(x,y -(size * 2))
pendown()
for b in range(20):
penup()
forward(size*2)
pendown()
for c in range(6):
forward(size)
left(60)
end_fill()
#Need 3 elements
#size of octogon
#direction of octogon
#coordinates of octogons
发生这种情况是因为您没有在每次迭代时更新 y
。
替换行:
goto(x,y -(size * 2))
与:
y = y - (size * 2)
goto(x,y)
并且在前面的六边形下方绘制了以下六边形线。
尽管您的一些常量非常合理:
forward(size*2)
for c in range(6):
left(60)
其他的比较随意:
x = -500
y = 300
for a in range(20):
for b in range(20):
并且应该尽可能计算。如果不使用 3 的平方根,你真的无法使用六边形。虽然 size * 2
是你的六边形的 width,它们的 height 确实 size * 3 ** 0.5
而不是 size * 2
。让我们重写您的代码以避免任意数字并尽可能地实际计算:
from turtle import Screen, Turtle # unlearn nifty * trick
WIDTH, HEIGHT = 1000, 600
ROOT = 3 ** 0.5
size = float(input("How large would you like the hexagons to be? (5-50): "))
screen = Screen()
screen.setup(WIDTH, HEIGHT)
screen.bgcolor('gray')
turtle = Turtle(visible=False)
turtle.fillcolor('red')
turtle.penup()
left_edge = size/2 - WIDTH/2
x, y = left_edge, HEIGHT/2 - size * ROOT
screen.tracer(False) # because I have no patience
for row in range(int(HEIGHT // (size * ROOT)) + 1):
turtle.goto(x, y)
turtle.begin_fill()
for column in range(int(WIDTH // (size * 2)) + 1):
turtle.pendown()
for _ in range(6):
turtle.forward(size)
turtle.left(60)
turtle.penup()
turtle.forward(size * 2)
turtle.end_fill()
x = left_edge
y -= size * ROOT
screen.tracer(True)
screen.exitonclick()
一切都很好,但如果我们的目标是 镶嵌 那么我们可能需要稍微调整一下以实际平铺平面。上面的代码需要修改五行:
5c5
< ROOT = 3 ** 0.5
---
> ROOT = 3 ** 0.5 / 2
22c22
< for row in range(int(HEIGHT // (size * ROOT)) + 1):
---
> for row in range(int(HEIGHT // (size * ROOT)) + 2):
26c26
< for column in range(int(WIDTH // (size * 2)) + 1):
---
> for column in range(int(WIDTH // (size * 1.5)) + 1):
34c34
< turtle.forward(size * 2)
---
> turtle.forward(size * 3)
38c38
< x = left_edge
---
> x = left_edge - (row + 1) % 2 * size * 1.5
只有最后一个是超出更改小常量的修改。为了使瓷砖相互嵌套,我们需要引入 奇偶性 的概念,因此每一行交替显示六边形的开始位置:
所以我正在尝试使用海龟图形创建曲面细分,并且我有一些我认为应该可以工作的代码,但显然不是。它应该采用用户输入来确定十六进制的大小,然后通过将输入加倍并移动到下一个十六进制来使用相同的输入来进行间距。只要一行六边形,它就可以工作。但是,当我尝试通过将 size * 2 添加到 y 坐标(请参阅:for a in range(20): loop))来使用相同的方法时,它只会运行同一行十六进制 20 次。如何获得 y 坐标以使用大小将下一行六角形放在第一行下方,依此类推?
这是为学校准备的,但我已经做了 6 个小时了,我还有 4 个小时的计算时间,所以我有点绝望。
谢谢!
#learned nifty * trick
from turtle import *
x = -500
y = 300
size = float(input("How large would you like the hexagons to be? 1-50" ))
#Should only need one turtle
#Need shapes - Picked hexagon
bgcolor("gray")
speed(10)
begin_fill()
color("red")
for a in range(20):
penup()
goto(x,y -(size * 2))
pendown()
for b in range(20):
penup()
forward(size*2)
pendown()
for c in range(6):
forward(size)
left(60)
end_fill()
#Need 3 elements
#size of octogon
#direction of octogon
#coordinates of octogons
发生这种情况是因为您没有在每次迭代时更新 y
。
替换行:
goto(x,y -(size * 2))
与:
y = y - (size * 2)
goto(x,y)
并且在前面的六边形下方绘制了以下六边形线。
尽管您的一些常量非常合理:
forward(size*2)
for c in range(6):
left(60)
其他的比较随意:
x = -500
y = 300
for a in range(20):
for b in range(20):
并且应该尽可能计算。如果不使用 3 的平方根,你真的无法使用六边形。虽然 size * 2
是你的六边形的 width,它们的 height 确实 size * 3 ** 0.5
而不是 size * 2
。让我们重写您的代码以避免任意数字并尽可能地实际计算:
from turtle import Screen, Turtle # unlearn nifty * trick
WIDTH, HEIGHT = 1000, 600
ROOT = 3 ** 0.5
size = float(input("How large would you like the hexagons to be? (5-50): "))
screen = Screen()
screen.setup(WIDTH, HEIGHT)
screen.bgcolor('gray')
turtle = Turtle(visible=False)
turtle.fillcolor('red')
turtle.penup()
left_edge = size/2 - WIDTH/2
x, y = left_edge, HEIGHT/2 - size * ROOT
screen.tracer(False) # because I have no patience
for row in range(int(HEIGHT // (size * ROOT)) + 1):
turtle.goto(x, y)
turtle.begin_fill()
for column in range(int(WIDTH // (size * 2)) + 1):
turtle.pendown()
for _ in range(6):
turtle.forward(size)
turtle.left(60)
turtle.penup()
turtle.forward(size * 2)
turtle.end_fill()
x = left_edge
y -= size * ROOT
screen.tracer(True)
screen.exitonclick()
一切都很好,但如果我们的目标是 镶嵌 那么我们可能需要稍微调整一下以实际平铺平面。上面的代码需要修改五行:
5c5
< ROOT = 3 ** 0.5
---
> ROOT = 3 ** 0.5 / 2
22c22
< for row in range(int(HEIGHT // (size * ROOT)) + 1):
---
> for row in range(int(HEIGHT // (size * ROOT)) + 2):
26c26
< for column in range(int(WIDTH // (size * 2)) + 1):
---
> for column in range(int(WIDTH // (size * 1.5)) + 1):
34c34
< turtle.forward(size * 2)
---
> turtle.forward(size * 3)
38c38
< x = left_edge
---
> x = left_edge - (row + 1) % 2 * size * 1.5
只有最后一个是超出更改小常量的修改。为了使瓷砖相互嵌套,我们需要引入 奇偶性 的概念,因此每一行交替显示六边形的开始位置: