ruby-processing 1.0.8 → 1.0.9
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.
- data/CHANGELOG +6 -0
- data/lib/core/core.jar +0 -0
- data/lib/core/jruby-complete.jar +0 -0
- data/lib/ruby-processing.rb +5 -10
- data/lib/ruby-processing/app.rb +139 -98
- data/lib/ruby-processing/exporters/applet_exporter.rb +4 -1
- data/lib/ruby-processing/exporters/application_exporter.rb +5 -1
- data/lib/ruby-processing/exporters/base_exporter.rb +3 -2
- data/lib/ruby-processing/runner.rb +54 -46
- data/lib/ruby-processing/runners/base.rb +6 -7
- data/lib/ruby-processing/runners/live.rb +4 -3
- data/lib/ruby-processing/runners/watch.rb +33 -27
- data/library/control_panel/control_panel.rb +24 -23
- data/samples/anar/data/java_args.txt +1 -0
- data/samples/anar/extrusion.rb +49 -0
- data/samples/anar/l_system.rb +86 -0
- data/samples/anar/library/anar/anar.jar +0 -0
- data/samples/anar/many_shapes.rb +98 -0
- data/samples/empathy.rb +73 -0
- data/samples/gravity.rb +113 -0
- data/samples/peasy_cam/data/java_args.txt +1 -0
- data/samples/peasy_cam/hello_peasy.rb +29 -0
- data/samples/peasy_cam/hilbert_fractal.rb +40 -0
- data/samples/peasy_cam/library/PeasyCam/PeasyCam.jar +0 -0
- data/samples/peasy_cam/library/hilbert/hilbert.rb +99 -0
- data/samples/processing_app/3D/form/brick_tower.rb +3 -3
- data/samples/processing_app/basics/data/characters_strings/characters_strings.rb +5 -7
- data/samples/processing_app/basics/form/triangle_strip.rb +11 -11
- data/samples/processing_app/basics/input/keyboard.rb +2 -8
- data/samples/processing_app/basics/input/keyboard_2.rb +4 -4
- data/samples/processing_app/basics/input/keyboard_functions.rb +12 -21
- metadata +41 -64
data/samples/gravity.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# After Gravity by Christian Hahn
|
2
|
+
|
3
|
+
attr_reader :particles, :grabbed
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@particles = []
|
7
|
+
@grabbed = nil
|
8
|
+
|
9
|
+
size 600, 500
|
10
|
+
background 0
|
11
|
+
smooth
|
12
|
+
stroke_weight 4
|
13
|
+
ellipse_mode CENTER_DIAMETER
|
14
|
+
color_mode RGB, 255
|
15
|
+
end
|
16
|
+
|
17
|
+
def draw
|
18
|
+
no_stroke
|
19
|
+
fill 0, 60
|
20
|
+
rect 0, 0, width, height
|
21
|
+
@particles.each {|p| p.collect_force; p.move; p.render }
|
22
|
+
end
|
23
|
+
|
24
|
+
def mouse_pressed
|
25
|
+
return if mouse_x == 0 || mouse_y == 0
|
26
|
+
return if particle_grab
|
27
|
+
@particles << Particle.new(mouse_x, mouse_y, rand * 8 + 0.1)
|
28
|
+
end
|
29
|
+
|
30
|
+
def mouse_released
|
31
|
+
@grabbed = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def particle_grab
|
35
|
+
@grabbed = @particles.detect {|p| dist(mouse_x, mouse_y, p.x1, p.y1) < p.radius }
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
class Particle
|
40
|
+
|
41
|
+
GRAVITY = 1.0
|
42
|
+
|
43
|
+
attr_reader :x0, :y0, :x1, :y1, :radius, :mass_amount
|
44
|
+
|
45
|
+
def initialize(x, y, mass)
|
46
|
+
@x0, @y0, @x1, @y1 = x, y, x, y
|
47
|
+
@x_speed, @y_speed = 0, 0
|
48
|
+
@x_accel, @y_accel = 0, 0
|
49
|
+
@mass_amount = mass
|
50
|
+
@diameter = Math.sqrt(@mass_amount) * 20
|
51
|
+
@radius = @diameter / 2.0
|
52
|
+
end
|
53
|
+
|
54
|
+
def collect_force
|
55
|
+
@x_accel, @y_accel = 0, 0
|
56
|
+
@min_dist = 1000
|
57
|
+
$app.particles.each do |p|
|
58
|
+
next if p == self
|
59
|
+
g_dist = dist(@x0, @y0, p.x0, p.y0)
|
60
|
+
g_theta = -(angleOf(@x0, @y0, p.x0, p.y0)).radians
|
61
|
+
@min_dist = g_dist if g_dist < @min_dist
|
62
|
+
force = (GRAVITY * @mass_amount * p.mass_amount) / g_dist
|
63
|
+
if g_dist.abs > @diameter
|
64
|
+
@x_accel += force / @mass_amount * Math.cos(g_theta)
|
65
|
+
@y_accel += force / @mass_amount * Math.sin(g_theta)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def move
|
71
|
+
@x_speed, @y_speed = 0, 0 if grabbed?
|
72
|
+
@x_speed += @x_accel
|
73
|
+
@y_speed += @y_accel
|
74
|
+
@x1, @y1 = @x0 + @x_speed, @y0 + @y_speed
|
75
|
+
end
|
76
|
+
|
77
|
+
def grabbed?
|
78
|
+
$app.grabbed == self
|
79
|
+
end
|
80
|
+
|
81
|
+
def render
|
82
|
+
no_stroke
|
83
|
+
grabbed? ? render_grabbed : render_free
|
84
|
+
end
|
85
|
+
|
86
|
+
def render_free
|
87
|
+
charge_col = 1000.0 / @min_dist / 50.0
|
88
|
+
tot_col_1 = 100 + charge_col * 6
|
89
|
+
tot_col_2 = 150 + charge_col*charge_col
|
90
|
+
tot_col_3 = @diameter + 8 + charge_col
|
91
|
+
fill(tot_col_1, tot_col_1, 255, charge_col * 150 + 3)
|
92
|
+
ellipse(@x1, @y1, tot_col_3, tot_col_3)
|
93
|
+
fill 0, 255
|
94
|
+
stroke tot_col_2, tot_col_2, 255, charge_col * 255 + 3
|
95
|
+
ellipse @x1, @y1, @diameter, @diameter
|
96
|
+
@x0, @y0 = @x1, @y1
|
97
|
+
end
|
98
|
+
|
99
|
+
def render_grabbed
|
100
|
+
fill 150, 150, 255, 100
|
101
|
+
ellipse mouse_x, mouse_y, @diameter + 8, @diameter + 8
|
102
|
+
fill 0, 255
|
103
|
+
stroke 150, 150, 255, 255
|
104
|
+
ellipse mouse_x, mouse_y, @diameter, @diameter
|
105
|
+
@x0, @y0 = mouse_x, mouse_y
|
106
|
+
end
|
107
|
+
|
108
|
+
def angleOf(x1, y1, x2, y2)
|
109
|
+
xd, yd = x1 - x2, y1 - y2
|
110
|
+
180 + (-(180 * Math.atan2(yd, xd)) / PI)
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
-Xms256m -Xmx256m
|
@@ -0,0 +1,29 @@
|
|
1
|
+
load_library 'PeasyCam'
|
2
|
+
import 'peasy'
|
3
|
+
|
4
|
+
attr_reader :cam
|
5
|
+
|
6
|
+
def setup
|
7
|
+
size 200, 200, P3D
|
8
|
+
configure_camera
|
9
|
+
end
|
10
|
+
|
11
|
+
def configure_camera
|
12
|
+
@cam = PeasyCam.new(self, 100)
|
13
|
+
cam.set_minimum_distance 50
|
14
|
+
cam.set_maximum_distance 500
|
15
|
+
end
|
16
|
+
|
17
|
+
def draw
|
18
|
+
rotate_x -0.5
|
19
|
+
rotate_y -0.5
|
20
|
+
background 0
|
21
|
+
fill 255, 0, 0
|
22
|
+
box 30
|
23
|
+
push_matrix
|
24
|
+
translate 0, 0, 20
|
25
|
+
fill 0, 0, 255
|
26
|
+
box 5
|
27
|
+
pop_matrix
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
########################################################
|
2
|
+
# A 3D Hilbert fractal implemented using a
|
3
|
+
# Lindenmayer System in ruby-processing by Martin Prout
|
4
|
+
# Best if you've got opengl
|
5
|
+
########################################################
|
6
|
+
|
7
|
+
class Hilbert_Test < Processing::App
|
8
|
+
full_screen # NB: All distances are relative to screen height
|
9
|
+
load_libraries 'hilbert', 'PeasyCam', 'opengl'
|
10
|
+
import 'peasy'
|
11
|
+
import "processing.opengl" if library_loaded? "opengl"
|
12
|
+
attr_reader :hilbert, :cam
|
13
|
+
|
14
|
+
def setup
|
15
|
+
library_loaded?(:opengl) ? configure_opengl : render_mode(P3D)
|
16
|
+
configure_peasycam
|
17
|
+
@hilbert = Hilbert.new(height)
|
18
|
+
hilbert.create_grammar 3
|
19
|
+
no_stroke
|
20
|
+
end
|
21
|
+
|
22
|
+
def configure_peasycam
|
23
|
+
cam = PeasyCam.new self, height / 6.5
|
24
|
+
cam.set_minimum_distance height / 10
|
25
|
+
cam.set_maximum_distance height
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure_opengl
|
29
|
+
render_mode OPENGL
|
30
|
+
hint ENABLE_OPENGL_4X_SMOOTH # optional
|
31
|
+
hint DISABLE_OPENGL_ERROR_REPORT # optional
|
32
|
+
end
|
33
|
+
|
34
|
+
def draw
|
35
|
+
background 0
|
36
|
+
lights
|
37
|
+
hilbert.render
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
Binary file
|
@@ -0,0 +1,99 @@
|
|
1
|
+
############################
|
2
|
+
# Non-stochastic grammar
|
3
|
+
# with unique premise/rules
|
4
|
+
############################
|
5
|
+
class Grammar
|
6
|
+
attr_accessor :axiom, :rules
|
7
|
+
|
8
|
+
def initialize axiom
|
9
|
+
@axiom = axiom
|
10
|
+
@rules = Hash.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_rule premise, rule
|
14
|
+
rules.store(premise, rule)
|
15
|
+
end
|
16
|
+
|
17
|
+
##########################################
|
18
|
+
# replace each pre char with a unique rule
|
19
|
+
##########################################
|
20
|
+
def new_production production
|
21
|
+
production.gsub!(/./) { |c| (r = @rules[c]) ? r : c }
|
22
|
+
end
|
23
|
+
|
24
|
+
##########################################
|
25
|
+
# control the number of iterations
|
26
|
+
# default 0, returns the axiom
|
27
|
+
##########################################
|
28
|
+
def generate repeat = 0
|
29
|
+
prod = axiom
|
30
|
+
repeat.times do
|
31
|
+
prod = new_production prod
|
32
|
+
end
|
33
|
+
return prod
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
############################
|
38
|
+
# Hilbert Curves
|
39
|
+
###########################
|
40
|
+
class Hilbert
|
41
|
+
include Processing::Proxy
|
42
|
+
|
43
|
+
attr_reader :grammar, :axiom, :production, :premis, :rule,
|
44
|
+
:theta, :scale_factor, :distance, :phi, :len
|
45
|
+
|
46
|
+
def initialize(len)
|
47
|
+
@axiom = "X"
|
48
|
+
@grammar = Grammar.new(axiom)
|
49
|
+
@production = axiom
|
50
|
+
@premis = "X"
|
51
|
+
@rule = "^<XF^<XFX-F^>>XFX&F+>>XFX-F>X->"
|
52
|
+
@len = len
|
53
|
+
@distance = len/12 # distance value relative to screen height
|
54
|
+
@theta = Math::PI/180 * 90
|
55
|
+
@phi = Math::PI/180 * 90
|
56
|
+
grammar.add_rule(premis, rule)
|
57
|
+
no_stroke()
|
58
|
+
end
|
59
|
+
|
60
|
+
def render()
|
61
|
+
translate(-len/42, len/42, -len/42) # use the "answer?" to center the Hilbert
|
62
|
+
fill(0, 75, 152)
|
63
|
+
light_specular(204, 204, 204)
|
64
|
+
specular(255, 255, 255)
|
65
|
+
shininess(1.0)
|
66
|
+
production.scan(/./) do |ch|
|
67
|
+
case(ch)
|
68
|
+
when "F"
|
69
|
+
translate(0, distance/-2, 0)
|
70
|
+
box(distance/9 , distance, distance/9)
|
71
|
+
translate(0, distance/-2, 0)
|
72
|
+
when "+"
|
73
|
+
rotateX(-theta)
|
74
|
+
when "-"
|
75
|
+
rotateX(theta)
|
76
|
+
when ">"
|
77
|
+
rotateY(theta)
|
78
|
+
when "<"
|
79
|
+
rotateY(-theta)
|
80
|
+
when "&"
|
81
|
+
rotateZ(-phi)
|
82
|
+
when "^"
|
83
|
+
rotateZ(phi)
|
84
|
+
when "X"
|
85
|
+
else
|
86
|
+
puts("character '#{ch}' not in grammar")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
##############################
|
91
|
+
# create grammar from axiom and
|
92
|
+
# rules (adjust scale)
|
93
|
+
##############################
|
94
|
+
|
95
|
+
def create_grammar(gen)
|
96
|
+
@distance *= 0.5**gen
|
97
|
+
@production = @grammar.generate gen
|
98
|
+
end
|
99
|
+
end
|
@@ -64,18 +64,16 @@ class CharactersStrings < Processing::App
|
|
64
64
|
def key_pressed
|
65
65
|
# The variable "key" always contains the value of the most recent key pressed.
|
66
66
|
# If the key is an upper or lowercase letter between 'A' and 'z'
|
67
|
-
# the image is shifted to the corresponding value of that key
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
# the image is shifted to the corresponding value of that key
|
68
|
+
if ('A'..'z').include? key
|
69
|
+
|
71
70
|
# Map the index of the key pressed from the range between 'A' and 'z',
|
72
71
|
# into a position for the left edge of the image. The maximum xoffset
|
73
72
|
# is the width of the drawing area minus the size of the image.
|
74
|
-
|
75
|
-
@xoffset = map( key, "A"[0], "z"[0], 0, width - @frog.width ).to_i
|
73
|
+
@xoffset = map( key[0], "A"[0], "z"[0], 0, width - @frog.width ).to_i
|
76
74
|
|
77
75
|
# Update the letter shown to the screen
|
78
|
-
@letter = key
|
76
|
+
@letter = key
|
79
77
|
|
80
78
|
# Write the letter to the console
|
81
79
|
puts key
|
@@ -23,19 +23,19 @@ class TriangleStrip < Processing::App
|
|
23
23
|
number_of_points = 36
|
24
24
|
rotation = 360.0/number_of_points
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
shape(TRIANGLE_STRIP) do
|
27
|
+
number_of_points.times do |i|
|
28
|
+
px = x + cos(angle.radians)*outer_radius
|
29
|
+
py = y + sin(angle.radians)*outer_radius
|
30
|
+
angle += rotation
|
31
|
+
vertex px, py
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
px = x + cos(angle.radians)*inner_radius
|
34
|
+
py = y + sin(angle.radians)*inner_radius
|
35
|
+
angle += rotation
|
36
|
+
vertex px, py
|
37
|
+
end
|
37
38
|
end
|
38
|
-
end_shape
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
@@ -17,17 +17,11 @@ class Keyboard < Processing::App
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def draw
|
20
|
-
if key_pressed?
|
21
|
-
|
22
|
-
if key <= ("Z"[0])
|
23
|
-
@key_index = key - ("A"[0])
|
24
|
-
else
|
25
|
-
@key_index = key - ("a"[0])
|
26
|
-
end
|
20
|
+
if key_pressed? && ('A'..'z').include?(key)
|
21
|
+
@key_index = key.ord - (key <= 'Z' ? 'A'.ord : 'a'.ord)
|
27
22
|
fill millis % 255
|
28
23
|
begin_rect = @rect_width/2 + @key_index * @key_scale - @rect_width/2
|
29
24
|
rect begin_rect, 0, @rect_width, height
|
30
|
-
end
|
31
25
|
end
|
32
26
|
end
|
33
27
|
|
@@ -17,11 +17,11 @@ class Keyboard2 < Processing::App
|
|
17
17
|
|
18
18
|
def draw
|
19
19
|
if key_pressed?
|
20
|
-
if
|
21
|
-
if key
|
22
|
-
@key_index = key - "A".ord
|
20
|
+
if ('A'..'z').include? key
|
21
|
+
if key <= "Z"
|
22
|
+
@key_index = key.ord - "A".ord
|
23
23
|
else
|
24
|
-
@key_index = key - "a".ord
|
24
|
+
@key_index = key.ord - "a".ord
|
25
25
|
end
|
26
26
|
fill millis % 255
|
27
27
|
begin_rect = @rect_width/2 + @key_index * @key_scale - @rect_width/2
|
@@ -28,14 +28,14 @@ class KeyboardFunctions < Processing::App
|
|
28
28
|
def draw
|
29
29
|
if new_letter?
|
30
30
|
if upcase?
|
31
|
-
fill (key - "A".ord).abs % 255
|
31
|
+
fill (key.ord - "A".ord).abs % 255
|
32
32
|
rect @x, @y, @letter_width, @letter_height*2
|
33
33
|
else
|
34
34
|
# clear with letter space with background color
|
35
35
|
fill @num_chars/2
|
36
36
|
rect @x, @y, @letter_width, @letter_height
|
37
37
|
|
38
|
-
fill (key - "a".ord).abs % 255
|
38
|
+
fill (key.ord - "a".ord).abs % 255
|
39
39
|
rect @x, @y+@letter_height, @letter_width, @letter_height
|
40
40
|
end
|
41
41
|
@new_letter = false
|
@@ -51,26 +51,17 @@ class KeyboardFunctions < Processing::App
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def key_pressed
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
54
|
+
if ('A'..'z').include? key
|
55
|
+
@upcase = key <= "Z"
|
56
|
+
@new_letter = true
|
57
|
+
|
58
|
+
# Update the "letter" position and
|
59
|
+
# wrap horizontally and vertically
|
60
|
+
@y += (@letter_height*2) if @x + @letter_width >= width
|
61
|
+
@y = @y % height
|
62
|
+
@x += @letter_width
|
63
|
+
@x = @x % width
|
65
64
|
end
|
66
|
-
@new_letter = true
|
67
|
-
|
68
|
-
# Update the "letter" position and
|
69
|
-
# wrap horizontally and vertically
|
70
|
-
@y += (@letter_height*2) if @x + @letter_width >= width
|
71
|
-
@y = @y % height
|
72
|
-
@x += @letter_width
|
73
|
-
@x = @x % width
|
74
65
|
end
|
75
66
|
|
76
67
|
end
|