使用递归绘制嵌套三角形

2024-09-29 06:34:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的错误代码如下:

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

当前代码生成以下内容:

Actual output

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

Nested squares


Tags: forreturnifmaindef绘制elementtt
2条回答

问题在于

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

Nested triangles

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

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

enter image description here

这是默认方向,您可以在调用recursiveTri()之前以任何方式将其旋转冲压绘图的一种替代方法,它最适合这样简单的几何图案

相关问题 更多 >