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