cf3 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +4 -0
- data/lib/cf3.rb +9 -7
- data/lib/cf3/version.rb +1 -1
- data/samples/dragon.rb +9 -7
- data/samples/fern.rb +1 -1
- data/samples/sierpinski.rb +20 -15
- data/samples/tree.rb +4 -5
- data/samples/tree4.rb +6 -7
- data/samples/xcross.rb +43 -0
- metadata +3 -4
- data/samples/alhambra2.rb +0 -98
- data/samples/grapher.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e17853f9381b6ed49bc8167e843761fa8a14f21
|
4
|
+
data.tar.gz: 5dc00b417e9f3bfe81809b418507f30d015fd72c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 042745bf5d971d9f3f3d63d55f6ca0a99c1604e888b223ee29e2b6cf062f41cab21b7a6d5170d470a8dcff0dceab6b33e461e38a2d6a2271e7985741a3231c5a
|
7
|
+
data.tar.gz: f7bc02c7d7492ebef52e4c29c3ccffbefeb80ee1f42f8e7c8685b7fcd0d289b5c1a89bfccb3be6d28bce80a6a43128c7bd4ecb6c4d7d65e542abbc9fbe116f38
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
v0.0.4 Introduce :w and :h as options to supplement size
|
2
|
+
* start support for width and height options (:w, :h)
|
3
|
+
|
4
|
+
|
1
5
|
v0.0.3 Change to use HSB 360 1 1 1 (ie just like cfdg)
|
2
6
|
* rotation of primitives like shapes now in degrees (vs radians)
|
3
7
|
* examples updated, includes a colorful alhambra design
|
data/lib/cf3.rb
CHANGED
@@ -10,7 +10,7 @@ module Processing
|
|
10
10
|
|
11
11
|
attr_accessor :rule, :app, :width, :height
|
12
12
|
|
13
|
-
AVAILABLE_OPTIONS = [:x, :y, :rotation, :size, :flip, :color, :hue, :saturation, :brightness, :alpha]
|
13
|
+
AVAILABLE_OPTIONS = [:x, :y, :w, :h, :rotation, :size, :flip, :color, :hue, :saturation, :brightness, :alpha]
|
14
14
|
HSB_ORDER = {hue: 0, saturation: 1, brightness: 2, alpha: 3}
|
15
15
|
TRIANGLE_TOP = -1 / Math.sqrt(3)
|
16
16
|
TRIANGLE_BOTTOM = Math.sqrt(3) / 6
|
@@ -103,8 +103,8 @@ module Processing
|
|
103
103
|
old_ops[:color] = adjusted
|
104
104
|
when :flip
|
105
105
|
old_ops[key] = !old_ops[key]
|
106
|
-
when :
|
107
|
-
old_ops[key]
|
106
|
+
when :w, :h
|
107
|
+
old_ops[key] = value * old_ops[:size]
|
108
108
|
when :color
|
109
109
|
old_ops[key] = value
|
110
110
|
else # Used a key that we don't know about or trying to set
|
@@ -168,7 +168,7 @@ module Processing
|
|
168
168
|
def render(rule_name, starting_values={})
|
169
169
|
@values = {x: 0, y: 0,
|
170
170
|
rotation: 0, flip: false,
|
171
|
-
size: 20,
|
171
|
+
size: 20, w: nil, h: nil,
|
172
172
|
start_x: width/2, start_y: height/2,
|
173
173
|
color: [180, 0.5, 0.5, 1],
|
174
174
|
stop_size: 1.5}
|
@@ -206,9 +206,11 @@ module Processing
|
|
206
206
|
# methods, but hopefully triangles will be added soon.
|
207
207
|
def square(some_options={})
|
208
208
|
size, options = *get_shape_values(some_options)
|
209
|
+
width = options[:w] || options[:size]
|
210
|
+
height = options[:h] || options[:size]
|
209
211
|
rot = options[:rotation]
|
210
212
|
@app.rotate(rot) if rot
|
211
|
-
@app.rect(0, 0,
|
213
|
+
@app.rect(0, 0, width, height)
|
212
214
|
@app.rotate(-rot) if rot
|
213
215
|
end
|
214
216
|
|
@@ -229,8 +231,8 @@ module Processing
|
|
229
231
|
|
230
232
|
def ellipse(some_options={})
|
231
233
|
size, options = *get_shape_values(some_options)
|
232
|
-
width = options[:
|
233
|
-
height = options[:
|
234
|
+
width = options[:w] || options[:size]
|
235
|
+
height = options[:h] || options[:size]
|
234
236
|
rot = some_options[:rotation]
|
235
237
|
@app.rotate(rot) if rot
|
236
238
|
@app.oval(options[:x] || 0, options[:y] || 0, width, height)
|
data/lib/cf3/version.rb
CHANGED
data/samples/dragon.rb
CHANGED
@@ -2,23 +2,25 @@
|
|
2
2
|
|
3
3
|
require 'cf3'
|
4
4
|
|
5
|
+
INV_SQRT = 1 / Math.sqrt(2)
|
6
|
+
|
5
7
|
def setup_the_dragon
|
6
8
|
@dragon = ContextFree.define do
|
7
|
-
|
9
|
+
|
8
10
|
shape :start do
|
9
11
|
dragon alpha: 1
|
10
12
|
end
|
11
|
-
|
13
|
+
|
12
14
|
shape :dragon do
|
13
15
|
square hue: 0, brightness: 0, saturation: 1, alpha: 0.02
|
14
16
|
split do
|
15
|
-
dragon size:
|
17
|
+
dragon size: INV_SQRT, rotation: -45, x: 0.25, y: 0.25
|
16
18
|
rewind
|
17
|
-
dragon size:
|
19
|
+
dragon size: INV_SQRT, rotation: 135, x: 0.25, y: 0.25
|
18
20
|
rewind
|
19
21
|
end
|
20
22
|
end
|
21
|
-
|
23
|
+
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
@@ -35,6 +37,6 @@ end
|
|
35
37
|
|
36
38
|
def draw_it
|
37
39
|
background 255
|
38
|
-
@dragon.render :start, size: width*0.8, stop_size: 2,
|
39
|
-
|
40
|
+
@dragon.render :start, size: width * 0.8, stop_size: 2,
|
41
|
+
start_x: width/3, start_y: height / 3.5
|
40
42
|
end
|
data/samples/fern.rb
CHANGED
@@ -3,7 +3,7 @@ require 'cf3'
|
|
3
3
|
#######################################################
|
4
4
|
# This sketch takes some time to develop, #
|
5
5
|
# clicking the mouse, allows you view current state #
|
6
|
-
# final state background green
|
6
|
+
# in the final state background will be green #
|
7
7
|
#######################################################
|
8
8
|
|
9
9
|
def setup_the_fern
|
data/samples/sierpinski.rb
CHANGED
@@ -2,25 +2,23 @@ require 'cf3'
|
|
2
2
|
|
3
3
|
load_library 'control_panel'
|
4
4
|
|
5
|
-
attr_accessor :resolution, :panel
|
5
|
+
attr_accessor :resolution, :panel, :hide
|
6
6
|
|
7
|
-
def setup_the_triangle
|
8
|
-
|
7
|
+
def setup_the_triangle
|
9
8
|
@triangle = ContextFree.define do
|
10
9
|
shape :tri do
|
11
|
-
triangle size: 0.5, rotation:
|
10
|
+
triangle size: 0.5, rotation: 180
|
12
11
|
split do
|
13
12
|
tri size: 0.5, y: -0.578, x: 0,
|
14
|
-
|
13
|
+
hue: 288, saturation: 0.2, brightness: 0.8
|
15
14
|
rewind
|
16
|
-
tri size: 0.5, y: 0.289, x: -0.5, hue:
|
17
|
-
|
15
|
+
tri size: 0.5, y: 0.289, x: -0.5, hue: 72,
|
16
|
+
saturation: 0.2, brightness: 0.8
|
18
17
|
rewind
|
19
|
-
tri size: 0.5, y: 0.289, x: 0.5, hue:
|
20
|
-
|
18
|
+
tri size: 0.5, y: 0.289, x: 0.5, hue: 72,
|
19
|
+
saturation: 0.2, brightness: 0.8
|
21
20
|
end
|
22
|
-
end
|
23
|
-
|
21
|
+
end
|
24
22
|
end
|
25
23
|
end
|
26
24
|
|
@@ -28,17 +26,24 @@ def setup
|
|
28
26
|
size 600, 600
|
29
27
|
setup_the_triangle
|
30
28
|
no_stroke
|
31
|
-
|
32
|
-
smooth
|
29
|
+
@hide = false
|
33
30
|
@resolution = 5
|
34
31
|
control_panel do |p|
|
32
|
+
p.look_feel "Metal" # optionall set look and feel
|
35
33
|
p.slider :resolution, (2..50), 5
|
36
34
|
@panel = p
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
38
|
def draw
|
41
|
-
|
39
|
+
unless hide
|
40
|
+
panel.set_visible(true) # display panel after sketch frame
|
41
|
+
@hide = true
|
42
|
+
end
|
42
43
|
background 0.1
|
43
|
-
@triangle.render :tri, size: height/1.1, color: [0, 0.5, 1], stop_size: @resolution, start_y: height/1.65
|
44
|
+
@triangle.render :tri, size: height/1.1, color: [0, 0.5, 1.0, 1.0], stop_size: @resolution, start_y: height/1.65
|
45
|
+
end
|
46
|
+
|
47
|
+
def mouse_clicked
|
48
|
+
@hide = false
|
44
49
|
end
|
data/samples/tree.rb
CHANGED
@@ -46,11 +46,10 @@ def setup_the_trees
|
|
46
46
|
end
|
47
47
|
|
48
48
|
shape :flower do
|
49
|
-
split saturation: 0, brightness: rand(1.3)+4.7,
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
oval rotation: 135
|
49
|
+
split saturation: 0, brightness: rand(1.3)+4.7, w: rand(15)+10, h: rand(2)+2 do
|
50
|
+
(0 .. 135).step(45) do |rot|
|
51
|
+
oval rotation: rot
|
52
|
+
end
|
54
53
|
end
|
55
54
|
end
|
56
55
|
end
|
data/samples/tree4.rb
CHANGED
@@ -42,24 +42,23 @@ end
|
|
42
42
|
|
43
43
|
def setup
|
44
44
|
size 600, 600
|
45
|
-
|
46
|
-
smooth
|
45
|
+
srand 5 # comment this to get variable tree shape
|
47
46
|
setup_the_tree
|
48
|
-
background 255 # NB color mode here is "RGB 255", within context free definition
|
49
|
-
draw_it # the color mode is "HSB 1.0", supports :hue, :saturation, :brightness
|
50
|
-
# save_frame "/home/tux/tree4.png"
|
51
47
|
end
|
52
48
|
|
53
49
|
def draw
|
54
50
|
# create a draw loop
|
55
51
|
end
|
56
52
|
|
53
|
+
#####
|
54
|
+
# color: [0, 0, 0, 1] even in HSB this should be black, seems to work...
|
55
|
+
#####
|
57
56
|
def draw_it
|
58
|
-
@tree.render :trunk, start_x: width/2, start_y: height * 0.9, stop_size: height/150, size: height/15
|
57
|
+
@tree.render :trunk, start_x: width/2, start_y: height * 0.9, stop_size: height/150, size: height/15, color: [0, 0, 0, 1]
|
59
58
|
end
|
60
59
|
|
61
60
|
def mouse_clicked
|
62
61
|
java.lang.System.gc # might help to reduce runtime stack blow ups, it happens!
|
63
|
-
background
|
62
|
+
background 200
|
64
63
|
draw_it
|
65
64
|
end
|
data/samples/xcross.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'cf3'
|
2
|
+
#######
|
3
|
+
# Simple example demonstrating rewind
|
4
|
+
# also how to make simple composite shapes
|
5
|
+
# from primitive terminals (renders on mouse clicked)
|
6
|
+
###
|
7
|
+
|
8
|
+
def setup
|
9
|
+
size 400, 200
|
10
|
+
@stars = ContextFree.define do
|
11
|
+
|
12
|
+
shape :stars do
|
13
|
+
split do
|
14
|
+
cross size: 0.5, x: -2
|
15
|
+
rewind
|
16
|
+
plus size: 0.5, x: 2
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
shape :cross do
|
21
|
+
square w: 1, h: 3, rotation: -45
|
22
|
+
square w: 1, h: 3, rotation: 45
|
23
|
+
end
|
24
|
+
|
25
|
+
shape :plus do
|
26
|
+
square w: 1, h: 3
|
27
|
+
square w: 1, h: 3, rotation: 90
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def draw_it
|
33
|
+
background 0.2
|
34
|
+
@stars.render :stars, size: height/2, color: [220, 1, 1, 1]
|
35
|
+
end
|
36
|
+
|
37
|
+
def draw
|
38
|
+
# Do nothing.
|
39
|
+
end
|
40
|
+
|
41
|
+
def mouse_clicked
|
42
|
+
draw_it
|
43
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cf3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Ashkenas
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ruby-processing
|
@@ -79,7 +79,6 @@ files:
|
|
79
79
|
- lib/cf3/version.rb
|
80
80
|
- samples/accident.rb
|
81
81
|
- samples/alhambra.rb
|
82
|
-
- samples/alhambra2.rb
|
83
82
|
- samples/bar_code.rb
|
84
83
|
- samples/city.rb
|
85
84
|
- samples/creature.rb
|
@@ -88,7 +87,6 @@ files:
|
|
88
87
|
- samples/dragon.rb
|
89
88
|
- samples/escher.rb
|
90
89
|
- samples/fern.rb
|
91
|
-
- samples/grapher.rb
|
92
90
|
- samples/hex_tube.rb
|
93
91
|
- samples/isosceles.rb
|
94
92
|
- samples/levy.rb
|
@@ -100,6 +98,7 @@ files:
|
|
100
98
|
- samples/tree.rb
|
101
99
|
- samples/tree4.rb
|
102
100
|
- samples/vine.rb
|
101
|
+
- samples/xcross.rb
|
103
102
|
- samples/y.rb
|
104
103
|
- test/test_cf3.rb
|
105
104
|
homepage: http://learning-ruby-processing.blogspot.co.uk/
|
data/samples/alhambra2.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
require 'cf3'
|
2
|
-
#############
|
3
|
-
# to be fixed
|
4
|
-
#############
|
5
|
-
|
6
|
-
GOLD = [33, 0.967, 0.592, 1]
|
7
|
-
BLACK = [0, 0.909, 0.129, 1]
|
8
|
-
GREEN = [148, 0.696, 0.271, 1]
|
9
|
-
BLUE = [225, 0.777, 0.475, 1]
|
10
|
-
RED = [17, 0.983, 0.231, 1]
|
11
|
-
COLORS = [GOLD, BLACK, GREEN, BLUE, RED]
|
12
|
-
|
13
|
-
def setup_the_tiles
|
14
|
-
@tiles= ContextFree.define do
|
15
|
-
############ Begin defining custom terminal, an wavy_triangle triangle
|
16
|
-
class << self
|
17
|
-
define_method(:wavy_triangle) do |some_options| # wavy_triangle triangle
|
18
|
-
size, options = *self.get_shape_values(some_options)
|
19
|
-
rot = options[:rotation]
|
20
|
-
disp = 0.32 # could introduce a rule option?
|
21
|
-
x0 = options[:x]
|
22
|
-
y0 = options[:y]
|
23
|
-
pts = Array.new(12)
|
24
|
-
pts[0] = PVector.new(x0, y0 - size/Math.sqrt(3)) # A
|
25
|
-
pts[1] = PVector.new(x0 - 0.5 * size, y0 + (Math.sqrt(3)*size)/6) # B
|
26
|
-
pts[2] = PVector.new(x0 + 0.5 * size, y0 + (Math.sqrt(3)*size)/6) # C
|
27
|
-
pts[3] = get_mid_point(pts[0], pts[1]) # Ab
|
28
|
-
pts[4] = get_mid_point(pts[1], pts[2]) # Bc
|
29
|
-
pts[5] = get_mid_point(pts[0], pts[2]) # Ca
|
30
|
-
pts[6] = get_mid_point(pts[0], pts[3]) # Aba
|
31
|
-
adjust_bezier(pts[6], PI/3, disp*size) # Aba
|
32
|
-
pts[7] = get_mid_point(pts[3], pts[1]) # Abb
|
33
|
-
adjust_bezier(pts[7], PI/3, -disp*size) # Abb
|
34
|
-
pts[8] = get_mid_point(pts[1], pts[4])
|
35
|
-
adjust_bezier(pts[8], PI/2, -disp*size)
|
36
|
-
pts[9] = get_mid_point(pts[4], pts[2])
|
37
|
-
adjust_bezier(pts[9], PI/2, disp*size)
|
38
|
-
pts[10] = get_mid_point(pts[2], pts[5])
|
39
|
-
adjust_bezier(pts[10], -PI/3, -disp*size)
|
40
|
-
pts[11] = get_mid_point(pts[5], pts[0])
|
41
|
-
adjust_bezier(pts[11], -PI/3, disp*size)
|
42
|
-
rotate(rot) if rot
|
43
|
-
begin_shape
|
44
|
-
vertex(pts[0].x, pts[0].y)
|
45
|
-
bezier_vertex(pts[0].x, pts[0].y, pts[6].x, pts[6].y, pts[3].x, pts[3].y)
|
46
|
-
bezier_vertex(pts[3].x, pts[3].y, pts[7].x, pts[7].y, pts[1].x, pts[1].y)
|
47
|
-
bezier_vertex(pts[1].x, pts[1].y, pts[8].x, pts[8].y, pts[4].x, pts[4].y)
|
48
|
-
bezier_vertex(pts[4].x, pts[4].y, pts[9].x, pts[9].y, pts[2].x, pts[2].y)
|
49
|
-
bezier_vertex(pts[2].x, pts[2].y, pts[10].x, pts[10].y, pts[5].x, pts[5].y)
|
50
|
-
bezier_vertex(pts[5].x, pts[5].y, pts[11].x, pts[11].y, pts[0].x, pts[0].y)
|
51
|
-
end_shape(CLOSE)
|
52
|
-
rotate(-rot) if rot
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
def adjust_bezier(base, theta, disp)
|
57
|
-
base.add(PVector.new(Math.cos(theta)*disp, Math.sin(theta)*disp))
|
58
|
-
end
|
59
|
-
|
60
|
-
def get_mid_point(a, b)
|
61
|
-
mid = PVector.add(a, b)
|
62
|
-
mid.div(2)
|
63
|
-
return mid
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
########### End definition of custom terminal 'wavy_triangle' shape
|
68
|
-
shape :tiles do
|
69
|
-
20.times do |i|
|
70
|
-
20.times do |j|
|
71
|
-
split do
|
72
|
-
wavy_triangle size: 1, x: (i + 0.5 * j%2), y: j * 0.9, color: COLORS[i % 5]
|
73
|
-
rewind
|
74
|
-
star size: 0.4, x: (2.5 * i - 1.25 * j%2) +0.4, y: (j * 2.5 * 0.9) + 1.25, color: COLORS[j % 5]
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
shape :star do
|
81
|
-
triangle
|
82
|
-
triangle rotation: 180
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def setup
|
88
|
-
size 1024, 720
|
89
|
-
background 255
|
90
|
-
smooth
|
91
|
-
setup_the_tiles
|
92
|
-
draw_it
|
93
|
-
end
|
94
|
-
|
95
|
-
def draw_it
|
96
|
-
@tiles.render :tiles, start_x: -200, start_y: 0,
|
97
|
-
size: height/6
|
98
|
-
end
|
data/samples/grapher.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
#########################
|
2
|
-
# grapher.rb by Martin Prout after grapher.cfdg
|
3
|
-
#########################
|
4
|
-
require 'cf3'
|
5
|
-
#load_library :cf3
|
6
|
-
|
7
|
-
def setup_the_hextube
|
8
|
-
@hexa = ContextFree.define do
|
9
|
-
############ Begin defining custom terminal, as a hexagon (path C++ cfdg)
|
10
|
-
class << self
|
11
|
-
define_method(:hexagon) do |some_options|
|
12
|
-
size, options = *self.get_shape_values(some_options)
|
13
|
-
rot = (options[:rotation])? options[:rotation]: 0
|
14
|
-
no_fill
|
15
|
-
stroke(*options[:color])
|
16
|
-
stroke_weight(size/30)
|
17
|
-
begin_shape
|
18
|
-
6.times do |i|
|
19
|
-
vertex(size * Math.cos(Math::PI * i/3 + rot), size * Math.sin(Math::PI * i/3 + rot))
|
20
|
-
end
|
21
|
-
end_shape(CLOSE)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
########### End definition of custom terminal 'hexagon'
|
25
|
-
shape :hextube do
|
26
|
-
hexa brightness: 1.0
|
27
|
-
end
|
28
|
-
|
29
|
-
shape :hexa do |i = nil, j = 0.5|
|
30
|
-
hexagon size: 1, brightness: 1.0
|
31
|
-
hexa size: 0.9, rotation: 5 *j
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def setup
|
37
|
-
size 800, 800
|
38
|
-
background 0
|
39
|
-
smooth
|
40
|
-
setup_the_hextube
|
41
|
-
draw_it
|
42
|
-
end
|
43
|
-
|
44
|
-
def draw_it
|
45
|
-
@hexa.render :hextube, start_x: width/2, start_y: height/2,
|
46
|
-
size: height/2.1, color: [0, 1, 1, 0.5]
|
47
|
-
end
|