Черепахи: перемещение по оси Y с использованием цикла for - PullRequest
0 голосов
/ 10 февраля 2019

Итак, я пытаюсь создать тесселяцию, используя графику черепахи, и у меня есть код, который, я думаю, должен работать, но это явно не так.Он должен принимать пользовательский ввод, чтобы определить размер гекса, затем использовать тот же самый ввод для интервала, удваивая ввод и переходя к следующему гексу.Это работает, пока одна линия шестиугольников идет.Но когда я пытаюсь использовать тот же метод, добавляя размер * 2 к координате y (см .: для in 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

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Хотя некоторые из ваших констант имеют смысл:

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

Это все хорошо, но если нашцель - тесселяция , тогда мы можем захотеть немного подкорректировать, чтобы на самом деле разбить плоскость.Для приведенного выше кода потребуется изменить пять строк:

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

0 голосов
/ 10 февраля 2019

Это происходит потому, что вы не обновляете y на каждой итерации.

Замените строку:

goto(x,y -(size * 2))

на:

y = y - (size * 2)
goto(x,y)

и следующиелинии шестиугольников нарисованы ниже предыдущих.

...