首页 > 解决方案 > 海龟:使用 for 循环在 y 轴上移动

问题描述

所以我正在尝试使用海龟图形创建一个镶嵌,我有我认为应该可以工作的代码,但显然不是。它应该接受用户输入来确定十六进制的大小,然后通过将输入加倍并移动到下一个十六进制来使用相同的输入来设置间距。只要一行六边形,它就可以工作。但是,当我尝试通过将 size * 2 添加到 y 坐标来使用相同的方法时(请参阅:for a in range(20): loop)),它只会运行同一行 hexes 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

标签: pythonturtle-graphics

解决方案


尽管您的一些常量非常有意义:

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是六边形的宽度,但它们的高度真的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

只有最后一个是改变一个小常数之外的修改。为了使瓦片紧密相连,我们需要引入奇偶校验的概念,以便每一行交替显示六边形的开始位置:

在此处输入图像描述


推荐阅读