Хотя некоторые из ваших констант имеют смысл:
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
является шириной 1009 * ваших шестиугольников, их высота действительно 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()
![enter image description here](https://i.stack.imgur.com/qFttU.png)
Это все хорошо, но если нашцель - тесселяция , тогда мы можем захотеть немного подкорректировать, чтобы на самом деле разбить плоскость.Для приведенного выше кода потребуется изменить пять строк:
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
Только последняя из них - это модификация, за исключением изменения небольшой константы.Для того, чтобы плитки прижались, нам нужно ввести понятие четность , чтобы каждый ряд чередовался относительно того, где начинается шестиугольник:
![enter image description here](https://i.stack.imgur.com/mwEY4.png)