2

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

我的错误代码如下:

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()

当前代码产生以下内容:

实际输出

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

嵌套方块

4

2 回答 2

3

现在,只是为了好玩,“通过冲压更好地生活”解决方案:

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()冲压绘图的替代方法,最适合像这样的简单几何图案。

于 2020-04-09T02:30:08.960 回答
2

问题在于

tt.forward(x)

请记住,你的总是负数,如果你想关于零对称,x边的长度不是x,而是。-2 * x由于您的三角形是嵌套的,因此您还可以y从计算初始x值,因为它是主平分线的 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).

结果(不乘以shrink2)是

嵌套三角形

于 2020-04-08T22:20:18.353 回答