Approximate Cesàro fractal loosely based on mariojan C++ version.
load_library 'context_free'
def setup_the_triangle
@triangle = ContextFree.define do
class << self
define_method(:wedge) do |some_options| # thin triangle
size, options = *get_shape_values(some_options)
rot = options[:rotation]
rotate(rot) if rot
super.triangle(-0.03 * size, 0, 0, -size, 0.03 * size, 0)
rotate(-rot) if rot
end
end
rule :tri do
wedge :y => -0.5
split do
[90, -90, 180, 0].each do |rot|
rewind
tri :y => 0.66667, :rotation => rot, :size => 0.5, :set_brightness => 1, :set_saturation => 1, :set_alpha => 1
rewind
end
end
end
rule :four do
split do
4.times do |i|
split do
tri :rotation => 90 * i
rewind
end
end
end
end
rule :cesaro do
four :rotation => 45
end
end
end
def setup
size 400, 400
setup_the_triangle
no_stroke
color_mode HSB, 1.0
smooth
draw_it
end
def draw_it
background 0, 0.1, 0.1, 1.0
@triangle.render :cesaro, :size => height * 1.05, :stop_size => 3, :start_y => height/2, :start_x => width/2, :color => [0, 0.8, 0.8, 0.2]
end
Experiments with ruby-processing (processing-2.2.1) and JRubyArt for processing-3.0
Wednesday, 16 June 2010
Friday, 11 June 2010
Exploring Dynamic Randomness in ruby-processing context-free DSL
Here is a context free sketch that really needs to be run to appreciate it (links to library download at github above). I'm not sure why the bands don't fit edge to edge, still it does not spoil the effect. There is definitely an illusion of lateral movement with the colored bands, further owing to persistence of vision, the circles and squares seem to dissolve into each other.
load_library 'context_free'
def setup_the_streak
@streak = ContextFree.define do
rule :streak do
split do
10.times do |j|
lines :y => j
rewind
end
end
end
rule :lines do
split do
10.times do |i|
tri :x => i
rewind
end
end
end
rule :tri do
square :size => 1.0, :color => [rand, 1.0, 1.0, 1.0]
end
rule :tri do
circle :size => 1.0, :color => [rand, 1.0, 1.0, 1.0]
end
end
end
def setup
size 600, 600
color_mode HSB, 1.0
setup_the_streak
no_stroke
smooth
draw_it
end
def draw_it
background 0.1
@streak.render :streak, :size => height/9, :stop_size => 3, :start_y => 0, :start_x => 0
end
def draw
draw_it
end
load_library 'context_free'
def setup_the_streak
@streak = ContextFree.define do
rule :streak do
split do
10.times do |j|
lines :y => j
rewind
end
end
end
rule :lines do
split do
10.times do |i|
tri :x => i
rewind
end
end
end
rule :tri do
square :size => 1.0, :color => [rand, 1.0, 1.0, 1.0]
end
rule :tri do
circle :size => 1.0, :color => [rand, 1.0, 1.0, 1.0]
end
end
end
def setup
size 600, 600
color_mode HSB, 1.0
setup_the_streak
no_stroke
smooth
draw_it
end
def draw_it
background 0.1
@streak.render :streak, :size => height/9, :stop_size => 3, :start_y => 0, :start_x => 0
end
def draw
draw_it
end
Labels:
context free,
DSL,
dynamic random,
ruby processing
Sunday, 6 June 2010
Towards an Escher Bird Tiling (Ruby processing context-free DSL)
load_libraries 'context_free'
def setup_the_birds
@birds= ContextFree.define do
############ Begin defining custom terminal, an wavy_triangle triangle
class << self
define_method(:wavy_diamond) do |some_options| # wavy_triangle triangle
size, options = *self.get_shape_values(some_options)
rot = options[:rotation]
x0 = options[:x]
y0 = options[:y]
disp = options[:disp]
pts = Array.new(16)
pts[0] = PVector.new(x0 - 0.25 * size, y0 - size/Math.sqrt(3)) # A
pts[2] = PVector.new(x0 + 0.75 * size, y0 - size/Math.sqrt(3)) # B
pts[4] = PVector.new(x0 + 0.25 * size, y0 + (Math.sqrt(3)*size)/6) # C
pts[6] = PVector.new(x0 - 0.75 * size, y0 + (Math.sqrt(3)*size)/6) # D
pts[1] = get_mid_point(pts[0], pts[2])#Ab
pts[3] = get_mid_point(pts[2], pts[4])#Bc
pts[5] = get_mid_point(pts[4], pts[6])#Cd
pts[7] = get_mid_point(pts[6], pts[0])#Da
pts[8] = get_mid_point(pts[0], pts[1])#Aba
adjust_bezier(pts[8], PI/2, -disp * size)#Aba
pts[9] = get_mid_point(pts[1], pts[2])
adjust_bezier(pts[9], PI/2, disp * size)
pts[10] = get_mid_point(pts[2], pts[3])
adjust_bezier(pts[10], PI/3, disp * size)
pts[11] = get_mid_point(pts[3], pts[4])
adjust_bezier(pts[11], PI/3, -disp * size)
pts[12] = get_mid_point(pts[4], pts[5])
adjust_bezier(pts[12], PI/2, disp * size)
pts[13] = get_mid_point(pts[5], pts[6])
adjust_bezier(pts[13], PI/2, -disp * size)
pts[14] = get_mid_point(pts[6], pts[7])
adjust_bezier(pts[14], PI/3, -disp * size)
pts[15] = get_mid_point(pts[7], pts[0])
adjust_bezier(pts[15], PI/3, disp * size)
rotate(rot) if rot
smooth
stroke 0
begin_shape
vertex(pts[0].x, pts[0].y)
bezier_vertex(pts[0].x, pts[0].y, pts[8].x, pts[8].y, pts[1].x, pts[1].y)
bezier_vertex(pts[1].x, pts[1].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[3].x, pts[3].y)
bezier_vertex(pts[3].x, pts[3].y, pts[11].x, pts[11].y, pts[4].x, pts[4].y)
bezier_vertex(pts[4].x, pts[4].y, pts[12].x, pts[12].y, pts[5].x, pts[5].y)
bezier_vertex(pts[5].x, pts[5].y, pts[13].x, pts[13].y, pts[6].x, pts[6].y)
bezier_vertex(pts[6].x, pts[6].y, pts[14].x, pts[14].y, pts[7].x, pts[7].y)
bezier_vertex(pts[7].x, pts[7].y, pts[15].x, pts[15].y, pts[0].x, pts[0].y)
vertex(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_diamond' shape
rule :birds do
10.times do |i|
10.times do |j|
wavy_diamond :size => 1, :x => (i*2 + 0.5 * j%2), :y => j * 0.9
end
end
end
end
end
def setup
size 400, 400
smooth
setup_the_birds
draw_it
end
def draw_it
background 255
@birds.render :birds, :start_x => -50, :start_y => 20,
:size => height/6, :color => [0, 0.8, 0.8, 1], :disp => 0.32
end
def draw
# do nothing
end
Labels:
context free,
DSL,
escher,
ruby processing
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
Labels:
context free,
DSL,
ruby processing
Alhambra Tiling Ruby Processing Context Free DSL
load_library 'context_free'
def setup_the_tiles
@tiles= ContextFree.define do
############ Begin defining custom terminal, an wavy_triangle triangle
class << self
define_method(:wavy_triangle) do |some_options| # wavy_triangle 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_triangle' shape
rule :tiles do
10.times do |i|
10.times do |j|
wavy_triangle :size => 1, :x => (i + 0.5 * j%2), :y => j * 0.9
end
end
end
end
end
def setup
size 400, 400
background 255
smooth
setup_the_tiles
draw_it
end
def draw_it
@tiles.render :tiles, :start_x => -50, :start_y => 20,
:size => height/6, :color => [0, 0.8, 0.8, 1]
end
Labels:
alhambra,
context free,
custom terminal,
ruby processing
Thursday, 3 June 2010
Red Dwarf (Ruby Processing Context Free DSL)
load_library 'context_free'
def setup_the_red_dwarf
@red_dwarf = ContextFree.define do
rule :red_dwarf do
5.times do |i|
angle :rotation => 72
end
end
rule :angle do
110.times do |i|
triangle :size => 1.01, :rotation => i, :y => -1, :alpha => 0.1
end
end
end
end
def setup
size 600, 600
smooth
setup_the_red_dwarf
draw_it
end
def draw
# do nothing
end
def draw_it
background 0
@red_dwarf.render :red_dwarf,
:start_x => width/2, :start_y => height/2,
:size => height/1.5, :color => [0.01, 1, 1, 0.1]
end
def mouse_clicked
draw_it
end
Labels:
context free,
DSL,
red dwarf
Subscribe to:
Posts (Atom)
Followers
Blog Archive
-
▼
2010
(73)
-
▼
June
(6)
- Cesàro fractal using ruby processing context free ...
- Exploring Dynamic Randomness in ruby-processing co...
- Towards an Escher Bird Tiling (Ruby processing con...
- Weird Flower Ruby Processing Context Free DSL
- Alhambra Tiling Ruby Processing Context Free DSL
- Red Dwarf (Ruby Processing Context Free DSL)
-
▼
June
(6)
About Me
- monkstone
- I have developed JRubyArt and propane new versions of ruby-processing for JRuby-9.1.5.0 and processing-3.2.2