如何对这种形状进行镶嵌?

时间:2019-04-17 03:15:14

标签: python turtle-graphics tessellation

我正尝试细分以下形状,如下图所示。 (我没有足够的声誉来发布图像,所以在这里。 我正在使用python乌龟图形来尝试使每种形状相互适应,但是我不知道如何或何时使它重新开始。

我已经制作好形状,如下所示。

import turtle

t = turtle.Turtle()
t.left(30)
t.speed("fastest")
turtle.delay(0)
counter = 0 
t.begin_fill()
def setup(length):
    t.forward(length)
    t.right(120)
    t.forward(length / 3)
    t.left(60)
    t.forward(length / 3)
    t.left(120)
    t.forward(length)
    t.left(60)
    t.forward(length)
    t.left(120)
    t.forward(length / 3)
    t.left(60)
    t.forward(length / 3)
    t.right(120)
    t.forward(length)
    t.right(60)

while True:
    setup(100)

我不知道从这里去哪里,现在的代码只是使基本形状得以实现。

2 个答案:

答案 0 :(得分:4)

这是思考此问题的另一种方法。许多镶嵌是较简单的几何图块的变形。可以将其视为变形的六角形:

enter image description here

因此,如果我们编写代码以用六边形平铺该平面,那么我们应该能够使用相同的代码以该形状平铺该平面。基于图章的六角形拼贴程序:

from turtle import Screen, Turtle
from math import pi, sin, cos

SIDES = 6
OUTER_RADIUS = 90
INNER_RADIUS = 3**0.5 * OUTER_RADIUS / 2

def tessellation(depth):
    turtle.stamp()

    if depth:
        angle = 0

        while angle < 2 * pi:

            position = turtle.position()

            x = 2 * INNER_RADIUS * cos(angle)
            y = 2 * INNER_RADIUS * sin(angle)

            turtle.goto(turtle.xcor() + x, turtle.ycor() + y)
            tessellation(depth - 1)

            turtle.setposition(position)

            angle += 2 * pi / SIDES

screen = Screen()

turtle = Turtle(visible=False)
turtle.penup()
turtle.sety(-OUTER_RADIUS)  # center point correction!
turtle.begin_poly()
turtle.circle(OUTER_RADIUS, steps=6)
turtle.end_poly()

screen.register_shape('tile', turtle.get_poly())

turtle.shape('tile')
turtle.settiltangle(30)  # orient tile
turtle.fillcolor('white')
turtle.home()
turtle.showturtle()

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

screen.exitonclick()

enter image description here

替换OP设计的一个问题是原点不在中心:

enter image description here

但是我们将对此施加创可贴,而不是固定绘图代码。让我们在上面修改我的代码,以使用OP的代码绘制图形:

from turtle import Screen, Turtle
from math import pi, sin, cos

SIDES = 6
OUTER_RADIUS = 90
INNER_RADIUS = 3**0.5 * OUTER_RADIUS / 2

def setup(length):
    turtle.forward(length)
    turtle.right(120)
    turtle.forward(length / 3)
    turtle.left(60)
    turtle.forward(length / 3)
    turtle.left(120)
    turtle.forward(length)
    turtle.left(60)
    turtle.forward(length)
    turtle.left(120)
    turtle.forward(length / 3)
    turtle.left(60)
    turtle.forward(length / 3)
    turtle.right(120)
    turtle.forward(length)
    turtle.right(60)

def figure(length):
    for _ in range(3):
        setup(length)

def tessellation(depth):
    turtle.stamp()

    if depth:
        angle = 0

        while angle < 2 * pi:

            position = turtle.position()

            x = 2 * INNER_RADIUS * cos(angle)
            y = 2 * INNER_RADIUS * sin(angle)

            turtle.goto(turtle.xcor() + x, turtle.ycor() + y)
            tessellation(depth - 1)

            turtle.setposition(position)

            angle += 2 * pi / SIDES

screen = Screen()

turtle = Turtle(visible=False)
turtle.penup()
turtle.goto(OUTER_RADIUS / 9, -2 * OUTER_RADIUS / 9)  # center point correction!
turtle.begin_poly()
figure(INNER_RADIUS)
turtle.end_poly()

screen.register_shape('tile', turtle.get_poly())

turtle.shape('tile')
turtle.settiltangle(30)  # orient tile
turtle.fillcolor('white')
turtle.home()
turtle.showturtle()

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

screen.exitonclick()

这给了我们修改后的六边形棋盘格:

enter image description here

答案 1 :(得分:0)

您可以创建绘制完整图形的功能

def figure(length):
    setup(length)
    setup(length)
    setup(length)

然后您可以绘制一个figure,然后使用penup()forward()pendown()等移动龟,然后再绘制第二个figure。 / p>

我尝试了不同的组合,我得到了类似的东西

example1()

enter image description here

example2()

enter image description here

也许example1有一些递归可以给出预期的结果。

import turtle

# --- functions ---

def setup(length):
    t.forward(length)
    t.right(120)
    t.forward(length / 3)
    t.left(60)
    t.forward(length / 3)
    t.left(120)
    t.forward(length)
    t.left(60)
    t.forward(length)
    t.left(120)
    t.forward(length / 3)
    t.left(60)
    t.forward(length / 3)
    t.right(120)
    t.forward(length)
    t.right(60)

def figure(length):
    for _ in range(3):
        setup(length)

def example1(length):

    for _ in range(3):
        figure(length)

        t.penup()
        t.forward(length + length/3)
        t.right(120)
        t.backward(length/3)
        t.pendown()

def example2(length):

    for _ in range(3):
        figure(length)

        t.penup()
        t.left(60)
        t.forward(length + length)
        t.right(60)
        t.pendown()


# --- main ---

t = turtle.Turtle()
t.speed(0)
turtle.delay(0)

t.left(30)

#example1(50)
example2(50)

turtle.mainloop()

编辑:我在figure中使用了递归功能

enter image description here

import turtle

# --- functions ---

def setup(length):
    t.forward(length)
    t.right(120)
    t.forward(length / 3)
    t.left(60)
    t.forward(length / 3)
    t.left(120)
    t.forward(length)
    t.left(60)
    t.forward(length)
    t.left(120)
    t.forward(length / 3)
    t.left(60)
    t.forward(length / 3)
    t.right(120)
    t.forward(length)
    t.right(60)

def figure(length, level=0):

    for _ in range(3):
        if level > 0:
            move(length)
            figure(length, level-1)

        setup(length)

def move(length):
    t.penup()
    t.left(60)
    t.forward(length + length)
    t.right(60)
    t.pendown()

# --- main ---

t = turtle.Turtle()
t.speed(0)
turtle.delay(0)

t.left(30)

figure(50, 2)

turtle.mainloop()