Как создать тесселяцию с черепахами в Python - PullRequest
2 голосов
/ 14 апреля 2019

Я пытаюсь создать шаблон тесселяции ромба с графикой черепахи на python, которая выглядит следующим образом:

http://www.supercoloring.com/sites/default/files/styles/coloring_medium/public/cif/2015/01/tessellation-with-rhombus-coloring-pages.png

Сначала я думал о создании шаблона шестиугольника, а затемделение шестиугольников на трети.Я не уверен, как я могу создать шаблон шестиугольника рекурсивно.Пока я чередую углы черепах, когда запускаю программу, и у меня нет определенной стратегии.Любой совет, как подойти к этому?

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

Вот мой код:

import turtle
t = turtle.Turtle()
t1 = turtle.Turtle()
t2 = turtle.Turtle()
t1.left(120)
t2.left(240)
for i in (t, t1, t2):
    i.speed(0)

def hex():
    for b in (t, t1, t2):
        for i in range(6):
             b.forward(100)
             b.right(60)


for i in range(3):
    t.left(120)
hex()
def rep():   
    for i in range(3):
        for a in (t, t1, t2):
            a.forward(100)
            a.right(60)
            for i in range(6):
                a.forward(100)
                a.left(60)
rep()

def rep2():
    for a in (t, t1, t2):
        for i in range(3):
            a.left(120)
            a.forward(100)
            a.right(60)
            rep()

    a.right(120)
    a.forward(100)
    a.right(60)
    rep()
rep2()

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Во-первых, давайте упростим гексагональную тесселяцию с тремя черепахами и тремя функциями до одной черепахи, единственное рекурсивное функциональное решение:

from turtle import Screen, Turtle

OUTER_RADIUS = 100
INNER_RADIUS = 3**0.5 * OUTER_RADIUS / 2
SIDES = 6
EXTENT = 360 / SIDES

def tessellation(depth):
    turtle.right(EXTENT/2)

    for _ in range(SIDES):
        turtle.circle(OUTER_RADIUS, EXTENT, 1)

        if depth:
            heading = turtle.heading()

            turtle.right(90)
            tessellation(depth - 1)

            turtle.setheading(heading)

screen = Screen()
turtle = Turtle(visible=False)

screen.tracer(False)  # because I have no patience

turtle.penup()
turtle.goto(-OUTER_RADIUS / 2, -INNER_RADIUS)
turtle.pendown()
tessellation(2)

screen.tracer(True)

screen.exitonclick()

enter image description here

(Увеличьте аргумент depth, чтобы заполнить окно.) Тесселяция, которую вы действительно хотите, - это четыре (а не трети) из этих шаблонов, накладываемых друг на друга. Сохраняя наш исходный код таким же:

screen = Screen()
turtle = Turtle(visible=False)

screen.tracer(False)  # because I have no patience

turtle.penup()
turtle.color('blue')
turtle.goto(OUTER_RADIUS / 4, -1 * INNER_RADIUS / 2)
turtle.pendown()
turtle.setheading(0)
tessellation(2)

turtle.penup()
turtle.color('red')
turtle.goto(-OUTER_RADIUS / 2, -2 * INNER_RADIUS / 2)
turtle.pendown()
turtle.setheading(0)
tessellation(2)

turtle.penup()
turtle.color('yellow')
turtle.goto(OUTER_RADIUS / 4, -3 * INNER_RADIUS / 2)
turtle.pendown()
turtle.setheading(0)
tessellation(2)

turtle.penup()
turtle.color('green')
turtle.goto(-OUTER_RADIUS / 2, -4 * INNER_RADIUS / 2)
turtle.pendown()
turtle.setheading(0)
tessellation(2)

screen.tracer(True)

screen.exitonclick()

enter image description here

0 голосов
/ 15 апреля 2019

Многие рисуют это.Я бы нарисовал на основе формы ромба, потому что это позволит вам заполнить их разными цветами.Чтобы иметь возможность заполнить каждый ромб, его нужно нарисовать индивидуально.Фигура содержит три разных формы ромба (это один и тот же ромб в различной ориентации).Я нарисую первый ряд и второй ряд.После этого это повторение первого и второго ряда.Вот код:

def draw_rhombus(x,y,degree,size,tilt,color):
    turtle.up()
    turtle.goto(x,y)
    turtle.seth(tilt)
    turtle.down()
    turtle.pencolor('dark gray')
    turtle.fillcolor(color)
    turtle.begin_fill()
    turtle.fd(size)
    turtle.left(degree)
    turtle.fd(size)
    turtle.left(180-degree)
    turtle.fd(size)
    turtle.left(degree)
    turtle.fd(size)
    turtle.left(180-degree)
    turtle.end_fill()

def draw_rhombus_1(x,y,size):
    draw_rhombus(x,y,120,size,0,'red')

def draw_rhombus_2(x,y,size):
    draw_rhombus(x,y,60,size,0,'green')

def draw_rhombus_3(x,y,size):
    draw_rhombus(x,y,60,size,60,'blue')

def rt_row_1(startx,starty,size,n):
    x = startx
    y = starty
    for i in range(n):
        draw_rhombus_1(x,y,size)
        x += size
        draw_rhombus_3(x,y,size)
        draw_rhombus_2(x,y,size)
        x += 2*size

def rt_row_2(startx,starty,size,n):
    x = startx
    y = starty
    for i in range(n):
        draw_rhombus_2(x,y,size)
        x += 2*size
        draw_rhombus_1(x,y,size)
        x += size
        draw_rhombus_3(x,y,size)

size = 80
x = -400
y = -400
for i in range(800//int(round(size*math.sqrt(3)))):
    rt_row_1(x,y,size,800//(size*3))
    rt_row_2(x-size/2,y+size*math.sqrt(3)/2,size,800//(size*3))
    y += size*math.sqrt(3)
...