[英]How to Tessellate this shape?
我正在尝试细分以下形状,如下图所示。 (我没有足够的声誉来发布图像,所以就在这里。我正在使用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)
我不知道从这里去哪里,现在的代码只是使基本形状得以实现。
这是考虑此问题的另一种方法。 许多镶嵌是较简单的几何图块的变形。 可以将其视为变形的六角形:
因此,如果我们编写代码以用六角形平铺该平面,那么我们应该能够使用相同的代码以这种形状平铺该平面。 基于图章的六角形拼贴程序:
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()
替换OP设计的一个问题是原点不在中心:
但是我们将对此施加创可贴,而不是固定绘图代码。 让我们修改上面的代码以使用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()
这给了我们修改后的六边形细分:
您可以创建绘制完整图形的函数
def figure(length):
setup(length)
setup(length)
setup(length)
然后,您可以绘制一个figure
,然后在绘制第二个figure
之前使用penup()
, forward()
, pendown()
等移动乌龟。
我尝试了不同的组合,我得到了类似的东西
例1()
例2()
可能具有一些递归的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
递归我做了这个
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.