首页 > 解决方案 > 如何创建彩虹三角形镶嵌

问题描述

我正在尝试在 Python 中创建如下所示的三角形镶嵌:

图片

我得到的只是谢尔彭斯基的三角形。我假设它会使用一些相同的代码。

import turtle as t
import math
import colorsys

t.hideturtle()
t.speed(0)
t.tracer(0,0)

h = 0
def draw_tri(x,y,size):
    global h
    t.up()
    t.goto(x,y)
    t.seth(0)
    t.down()
    color = colorsys.hsv_to_rgb(h,1,1)
    h += 0.1
    t.color(color)
    t.left(120)
    t.fd(size)
    t.left(120)
    t.fd(size)
    t.end_fill()

def draw_s(x,y,size,n):
    if n == 0:
        draw_tri(x,y,size)
        return

    draw_s(x,y,size/2,n-1)
    draw_s(x+size/2,y,size/2,n-1)
    draw_s(x+size/4,y+size*math.sqrt(3)/4,size/2,n-1)

draw_s(-300,-250,600,6)
t.update()

标签: pythongeometryturtle-graphicstiling

解决方案


正如@ReblochonMasque 所说,有多种方法可以解决这个问题。这是我想出的使用尽可能少的海龟代码来解决问题的方法:

from turtle import Screen, Turtle

TRIANGLE_SIDE = 60
TRIANGLE_HEIGHT = TRIANGLE_SIDE * 3 ** 0.5 / 2
CURSOR_SIZE = 20

screen = Screen()

width = TRIANGLE_SIDE * (screen.window_width() // TRIANGLE_SIDE)
height = TRIANGLE_HEIGHT * (screen.window_height() // TRIANGLE_HEIGHT)

diagonal = width + height

turtle = Turtle('square', visible=False)
turtle.shapesize(diagonal / CURSOR_SIZE, 1 / CURSOR_SIZE)
turtle.penup()
turtle.sety(height/2)
turtle.setheading(270)

turtle = turtle.clone()
turtle.setx(width/2)
turtle.setheading(210)

turtle = turtle.clone()
turtle.setx(-width/2)
turtle.setheading(330)

for _ in range(int(diagonal / TRIANGLE_HEIGHT)):
    for turtle in screen.turtles():
        turtle.forward(TRIANGLE_HEIGHT)
        turtle.stamp()

screen.exitonclick()

它可能可以使用优化,但它可以完成工作。而且看着很有趣...


推荐阅读