Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to draw fibonacci sequence using turtle module

This is my first question ever, and I am a complete and utter beginner, so please don't eat me :) What I am trying to to is to draw a fibonacci sequence using the Python turtle module. My code is as follows:

import turtle

zuf = turtle.Turtle()

while True:

  zuf.forward(10)
  zuf.left(3.1415)

This, however, drives around in circles only. I have tried to create a variable, say X, and assign a fibonacci rule to it xn = xn-1 + xn-2 then I'd put it in here zuf.forward(x) but it doesn't work. I tried multiple variations of that, but none seems to work. Please don't give a whole solution, only some hint, thanks a lot.

like image 937
Ejdzbikej Avatar asked Feb 05 '19 23:02

Ejdzbikej


1 Answers

I think I can get you from where you are to where you want to be. First, your invocation of:

zuf.left(3.1415)

seems to indicate you're thinking in radians, which is fine. But you need to tell your turtle that:

zuf = turtle.Turtle()
zuf.radians()

this will still make your code go in circles, but very different circles. Next, we want to replace 10 with our fibonacci value. Before the while loop, initialize your fibonacci counters:

previous, current = 0, 1

as the last statement in the while loop, bump them up:

previous, current = current, current + previous

and in your forward() call, replace 10 with current. Next, we need to turn the line that it's drawing into a square. To do this, we need to do two things. First, loop the drawing code four times:

for i in range(4):
    zuf.forward(current)
    zuf.left(3.1415)

And second, replace your angle with pi/2 instead:

    zuf.left(3.1415 / 2)

If you assemble this all correctly, you should end up with a figure like:

enter image description here

showing the increasing size of the fibonacci values. Not the greatest looking image, you'll still have to do some work on it to clean it up to look nice.

Finally, I was impressed with the fibonacci drawing code that @IvanS95 linked to in his comment, that I wrote a high speed version of it that uses stamping instead of drawing:

from turtle import Screen, Turtle

SCALE = 5
CURSOR_SIZE = 20

square = Turtle('square', visible=False)
square.fillcolor('white')
square.speed('fastest')
square.right(90)
square.penup()

previous_scaled, previous, current = 0, 0, 1

for _ in range(10):
    current_scaled = current * SCALE
    square.forward(current_scaled/2 + previous_scaled/2)
    square.shapesize(current_scaled / CURSOR_SIZE)
    square.left(90)
    square.forward(current_scaled/2 - previous_scaled/2)
    square.stamp()
    previous_scaled, previous, current = current_scaled, current, current + previous

screen = Screen()
screen.exitonclick()

enter image description here

This is not a whole solution for you, only a hint of what can be done as you're drawing your squares and this is a stamp-based solution which plays by different rules.

like image 131
cdlane Avatar answered Nov 03 '22 08:11

cdlane