-
Notifications
You must be signed in to change notification settings - Fork 1
How to use the library
The first thing do to is to run the included samples, it will give you an idea of what can be done. It might also be interesting to look at the huge range of examples at contextfreeart.org for inspiration. However there are some limitations on what can be achieved, I have not yet implemented a depth sampling function so contextfreeart sketches that use the z parameter cannot be translated. But interestingly some sketches like my 'y' sketch (see README) are not possible using the C++ program, nor is there a gui for adjusting the running sketch (control-panel ruby-processing see sierpinski.rb). The following example demonstrates many of the DSL features.
# city.rb after city.cfdg
require 'cf3'
def setup_the_city
@city = ContextFree.define do
shape :neighborhood do
split do
block x: -0.25, y: -0.25
rewind
block x: 0.25, y: -0.25
rewind
block x: 0.25, y: 0.25
rewind
block x: -0.25, y: 0.25
end
end
shape :block do
buildings size: 0.85
end
shape :block, 5 do
neighborhood size: 0.5, rotation: rand(-PI..PI), hue: rand(2), brightness: rand(0.75..1.75)
end
shape :block, 0.1 do
# Do nothing
end
shape :buildings do
square
end
end
end
def settings
size 600, 600
end
def setup
sketch_title 'City'
setup_the_city
@background = color 255, 255, 255
draw_it
end
def draw
# Do nothing
end
def draw_it
background @background
@city.render :neighborhood,
start_x: width/2, start_y: height/2,
size: height/2.5, color: [0.1, 0.1, 0.1]
end
def mouse_clicked
draw_it
end
Since contextfreeart version 3.0 the basic rule, is now called a shape. There may more than one of these shape rules included in the grammar:-
See :block above where there are three, each given a different weighting or probability, no number given uses a default a weighting factor of 1.0 (in this case we have weighting of 5.0, 1,0 and 0.1 = sum 6.1). The actual probability of the first :block rule being run is 5.0 / 6.1 and the others follow. So for example we look at the :neighbourhood shape rule we call :block 4 times, and the actual :block shape rules get run according to their probabilities. So what does rewind do, well with out rewind the shape would get drawn according the current position size etc rewind restores the position size etc to where it would have been if the immediately preceding shape rule had not been run. See isoceles.rb for example of a sketch which requires that the current position/size is advanced with each recursive step ( a recursive spiral has to be one of the simplest context free sketches ). So what actually gets drawn, well on terminal shapes get rendered in this case represented by the :building shape rule where a square gets drawn (a processing rect under the hood). The three basic terminals are square, triangle and circle (ellipse under the hood), but user defined shapes may also be declared. I have yet experiment with using PShape which could be interesting.