2

I'd like to draw a series of nested triangles using recursion.

My faulty code below:

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

The current code produces the following:

Actual output

Here is what I mean by nested shapes, except that I would like to draw triangles instead of squares:

Nested squares

2
  • are you using any library? what are your imports? Commented Apr 8, 2020 at 21:54
  • @Babydesta. import turtle as tt. It's heavily implied, and the code is pretty unambiguous Commented Apr 8, 2020 at 22:10

2 Answers 2

3

And now, just for fun, the "better living through stamping" solution:

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

This is the default orientation, you can turn it anyway you want before calling recursiveTri(). Stamping is an alternative to drawing that works best with simple geometric patterms like this.

Sign up to request clarification or add additional context in comments.

Comments

2

The problem is with

tt.forward(x)

Remember that your x is always negative, and the length of a side is not x, but rather -2 * x, if you want to be symmetrical about zero. Since your triangles are nested, you can also compute the initial y from x, given that it is 1/3 of the way up the main bisector. -sqrt(3) / 3 * x therefore puts the center of the circles circumscribed around and inscribed in your triangle at 0, 0.

In fact, it is probably easier to just fix the length of a side, and compute x and y from that:

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)

In this case, shrink is the total amount removed from each side. If you want it to be the amount you step forward, change the recursive call to recursiveTri(side - 2 * shrink, shrink).

The result (without multiplying shrink by 2) is

Nested triangles

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.