Experiments with ruby-processing (processing-2.2.1) and JRubyArt for processing-3.0

Sunday, 22 November 2009

Dragon Fractal Using L-Systems and ruby-processing

Revised as of 27 December 2009 to use my custom grammar library. See Cesàro fractal in a later post for code.

##
# Lindenmayer System in ruby-processing by Martin Prout
###
require 'dragon'

class Dragon_Test < Processing::App
  load_libraries 'grammar'
  
  attr_reader :dragon
  
  def setup
    size 600, 480
    @dragon = Dragon.new
    dragon.create_grammar 10 
    no_loop
  end
  
  def draw
    background 0
    dragon.render
  end
end

############################
# dragon.rb
# Dragon Fractal
###########################

class Dragon
  include Processing::Proxy
  
  attr_accessor :axiom, :grammar, :start_length, :theta, :production, :draw_length

  def initialize
    @axiom = "FX"
    @grammar = Grammar.new(axiom)
    grammar.add_rule "X", "+FX--FY+"   # replace X rule see 'grammar' library
    grammar.add_rule "Y", "-FX++FY-"   # replace Y rule see 'grammar' library
    @start_length = 240.0
    @draw_length = start_length
    @theta = (Math::PI/180) * 45.0     # convert degrees to radians
    @production = axiom
    stroke 255
  end

  def render                           # using affine transforms
    translate(width/3, height/3)
    rotate theta * 2
    production.each_char do |element|
      case element
      when 'F'
        line(0, 0, 0, -draw_length)      
        translate(0, -draw_length)
      when '+'
        rotate theta
      when '-'
        rotate -theta
      when 'X','Y'                    # do nothing except recognize the grammar
      else
        puts "Character '#{element}' is not in grammar" 
      end
    end
  end
  
  ##############################
  # create grammar from axiom and
  # rules (adjust scale)
  ##############################
  
  def create_grammar(gen)
    @draw_length *=  0.64**gen
    @production = grammar.generate gen
  end
end  



 

No comments:

Post a Comment

Followers

Blog Archive

About Me

My photo
I have developed JRubyArt and propane new versions of ruby-processing for JRuby-9.1.5.0 and processing-3.2.2