使用递归绘制嵌套三角形
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 处。
事实上,只固定边的长度并从中计算 x
和 y
可能更容易:
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()
之前随意转动它。 冲压 是 绘图 的替代方法,最适合像这样的简单几何图案。
我想使用递归绘制一系列嵌套三角形。
我下面的错误代码:
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 处。
事实上,只固定边的长度并从中计算 x
和 y
可能更容易:
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()
之前随意转动它。 冲压 是 绘图 的替代方法,最适合像这样的简单几何图案。