使用递归绘制嵌套三角形

Using recursion to draw nested Triangles

我想使用递归绘制一系列嵌套三角形。

我下面的错误代码:

def recursiveTri(x, y, shrink):

    tt.penup()
    tt.setx(x)
    tt.sety(y)

    if x > -10:
        return

    for element in range(3):
        tt.pendown()
        tt.forward(x)
        tt.right(120)

    recursiveTri(x + shrink, y - shrink, shrink)

def main():
    recursiveTri(-300,300,30)

main()

当前代码生成以下内容:

这里是我所说的嵌套形状的意思,只是我想画三角形而不是正方形:

问题在于

tt.forward(x)

记住你的 x 总是负数,如果你想关于零对称,边长不是 x,而是 -2 * x。由于您的三角形是嵌套的,您还可以从 x 计算初始 y,因为它位于主平分线上方的 1/3。 -sqrt(3) / 3 * x 因此,将圆的中心外接并刻在三角形中的 0、0 处。

事实上,只固定边的长度并从中计算 xy 可能更容易:

import turtle as tt
from math import sqrt

def recursiveTri(side, shrink):
    if side < 10: return

    tt.penup()
    tt.goto(-side / 2, sqrt(3) / 6 * side)

    tt.pendown()

    for _ in range(3):
        tt.forward(side)
        tt.right(120)

    recursiveTri(side - shrink, shrink)

tt.penup()
tt.home()
tt.dot()
recursiveTri(300, 30)

在这种情况下,shrink 是从每边移除的总量。如果您希望它成为您前进的数量,请将递归调用更改为 recursiveTri(side - 2 * shrink, shrink).

结果(不将 shrink 乘以 2)是

现在,为了好玩,"better living through stamping" 解决方案:

import turtle

CURSOR_SIZE = 20

def recursiveTri(side, shrink):
    if side > 10:
        turtle.shapesize(side / CURSOR_SIZE)

        turtle.stamp()

        recursiveTri(side - shrink, shrink)

turtle.hideturtle()
turtle.shape('triangle')
turtle.fillcolor('white')

recursiveTri(300, 30)

turtle.dot()
turtle.exitonclick()

这是默认方向,您可以在调用 recursiveTri() 之前随意转动它。 冲压绘图 的替代方法,最适合像这样的简单几何图案。