

Line 1: 
Line 1: 
−  [[File:Droste.jpgthumb125pxThe [[wikipedia:Droste effectdroste effect]] is an example of '''Recursion'''.]]
 +  not to 
−  '''[[Recursion]]''' is the process of repeating items in a selfsimilar way. Recursion can be implemented in [[Scratch]] by making a [[Blocksblock]] that uses itself. This can be used to create '''[[wikipedia:Fractalfractals]]'''. A fractal is pattern that produces a picture, which contains an infinite amount of copies of itself. Some wellknown specimens are the [[wikipedia:Mandelbrot setMandelbrot set]], the [[wikipedia:Sierpinski triangleSierpinski Triangle]] (also, but less commonly known as the Sierpinski Gasket), and the [[wikipedia:Koch snowflakeKoch Snowflake]].
 
−   
−  ==Creating the Koch Curve==
 
−  The Koch Curve is a fractal that can be created relatively easily in Scratch. The Koch Curve is a piece of the larger fractal, the [[wikipedia:Koch snowflakeKoch Snowflake]].
 
−   
−  ===Understanding Recursion in the Koch Curve===
 
−  [[File:Kochsim.gifthumbThe Koch Curve.]]
 
−  The Koch Curve is made of four Koch Curves that are a third of the size of the original Koch Curve. They are they are arranged so that the first and fourth are flat and the middle two point up to make an equilateral that is triangle missing one side.
 
−   
−  [[File:Recersion in Koch Curve.png750px]]
 
−   
−  To make it easier to draw, the Koch Curve can be broken down into iterations, each one more complicated than the last. The first iteration is made up of four straight lines. The second iteration contains four copies of the first iteration. The third iteration contains four copies of the second iteration or sixteen copies of the first iteration. As iterations are added it gets more complicated and looks more and more like the real Koch Curve.
 
−   
−  [[File:Iterations of Koch Curve.png500px]]
 
−   
−  ===Implementation in Scratch===
 
−  <! To be based on this project: http://scratch.mit.edu/projects/10068174/>
 
−   
−  ====Basic Pen Path without Recursion====
 
−  The triangle in the center is an equilateral triangle, therefore each of its angles have a measure of 60°.
 
−   
−  [[File:Equilateral Triangle in Koch Curve.png500px]]
 
−   
−  Using basic geometry the angles of the rotations the sprite must make can be found.
 
−   
−  [[File:Sprite Turns in Koch Curve.png500px]]
 
−   
−  Using this these angles, a [[script]] can be created that draws the first iteration of Koch Curve. Since each line segment is 1/3 the total length of the Koch Curve, the sprite should move 1/3 of the length given each time.
 
−   
−  <scratchblocks>
 
−  when gf clicked
 
−  point in direction (90) //make sure the sprite is pointed right
 
−  go to x: (240) y: (179) //put the sprite in the lower left corner
 
−  clear //clear graphics from previous runs
 
−  pen down //put the pen down for drawing
 
−  make the first iteration of the Koch Curve with a length of (480)
 
−  pen up //put the pen up so movement afterwards is not recorded
 
−   
−  define make the first iteration of the Koch Curve with a length of (length)
 
−  move ((length) / (3)) steps //draw a line segment
 
−  turn ccw (60) degrees //first turn
 
−  move ((length) / (3)) steps //draw a line segment
 
−  turn cw (120) degrees //second turn
 
−  move ((length) / (3)) steps //draw a line segment
 
−  turn ccw (60) degrees //third turn
 
−  move ((length) / (3)) steps //draw a line segment
 
−  </scratchblocks>
 
−   
−  ====Adding Recursion====
 
−  To add recursion, instead of drawing a line, a smaller Koch Curve can be drawn. When each iteration above one is drawn, it contains four smaller Koch Curves that are one iteration less than it self. For example, when drawing the second iteration you must draw four copies that are 1/3 the size of the first iteration. When the program gets to the first iteration it must draw straight lines. The following code will make the fifth iteration of the Koch Curve
 
−   
−  <scratchblocks>
 
−  when gf clicked
 
−  point in direction (90) //make sure the sprite is pointed right
 
−  go to x: (240) y: (179) //put the sprite in the lower left corner
 
−  clear //clear graphics from previous runs
 
−  pen down //put the pen down for drawing
 
−  make the (5) iteration of the Koch Curve with a length of (480)
 
−  pen up //put the pen up so movement afterwards is not recorded
 
−   
−  define make the (iteration) iteration of the Koch Curve with a length of (length)
 
−  if <(iteration) = [1]> then //is it the first iteration?
 
−  move ((length) / (3)) steps //draw a line segment
 
−  else
 
−  make the ((iteration)  (1)) iteration of the Koch Curve with a length of ((length) / (3)) //make a smaller Koch Curve
 
−  end
 
−  turn ccw (60) degrees //first turn
 
−  if <(iteration) = [1]> then //is it the first iteration?
 
−  move ((length) / (3)) steps //draw a line segment
 
−  else
 
−  make the ((iteration)  (1)) iteration of the Koch Curve with a length of ((length) / (3)) //make a smaller Koch Curve
 
−  end
 
−  turn cw (120) degrees //second turn
 
−  if <(iteration) = [1]> then //is it the first iteration?
 
−  move ((length) / (3)) steps //draw a line segment
 
−  else
 
−  make the ((iteration)  (1)) iteration of the Koch Curve with a length of ((length) / (3)) //make a smaller Koch Curve
 
−  end
 
−  turn ccw (60) degrees //third turn
 
−  if <(iteration) = [1]> then //is it the first iteration?
 
−  move ((length) / (3)) steps //draw a line segment
 
−  else
 
−  make the ((iteration)  (1)) iteration of the Koch Curve with a length of ((length) / (3)) //make a smaller Koch Curve
 
−  end
 
−  </scratchblocks>
 
−   
−  ==Creating the Mandelbrot Set==
 
−  [[File:Mandelbrot Set.gifthumb175pxAn animation of zooming in on the Mandelbrot set.]]
 
−  The Mandelbrot set is a mathematical fractal defined in the complex plane. It is completely selfsimilar, meaning that it repeats over and over as one zooms in. The Mandelbrot set was named after its discoverer, Benoit Mandelbrot, and has many close relationships to the [[Wikipedia:Julia SetsJulia Sets]].
 
−   
−  ===Understanding the Definition===
 
−  In its definition, the Mandelbrot uses complex numbers. A complex number is the sum of a real number and an imaginary one, with a complex number simply being the square root of a negative number. Since that can't be taken, the square root of 1 is assigned the value i. For example, 3+3i is a complex number.
 
−   
−  The Mandelbrot set is defined as all c values in the complex plain which are bounded under iteration in the following equation:
 
−   
−  [[File:Mandelbrot Equation.png]]
 
−   
−  First, one starts with a z value of c. Then, when one puts that z back into the equation, it becomes z^2+c. That z is then taken and put back through the equation over and over. This is called iteration.
 
−   
−  For example, let c=1. The value z then becomes 1. Once 1 is put back into the equation, the equation becomes 1^2+1, which equals 2. Once 2 is put back in, it becomes 2^2+1, or 5. Once 5 is put back in, it becomes 26. That sequence escapes to infinity and therefore c=1 is not part of the Mandelbrot set. Meanwhile, the sequence c=1 gives 0, 1, 0, 1, 0, ect..., is bounded and so belongs to the Mandelbrot set.
 
−   
−  It has been proven that if any sequence contains a complex value that is outside a distance of 2 from the origin, it will escape to infinity.
 
−   
−  ====Coloring====
 
−  [[File:Mandelbrot Coloring.gifthumb150pxAn animation of the Mandelbrot set under iteration.]]
 
−  In a basic Mandelbrot set, white is used for a cvalues that escape to infinity and black is used for all cvalues that do not. This would be the actual Mandelbrot set.
 
−   
−  In most Mandelbrot sets, though, colors are used to help depict the Mandelbrot set or make it more artorientated. Colors are not defined through an equation, but rather through the last iteration before escaping a distance of two from the origin. The iteration is then assigned a color of the creator's preference.
 
−   
−  ===Implementation in Scratch===
 
−  <!If needed, please use this project as a base: http://scratch.mit.edu/projects/12194871/#comments14707164 >
 
−  ====Creating the Variables====
 
−  Due to the fact that Scratch does not directly support mathematics in the complex plain, a simple workaround has to be used. Each complex number will be defined as two [[variable]]s, the real part, and the complex part. And since there will be operations based on the complex numbers, two complex numbers will be needed, or four variables. For the tutorial, these names will be used:
 
−   
−  *Real 1
 
−  *Real 2
 
−  *Complex 1
 
−  *Complex 2
 
−   
−  Along with that, a variable Best Fit will be used to figure out the color to be used when coloring a complex value:
 
−   
−  *Best Fit
 
−   
−  ====Coding====
 
−  To start, a base of clones is needed to render a full screen due to the computing power needed to render the Mandelbrot set:
 
−   
−  <scratchblocks>
 
−  when gf clicked
 
−  hide//so that this sprite and its clones don't show
 
−  set y to (180)
 
−  clear//preparing the scene for the Mandelbrot set
 
−  repeat (12)
 
−  create clone of [myself v]
 
−  change y by (1)//this makes it so that clones don't overlap
 
−  end
 
−  </scratchblocks>
 
−   
−  Next, it is important to give the clones a skeleton:
 
−   
−  <scratchblocks>
 
−  when I start as a clone
 
−  set pen size to (1.5)//any other size will appear transparent
 
−  set x to (180)//the left hand side of the Mandelbrot set
 
−  repeat ((360) / (12))//12 clones and each gets 30 rows on the screen to render
 
−  repeat (360)//360 pixels will be the width of the Mandelbrot set once rendered
 
−  //this is where we'll be rendering each point
 
−  end
 
−  change y by (12)//the clone finished a row and moves to another
 
−  set x to (180)
 
−  end
 
−  </scratchblocks>
 
−   
−  Although this is a functional script, it will take awhile to render. For speed preferences, we'll be inserting a custom block:
 
−   
−  <scratchblocks>
 
−  when I start as a clone
 
−  set pen size to (1.5)
 
−  set x to (180)
 
−  repeat (30)
 
−  repeat (60)
 
−  forced iteration//renders 6 points without a screen refresh for speed benefits
 
−  end
 
−  change y by (12)
 
−  set x to (180)
 
−  end
 
−   
−  define forced iteration//make sure this runs without screen refresh!
 
−  repeat (6)
 
−  //here is where we'll be rendering points now
 
−  end
 
−  </scratchblocks>
 
−   
−  As noted above, it is important that the custom block "forced iteration" runs without a screen refresh or else all the benefit of extra speed will be lost.
 
−   
−  Anyway, now that that is coded, we need to create the skeleton for sampling a point and figuring out wether or not it's part of the Mandelbrot set:
 
−   
−  <scratchblocks>
 
−  define forced iteration
 
−  repeat (6)
 
−  set [Real 1 v] to ((x position) / (90))//90 pixels to the right is the equivalent of 1
 
−  set [Imaginary 1 v] to ((y position) / (90))//90 pixels upwards is the equivalent of i
 
−  if <([sqrt v] of (((Real 1) * (Real 1)) + ((Imaginary 1) * (Imaginary 1)))) < (2.15)> then
 
−  Test for Legibility at R: (Real 1) I: (Imaginary 1)
 
−  Set Pen Color
 
−  pen down//drawing the point
 
−  pen up
 
−  end
 
−  change x by (1)//moving onto another point
 
−  end
 
−   
−  define Test for Legibility at R: (Real) I: (Imaginary)//this is where we'll test if a point is part of the Mandelbrot set or not
 
−   
−  define Set Pen Color//this is where we pick our color depending on the variable 'Best Fit'
 
−  </scratchblocks>
 
−   
−  Now here is where the mathematics of the Mandelbrot set comes into play. In the Test for Legibility custom block, we'll have to take a complex number, apply the equation which defines the Mandelbrot set, and repeat if it's still within a distance of 2 from the origin:
 
−   
−  <scratchblocks>
 
−  define Test for Legibility at R: (Real) I: (Imaginary)
 
−  set [Best Fit v] to (1)
 
−  repeat until <<(Best Fit) = (20)> or <([sqrt v] of (((Real 1) * (Real 1)) + ((Imaginary 1) * (Imaginary 1)))) > (2)>>
 
−  change [Best Fit v] by (1)//the complex number has survived one iteration
 
−  set [Real 2 v] to ((((Real 1) * (Real 1))  ((Imaginary 1) * (Imaginary 1))) + (Real))
 
−  set [Imaginary 2 v] to (((2) * ((Real 1) * (Imaginary 1))) + (Imaginary))
 
−  set [Real 1 v] to (Real 2)//setting the scene for another iteration
 
−  set [Imaginary 2 v] to (Imaginary 2)
 
−  end
 
−  </scratchblocks>
 
−   
−  Up above, it may be noticed that the repeat continues until the complex number is found to not be part of the Mandelbrot set, or until it has iterated 20 times. That 20 can be changed to whatever one wants, though the higher the number, the more lag will be caused.
 
−   
−  To complete the Mandelbrot set, colors need to be implemented:
 
−   
−  <scratchblocks>
 
−  define Set Pen Color
 
−  if <(Best Fit) = (1)> then
 
−  set pen color to [#000]//this point is already outside a distance of 2 from the origin
 
−  else
 
−  if <(Best Fit) = (20)> then
 
−  set pen color to [#FFF]//this point is a solution to the Mandelbrot set
 
−  else
 
−  set pen color to (50)//this complex number is not a solution, but survives several iterations
 
−  set pen shade to (((0)  (Best Fit)) * (5))
 
−  end
 
−  end
 
−  </scratchblocks>
 
−   
−  Those colors may be changed to one's wishes.
 
−   
−  ====Final Product====
 
−   
−  In the end, this is all the code used to draw the Mandelbrot set (scroll to see all of the code):
 
−   
−  <scratchblocks>
 
−  when gf clicked
 
−  hide
 
−  set y to (180)
 
−  clear
 
−  repeat (12)
 
−  create clone of [myself v]
 
−  change y by (1)//this makes it so that clones don't overlap
 
−  end
 
−   
−  when I start as a clone
 
−  set pen size to (1.5)
 
−  set x to (180)
 
−  repeat (30)
 
−  repeat (60)
 
−  forced iteration
 
−  end
 
−  change y by (12)
 
−  set x to (180)
 
−  end
 
−   
−  define forced iteration//remember, run this without screen refresh!
 
−  repeat (6)
 
−  set [Real 1 v] to ((x position) / (90))
 
−  set [Imaginary 1 v] to ((y position) / (90))
 
−  if <([sqrt v] of (((Real 1) * (Real 1)) + ((Imaginary 1) * (Imaginary 1)))) < (2.15)> then
 
−  Test for Legibility at R: (Real 1) I: (Imaginary 1)
 
−  Set Pen Color
 
−  pen down//drawing the point
 
−  pen up
 
−  end
 
−  change x by (1)//moving onto another point
 
−  end
 
−   
−  define Test for Legibility at R: (Real) I: (Imaginary)
 
−  set [Best Fit v] to (1)
 
−  repeat until <<(Best Fit) = (20)> or <([sqrt v] of (((Real 1) * (Real 1)) + ((Imaginary 1) * (Imaginary 1)))) > (2)>>
 
−  change [Best Fit v] by (1)//the complex number has survived one iteration
 
−  set [Real 2 v] to ((((Real 1) * (Real 1))  ((Imaginary 1) * (Imaginary 1))) + (Real))
 
−  set [Imaginary 2 v] to (((2) * ((Real 1) * (Imaginary 1))) + (Imaginary))
 
−  set [Real 1 v] to (Real 2)
 
−  set [Imaginary 2 v] to (Imaginary 2)
 
−  end
 
−   
−  define Set Pen Color
 
−  if <(Best Fit) = (1)> then
 
−  set pen color to [#000]//this point is already outside a distance of 2 from the origin
 
−  else
 
−  if <(Best Fit) = (20)> then
 
−  set pen color to [#FFF]//this point is a solution to the Mandelbrot set
 
−  else
 
−  set pen color to (50)//this complex number is not a solution, but survives several iterations
 
−  set pen shade to (((0)  (Best Fit)) * (5))
 
−  end
 
−  end
 
−  </scratchblocks>
 
−   
−  ==Julia Set==
 
−  The Julia set is a series of equations that are mathematical fractals, and that is defined very similarly to the Mandelbrot set. The official equation is:
 
−   
−  [[File:Julia Set Equation.png]]
 
−   
−  The only difference in its definition from the Mandelbrot set is that c is no longer a point in the complex plane, but rather a complex parameter, which is consistent whichever point you pick. Also, z1 is defined as being the point you pick in the complex plane. The technique above for rendering the Mandelbrot set may be used here again, with the required changes.
 
−   
−  Here is a gallery of images on the Julia set:
 
−   
−  <gallery widths=160px perrow=5 caption="Julia Set">
 
−  File:Julia Set Image1.pngJulia set for c=0.8350.2321i
 
−  File:Julia Set Image2.pngJulia set for c=0.4+0.6i
 
−  File:Julia Set Image3.pngJulia set for c=0.285+0i
 
−  </gallery>
 
−   
−  ==See Also==
 
−  *[http://scratch.mit.edu/projects/10068174/ Example of Koch Curve]
 
−  *[http://scratch.mit.edu/projects/12194871/#player Example of Mandelbrot Set and Julia Set]
 
−  *[[Recursion]]
 
−   
−  [[Category:Scripting Tutorials]]
 
−  [[Category:Computer Science]]
 