Jump To …


this.define () ->
  "strict mode"
  class MandelbrotCore



Necessarily pretty basic as this class could be used in a webworker or a page

    constructor: (@progressCallback) ->

Public Methods



Gets the escape time for every pixel

    getEscapeTimes: (width, height, box, maxIterations) ->

We want an array of arrays

      escapeTimes = []
      for row in [0..height]

Use the fat arrow to bind this to the loop function

          do (row) =>
            rowTimes = []
            for column in [0..width]
              do (column) ->

Get the real and imaginary coordinates corresponding to this pixel

                real = interpolate column, box.left, box.right, 0, width
                imaginary = interpolate row, box.top, box.bottom, 0, height

Calculate the escape time and store the result in our row

                rowTimes.push (getEscapeTimeAtPoint real, imaginary, maxIterations)

Store the result for this row

            escapeTimes.push rowTimes

If a progress callback was provided use it to update caller on progress

            if this.progressCallback? then this.progressCallback 100*row/height
      return escapeTimes

Private methods



The linear interpolation function ❤

    interpolate = (x, y0, y1, x0, x1) -> y0 + (x - x0)*((y1 - y0)/(x1-x0))


Based on the algorithm on wikipedia

    getEscapeTimeAtPoint = (real, imaginary, maxIteration) ->
      [x, y] = [0, 0]
      for iteration in [0..maxIteration]
        if x*x + y*y < 2*2
          xtemp = x*x - y*y + real
          y = 2*x*y + imaginary
          x = xtemp
      return iteration
  return MandelbrotCore

generated Fri Dec 21 2012 12:05:09 GMT+0000 (GMT)