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

Saturday 5 June 2010

Weird Flower Ruby Processing Context Free DSL


load_library 'context_free'

def setup_the_flower
  @flower= ContextFree.define do
    ############ Begin defining custom terminal, an wavy triangle        
    class << self    
      define_method(:wavy) do |some_options# wavy triangle
        size, options = *self.get_shape_values(some_options)
        rot = options[:rotation]
        disp = 0.32          # could introduce a rule option?
        x0 = options[:x]
        y0 = options[:y]
        pts = Array.new(12)
        pts[0] = PVector.new(x0, y0 - size/Math.sqrt(3))                  # A
        pts[1] = PVector.new(x0 - 0.5 * size, y0 + (Math.sqrt(3)*size)/6) # B
        pts[2] = PVector.new(x0 + 0.5 * size, y0 + (Math.sqrt(3)*size)/6) # C
        pts[3] = get_mid_point(pts[0], pts[1])                            # Ab
        pts[4] = get_mid_point(pts[1], pts[2])                            # Bc
        pts[5] = get_mid_point(pts[0], pts[2])                            # Ca
        pts[6] = get_mid_point(pts[0], pts[3])                            # Aba
        adjust_bezier(pts[6], PI/3, disp*size)                            # Aba
        pts[7] = get_mid_point(pts[3], pts[1])                            # Abb
        adjust_bezier(pts[7], PI/3, -disp*size)                           # Abb
        pts[8] = get_mid_point(pts[1], pts[4])
        adjust_bezier(pts[8], PI/2, -disp*size)
        pts[9] = get_mid_point(pts[4], pts[2])
        adjust_bezier(pts[9], PI/2, disp*size)
        pts[10] = get_mid_point(pts[2], pts[5])
        adjust_bezier(pts[10], -PI/3, -disp*size)
        pts[11] = get_mid_point(pts[5], pts[0])
        adjust_bezier(pts[11], -PI/3, disp*size)
        rotate(rot) if rot
        begin_shape
          vertex(pts[0].x, pts[0].y)
          bezier_vertex(pts[0].x, pts[0].y, pts[6].x, pts[6].y, pts[3].x, pts[3].y)
          bezier_vertex(pts[3].x, pts[3].y, pts[7].x, pts[7].y, pts[1].x, pts[1].y)
          bezier_vertex(pts[1].x, pts[1].y, pts[8].x, pts[8].y, pts[4].x, pts[4].y)
          bezier_vertex(pts[4].x, pts[4].y, pts[9].x, pts[9].y, pts[2].x, pts[2].y)
          bezier_vertex(pts[2].x, pts[2].y, pts[10].x, pts[10].y, pts[5].x, pts[5].y)
          bezier_vertex(pts[5].x, pts[5].y, pts[11].x, pts[11].y, pts[0].x, pts[0].y)
        end_shape(CLOSE)        
        rotate(-rot) if rot
      end
    
      private
      def adjust_bezier(base, theta, disp)
        base.add(PVector.new(Math.cos(theta)*disp, Math.sin(theta)*disp))
      end
    
      def get_mid_point(a, b)
        mid = PVector.add(a, b)
        mid.div(2)
        return mid
      end
    end
  
    ########### End definition of custom terminal 'wavy' shape
    rule :flower do
      split do
      6.times do |i|
        petal :size => 1, :rotation => 60 * i, :y => -0.2866
        rewind
      end
      end
    end
  
    rule :petal do
      wavy :rotation => 7.5
    end
  end
end

def setup
  size 400, 400
  background 255
  smooth
  setup_the_flower
  draw_it
end

def draw_it
  @flower.render :flower, :start_x => width/2, :start_y => height*0.66,
               :size => height*0.55, :color => [0, 0.5, 0.8, 0.5]
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