Koch curve generator
 
 
 
 
 
 false
 false
 
 true
 
 macros_menu.examples>end("Examples").end
 ruby
 
 
# @title Creating layouts: the Koch curve
#
# This application creates a <a href="http://en.wikipedia.org/wiki/Koch_snowflake">Koch curve</a> which 
# is constructed by the recursive application
# of a generation recipe. In our case, this recipe is implemented by instantiating cells. An exact 
# implementation would require a cell to call itself, but this is not allowed in this framework. Instead,
# a set of up to 20 cells is created with each cell calling the successive one in the same fashion.
# 
# When zooming deeply into the curve, the viewer gets pretty slow which is a consequence of the 
# performance degradation of the underlying quad tree when the quads get really small. However, since this application is a pretty 
# artificial one, I hope that this is not a serious imperfection ...
module Examples
 
  #  create one level of recursion
  #  unless the level is deeper than the maximum level, create a new cell and instantiate this in 
  #  the given upper cell four times rendering the Sierpinski curve.
  
  def self.create_recursion(layout, cell_id, layer_id, rec_level)
  
    if rec_level > 20
  
      #  max. recursion depth reached: just paint a straight line 
      edge = RBA::Edge.new(RBA::Point::new(0, 0), RBA::Point::new(3000, 0))
      layout.cell(cell_id).shapes(layer_id).insert_edge(edge) 
  
    else
     
      #  create a new cell 
      new_cell = layout.add_cell("level" + rec_level.to_s)
      cell = layout.cell(cell_id)
  
      #  and add four instances of it
      insts = [
        RBA::CellInstArray::new(new_cell, RBA::CplxTrans::new(1.0 / 3.0, 0.0, false, RBA::DPoint::new(0.0, 0.0))),
        RBA::CellInstArray::new(new_cell, RBA::CplxTrans::new(1.0 / 3.0, 60.0, false, RBA::DPoint::new(1000.0, 0.0))),
        RBA::CellInstArray::new(new_cell, RBA::CplxTrans::new(1.0 / 3.0, -60.0, false, RBA::DPoint::new(1500.0, 1000 * Math::sin(Math::PI / 3.0)))),
        RBA::CellInstArray::new(new_cell, RBA::CplxTrans::new(1.0 / 3.0, 0.0, false, RBA::DPoint::new(2000.0, 0.0)))
      ]
      insts.each { |i| cell.insert(i) }
    
      #  recursively create new cells on this one
      create_recursion(layout, new_cell, layer_id, rec_level + 1)
  
    end
  
  end    
  
  app = RBA::Application.instance
  mw = app.main_window
  
  #  create a new layout 
  mw.create_layout(0)
  view = mw.current_view
  
  #  create a new layer in that layout
  layout = view.cellview(0).layout 
  linfo = RBA::LayerInfo.new 
  layer_id = layout.insert_layer(linfo)
  
  #  create a layer view for that layer
  ln = RBA::LayerPropertiesNode::new
  ln.dither_pattern = 0
  ln.fill_color = 0xffff00
  ln.frame_color = 0xffff00
  ln.width = 1
  ln.source_layer_index = layer_id
  view.insert_layer(view.end_layers, ln)
  
  #  create a top cell and start the recursion on this
  topcell_id = layout.add_cell("top")
  create_recursion(layout, topcell_id, layer_id, 1)
  
  #  select his cell as the top cell, fit all and switch on all hierarchy levels
  view.select_cell_path([topcell_id], 0)
  view.update_content
  view.zoom_fit
  view.max_hier
end