Вот еще один способ думать об этой проблеме. Многие тесселяции являются деформациями более простых геометрических плиток. Это можно считать деформированным шестиугольником:
Так что, если мы напишем код для разбиения плоскости на шестиугольник, то мы сможем использовать этот же код для разбиения его на фигуру. Программа для нанесения покрытий на шестигранные марки:
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 для рисования фигуры:
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()
Что дает нам модифицированный шестиугольник тесселяции: