python - 海龟:使用 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
解决方案
尽管您的一些常量非常有意义:
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
只有最后一个是改变一个小常数之外的修改。为了使瓦片紧密相连,我们需要引入奇偶校验的概念,以便每一行交替显示六边形的开始位置:
推荐阅读
- python - 使用 txt 文件进行多项选择题
- ms-word - Word.CustomXmlPart 和 Office.CustomXmlParts 之间的区别
- c# - 根据条件获取特定的列表视图行
- vue.js - 如何按特定目录导入css
- php - 如何注册默认登录用户?
- java - JpaRepository 在保存到数据库时跳过了一些行
- django - 如何优化对反向ForeignKey的访问?
- keycloak - 用户尝试使用现有电子邮件注册时出现 Keycloak 内部服务器错误
- mysql - 使用乐观锁定更新 Sequelize 中的模型
- javascript - 如何在reactjs中验证多表条目应用程序onsubmit