Macro file: fractal.lym

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