propane 0.8.0-java → 0.9.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -1
  3. data/README.md +1 -1
  4. data/lib/propane/app.rb +56 -55
  5. data/lib/propane/creators/sketch_writer.rb +7 -3
  6. data/lib/propane/helper_methods.rb +40 -29
  7. data/lib/propane/runner.rb +3 -2
  8. data/lib/propane/version.rb +1 -1
  9. data/pom.rb +1 -1
  10. data/pom.xml +1 -1
  11. data/vendors/Rakefile +31 -1
  12. metadata +2 -59
  13. data/examples/data_path/Rakefile +0 -32
  14. data/examples/data_path/bw_shader.rb +0 -47
  15. data/examples/data_path/data/Texture01.jpg +0 -0
  16. data/examples/data_path/data/Texture02.jpg +0 -0
  17. data/examples/data_path/data/Univers45.vlw +0 -0
  18. data/examples/data_path/data/bwfrag.glsl +0 -23
  19. data/examples/data_path/data/displaceFrag.glsl +0 -8
  20. data/examples/data_path/data/displaceVert.glsl +0 -201
  21. data/examples/data_path/data/lachoy.jpg +0 -0
  22. data/examples/data_path/data/landscape.glsl +0 -352
  23. data/examples/data_path/data/monjori.glsl +0 -30
  24. data/examples/data_path/data/moon.jpg +0 -0
  25. data/examples/data_path/data/sea.jpg +0 -0
  26. data/examples/data_path/edge_detection.rb +0 -49
  27. data/examples/data_path/glsl_heightmap_noise.rb +0 -125
  28. data/examples/data_path/kinetic_type.rb +0 -79
  29. data/examples/data_path/landscape.rb +0 -34
  30. data/examples/data_path/linear_image.rb +0 -51
  31. data/examples/data_path/monjori.rb +0 -35
  32. data/examples/regular/Rakefile +0 -30
  33. data/examples/regular/arcball_box.rb +0 -28
  34. data/examples/regular/arcball_constrain.rb +0 -29
  35. data/examples/regular/bezier_playground.rb +0 -206
  36. data/examples/regular/circle_collision.rb +0 -118
  37. data/examples/regular/colors_two.rb +0 -60
  38. data/examples/regular/creating_colors.rb +0 -64
  39. data/examples/regular/drawolver.rb +0 -93
  40. data/examples/regular/elegant_ball.rb +0 -159
  41. data/examples/regular/empathy.rb +0 -80
  42. data/examples/regular/fern.rb +0 -57
  43. data/examples/regular/fibonacci_sphere.rb +0 -91
  44. data/examples/regular/flight_patterns.rb +0 -64
  45. data/examples/regular/fractions.rb +0 -32
  46. data/examples/regular/grapher.rb +0 -40
  47. data/examples/regular/gravity.rb +0 -120
  48. data/examples/regular/grey_circles.rb +0 -28
  49. data/examples/regular/jwishy.rb +0 -99
  50. data/examples/regular/letters.rb +0 -42
  51. data/examples/regular/lib/boundary.rb +0 -38
  52. data/examples/regular/lib/particle.rb +0 -77
  53. data/examples/regular/lib/particle_system.rb +0 -111
  54. data/examples/regular/lib/rain_drops.rb +0 -54
  55. data/examples/regular/liquidy.rb +0 -41
  56. data/examples/regular/mouse_button_demo.rb +0 -32
  57. data/examples/regular/polyhedrons.rb +0 -249
  58. data/examples/regular/raining.rb +0 -60
  59. data/examples/regular/ribbon_doodle.rb +0 -89
  60. data/examples/regular/select_file.rb +0 -32
  61. data/examples/regular/select_image.rb +0 -40
  62. data/examples/regular/slider_demo.rb +0 -61
  63. data/examples/regular/slider_example.rb +0 -53
  64. data/examples/regular/slider_simple.rb +0 -47
  65. data/examples/regular/tree.rb +0 -76
  66. data/examples/regular/vector_math.rb +0 -37
  67. data/examples/regular/words.rb +0 -41
  68. data/lib/propane/helpers/string_extra.rb +0 -45
  69. data/lib/propane/underscorer.rb +0 -19
@@ -1,77 +0,0 @@
1
- # Note the particle class change method is use to change color to red
2
- # when two particles collide (no change just hitting boundary)
3
- class Particle
4
- extend Forwardable
5
- def_delegators(:@app, :box2d, :begin_shape, :color, :end_shape, :line,
6
- :pop_matrix, :ellipse, :translate, :rotate, :stroke,
7
- :push_matrix, :fill, :no_fill, :stroke_weight)
8
- attr_accessor :body
9
- attr_reader :radius, :col
10
-
11
- def initialize(app, x, y, r)
12
- @app, @x, @y, @radius = app, x, y, r
13
- # This function puts the particle in the Box2d world
14
- make_body(x, y, radius)
15
- @col = color('#c0c0c0') # silvergrey
16
- body.setUserData(self)
17
- end
18
-
19
- # This function removes the particle from the box2d world
20
- def kill_body
21
- box2d.destroy_body(body)
22
- end
23
-
24
- # Change color when hit
25
- def change
26
- @col = color('#cc0000') # red
27
- end
28
-
29
- # Is the particle ready for deletion?
30
- def done
31
- # Let's find the screen position of the particle
32
- pos = box2d.body_coord(body)
33
- # Is it off the bottom of the screen?
34
- return false unless pos.y > (box2d.height + radius * 2)
35
- kill_body
36
- true
37
- end
38
-
39
- def display
40
- # We look at each body and get its screen position
41
- pos = box2d.body_coord(body)
42
- # Get its angle of rotation
43
- a = body.get_angle
44
- push_matrix
45
- translate(pos.x, pos.y)
46
- rotate(a)
47
- fill(col)
48
- stroke(0)
49
- stroke_weight(1)
50
- ellipse(0, 0, radius * 2, radius * 2)
51
- # Let's add a line so we can see the rotation
52
- line(0, 0, radius, 0)
53
- pop_matrix
54
- end
55
-
56
- # Here's our function that adds the particle to the Box2D world
57
- def make_body(x, y, r)
58
- # Define a body
59
- bd = BodyDef.new
60
- # Set its position
61
- bd.position = box2d.processing_to_world(x, y)
62
- bd.type = BodyType::DYNAMIC
63
- @body = box2d.create_body(bd)
64
- # Make the body's shape a circle
65
- cs = CircleShape.new
66
- cs.m_radius = box2d.scale_to_world(r)
67
- fd = FixtureDef.new
68
- fd.shape = cs
69
- # Parameters that affect physics
70
- fd.density = 1
71
- fd.friction = 0.01
72
- fd.restitution = 0.3
73
- # Attach fixture to body
74
- body.create_fixture(fd)
75
- body.set_angular_velocity(rand(-10.0..10))
76
- end
77
- end
@@ -1,111 +0,0 @@
1
- require 'forwardable'
2
-
3
- module Runnable
4
- def run
5
- reject!(&:done)
6
- each(&:display)
7
- end
8
- end
9
-
10
- # Not be confused with the jbox2d ParticleSystem
11
- class ParticleSystem
12
- include Enumerable, Runnable
13
- extend Forwardable
14
- def_delegators(:@particles, :each, :reject!, :<<, :empty?)
15
- def_delegator(:@particles, :empty?, :dead?)
16
-
17
- attr_reader :x, :y
18
-
19
- def initialize(bd, num, x, y)
20
- @particles = [] # Initialize the Array
21
- @x, @y = x, y # Store the origin point
22
- num.times do
23
- self << Particle.new(bd, x, y)
24
- end
25
- end
26
-
27
- def add_particles(bd, n)
28
- n.times do
29
- self << Particle.new(bd, x, y)
30
- end
31
- end
32
- end
33
-
34
- # A Particle
35
- require 'pbox2d'
36
-
37
- class Particle
38
- include Propane::Proxy
39
- TRAIL_SIZE = 6
40
- # We need to keep track of a Body
41
-
42
- attr_reader :trail, :body, :box2d
43
-
44
- # Constructor
45
- def initialize(b2d, x, y)
46
- @box2d = b2d
47
- @trail = Array.new(TRAIL_SIZE, [x, y])
48
- # Add the box to the box2d world
49
- # Here's a little trick, let's make a tiny tiny radius
50
- # This way we have collisions, but they don't overwhelm the system
51
- make_body(x, y, 0.2)
52
- end
53
-
54
- # This function removes the particle from the box2d world
55
- def kill_body
56
- box2d.destroy_body(body)
57
- end
58
-
59
- # Is the particle ready for deletion?
60
- def done
61
- # Let's find the screen position of the particle
62
- pos = box2d.body_coord(body)
63
- # Is it off the bottom of the screen?
64
- return false unless pos.y > box2d.height + 20
65
- kill_body
66
- true
67
- end
68
-
69
- # Drawing the box
70
- def display
71
- # We look at each body and get its screen position
72
- pos = box2d.body_coord(body)
73
- # Keep track of a history of screen positions in an array
74
- (TRAIL_SIZE - 1).times do |i|
75
- trail[i] = trail[i + 1]
76
- end
77
- trail[TRAIL_SIZE - 1] = [pos.x, pos.y]
78
- # Draw particle as a trail
79
- begin_shape
80
- no_fill
81
- stroke_weight(2)
82
- stroke(0, 150)
83
- trail.each do |v|
84
- vertex(v[0], v[1])
85
- end
86
- end_shape
87
- end
88
-
89
- # This function adds the rectangle to the box2d world
90
- def make_body(x, y, r)
91
- # Define and create the body
92
- bd = BodyDef.new
93
- bd.type = BodyType::DYNAMIC
94
- bd.position.set(box2d.processing_to_world(x, y))
95
- @body = box2d.create_body(bd)
96
- # Give it some initial random velocity
97
- body.set_linear_velocity(Vec2.new(rand(-1.0..1), rand(-1.0..1)))
98
- # Make the body's shape a circle
99
- cs = CircleShape.new
100
- cs.m_radius = box2d.scale_to_world(r)
101
- fd = FixtureDef.new
102
- fd.shape = cs
103
- fd.density = 1
104
- fd.friction = 0 # Slippery when wet!
105
- fd.restitution = 0.5
106
- # We could use this if we want to turn collisions off
107
- # cd.filter.groupIndex = -10
108
- # Attach fixture to body
109
- body.create_fixture(fd)
110
- end
111
- end
@@ -1,54 +0,0 @@
1
- require 'forwardable'
2
-
3
- module Runnable
4
- def run
5
- reject!(&:dead?)
6
- each(&:display)
7
- end
8
- end
9
-
10
- class RainDrops
11
- include Enumerable, Runnable
12
- extend Forwardable
13
-
14
- def_delegators(:@drops, :<<, :each, :reject!, :size)
15
-
16
- attr_reader :drops, :width, :height #, :weight
17
-
18
- def initialize(width, height)
19
- @drops = []
20
- @width = width
21
- @height = height
22
- end
23
-
24
- def fill_up(weight)
25
- # @weight = weight
26
- drops << Drop.new(rand(width), rand(height / 2) - height / 2, weight)
27
- end
28
- end
29
-
30
- class Drop
31
- include Propane::Proxy
32
- attr_reader :weight, :x, :y
33
-
34
- def initialize(x, y, weight = nil)
35
- @weight = weight || 10
36
- @x, @y = x, y
37
- end
38
-
39
- def render
40
- fill(100, 100, 200)
41
- no_stroke
42
- bezier(x, y, x - (weight / 2), y + weight, x + (weight / 2), y + weight, x, y)
43
- end
44
-
45
- def dead?
46
- @y > height
47
- end
48
-
49
- def display
50
- @y = y + weight
51
- @x = x - rand(-3..3)
52
- render
53
- end
54
- end
@@ -1,41 +0,0 @@
1
- #!/usr/bin/env jruby -v -W2
2
- require 'propane'
3
- require 'pbox2d'
4
- require_relative 'lib/particle_system'
5
- require_relative 'lib/boundary'
6
-
7
- Vect = Struct.new(:x, :y)
8
-
9
- class Liquidy < Propane::App
10
- attr_reader :box2d, :boundaries, :systems
11
-
12
- def setup
13
- size(400, 300)
14
- @box2d = WorldBuilder.build(app: self, gravity: [0, -20])
15
- @systems = []
16
- @boundaries = [
17
- Boundary.new(box2d, Vect.new(50, 100), Vect.new(300, 5), -0.3),
18
- Boundary.new(box2d, Vect.new(250, 175), Vect.new(300, 5), 0.5)
19
- ]
20
- end
21
-
22
- def draw
23
- background(255)
24
- # Run all the particle systems
25
- if systems.size > 0
26
- systems.each do |system|
27
- system.run
28
- system.add_particles(box2d, rand(0..2))
29
- end
30
- end
31
- # Display all the boundaries
32
- boundaries.each(&:display)
33
- end
34
-
35
- def mouse_pressed
36
- # Add a new Particle System whenever the mouse is clicked
37
- systems << ParticleSystem.new(box2d, 0, mouse_x, mouse_y)
38
- end
39
- end
40
-
41
- Liquidy.new title: 'Liquidy'
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env jruby -v -W2
2
- # frozen_string_literal: true
3
-
4
- require_relative 'propane'
5
- # Demo of Mouse Button
6
- class MouseButtonDemo < Propane::App
7
- # Click within the image and press
8
- # the left and right mouse buttons to
9
- # change the value of the rectangle
10
- def setup
11
- size 300, 200
12
- end
13
-
14
- def draw
15
- rect(25, 25, 150, 80)
16
- end
17
-
18
- def mouse_pressed
19
- case mouse_button
20
- when LEFT
21
- fill 0
22
- when RIGHT
23
- fill 255
24
- when CENTER
25
- fill 125
26
- else
27
- fill 200, 0, 0
28
- end
29
- end
30
- end
31
-
32
- MouseButtonDemo.new title: 'Mouse Button Demo'
@@ -1,249 +0,0 @@
1
- #!/usr/bin/env jruby -v -W2
2
- ###
3
- # Polyhedrons after sketch by Chinchbug on openprocessing.org
4
- ###
5
- Vert = Struct.new(:x, :y, :z) do
6
- def dist_sq(v)
7
- (x - v.x) * (x - v.x) + (y - v.y) * (y - v.y) + (z - v.z) * (z - v.z)
8
- end
9
-
10
- def self.permutations(x, y, z)
11
- [new(x, y, z), new(z, x, y), new(y, z, x)]
12
- end
13
- end
14
-
15
- PHI = (1 + Math.sqrt(5)) / 2
16
- PHI_SQ = PHI * PHI
17
- PHI_CU = PHI * PHI * PHI
18
- ROOT2 = Math.sqrt(2)
19
- TYPE = "Type Archimedian\nFaces: "
20
-
21
- require 'propane'
22
-
23
- class Polyhedrons < Propane::App
24
-
25
- attr_reader :verts, :curr_id, :scayl, :ang, :spd, :name, :notes, :off_x, :off_y
26
- attr_reader :off_z, :len_edge
27
-
28
- def setup
29
- size(1020, 576, P3D)
30
- smooth 4
31
- text_size(14)
32
- # some positional variables for translation
33
- @off_y = height / 2
34
- @off_x = width / 2 - 100
35
- @off_z = -off_y / 8
36
- # angle and speed for rotation
37
- @ang = 0.0
38
- @spd = 0.015
39
- # set up initial polyhedron
40
- @verts = []
41
- @curr_id = 0
42
- create_poly(curr_id)
43
- end
44
-
45
- def draw
46
- # setup the view
47
- background(200)
48
- push_matrix
49
- translate(off_x, off_y, off_z)
50
- rotate_x(Math.sin(-ang * 0.3) * 0.5)
51
- rotate_y(ang)
52
- draw_axis
53
- # draw the polyhedron
54
- stroke_weight(0.75)
55
- stroke(0)
56
- (0...verts.size).each do |i|
57
- (i...verts.size).each do |j|
58
- draw_line(verts[i], verts[j]) if edge?(verts[i], verts[j])
59
- end
60
- end
61
- pop_matrix
62
- hint(DISABLE_DEPTH_TEST)
63
- # show some notes
64
- fill(80, 50, 20)
65
- text(name, width - 360, 50)
66
- text(notes, width - 340, 70)
67
- text('Click to view next polyhedron...', width - 360, height - 50)
68
- hint(ENABLE_DEPTH_TEST)
69
- # bump up the angle for the spin
70
- @ang += spd
71
- end
72
-
73
- def mouse_released
74
- # change the polyhedron
75
- create_poly(@curr_id += 1)
76
- end
77
-
78
- def draw_line(v1, v2)
79
- # Draws an edge line
80
- line(v1.x * scayl, v1.y * scayl, v1.z * scayl, v2.x * scayl, v2.y * scayl, v2.z * scayl)
81
- end
82
-
83
- def edge?(v1, v2)
84
- # had some rounding errors, now a bit more forgiving...
85
- pres = 1000
86
- d = v1.dist_sq(v2) + 0.00001
87
- ((d * pres).round == (len_edge * len_edge * pres).round)
88
- end
89
-
90
- def add_verts(x, y, z)
91
- # adds the requested vert and all 'mirrored' verts
92
- verts << Vert.new(x, y, z)
93
- verts << Vert.new(x, y, -z) unless (z == 0.0)
94
- verts << Vert.new(x, -y, z) unless (y == 0.0)
95
- verts << Vert.new(x, -y, -z) unless (z == 0.0)
96
- verts << Vert.new(-x, y, z) unless (x == 0.0)
97
- verts << Vert.new(-x, y, -z) unless (z == 0.0)
98
- verts << Vert.new(-x, -y, z) unless (y == 0.0)
99
- verts << Vert.new(-x, -y, -z) unless (z == 0.0)
100
- end
101
-
102
- def permutations(x, y, z)
103
- # adds vertices for all three permutations of x, y, and z
104
- Vert.permutations(x, y, z).each { |v| add_verts(v.x, v.y, v.z) }
105
- end
106
-
107
- def draw_axis
108
- # based off how Sketchup handles their axis
109
- stroke_weight(0.5)
110
- stroke(0, 128, 0)
111
- line(-300, 0, 0, 0, 0, 0)
112
- stroke(0, 0, 128)
113
- line(0, -300, 0, 0, 0, 0)
114
- stroke(128, 0, 0)
115
- line(0, 0, -300, 0, 0, 0)
116
- stroke_weight(0.25)
117
- stroke(0, 128, 0)
118
- line(300, 0, 0, 0, 0, 0)
119
- stroke(0, 0, 128)
120
- line(0, 300, 0, 0, 0, 0)
121
- stroke(128, 0, 0)
122
- line(0, 0, 300, 0, 0, 0)
123
- end
124
-
125
- def create_poly(id)
126
- # This is where the actual defining of the polyhedrons takes place
127
- verts.clear # clear out whatever verts are currently defined
128
- case (id)
129
- when 0
130
- @name = 'Cube:'
131
- @notes = "Type platonic\nFaces: 6 squares\nVertices 8\nEdges 12"
132
- add_verts(1, 1, 1)
133
- @len_edge = 2
134
- @scayl = 140
135
- when 1
136
- @name = 'Octohedron:'
137
- @notes = "Type platonic\nFaces: 8 triangles\nVertices 6\nEdges 12"
138
- permutations(1, 0, 0)
139
- @len_edge = ROOT2
140
- @scayl = 220
141
- when 2
142
- @name = 'Dodecahedron:'
143
- @notes = "Type platonic\nFaces: 12 pentagons\nVertices 20\nEdges 30"
144
- add_verts(1, 1, 1)
145
- permutations(0, 1 / PHI, PHI)
146
- @len_edge = 2 / PHI
147
- @scayl = 130
148
- when 3
149
- @name = 'Icosahedron:'
150
- @notes = "Type platonic\nFaces: 20 triangles\nVertices 12\nEdges 30"
151
- permutations(0, 1, PHI)
152
- @len_edge = 2.0
153
- @scayl = 120
154
- when 4
155
- @name = 'Rhombic Dodecahedron:'
156
- @notes = "Type Catalan\nFaces: 12 rhombuses\nVertices 14\nEdges 24"
157
- add_verts(1, 1, 1)
158
- permutations(0, 0, 2)
159
- @len_edge = Math.sqrt(3)
160
- @scayl = 110
161
- when 5
162
- @name = 'Rhombic Triacontahedron:'
163
- @notes = "Type Catalan\nFaces: 30 rhombuses\nVertices 32\nEdges 60"
164
- add_verts(PHI_SQ, PHI_SQ, PHI_SQ)
165
- permutations(PHI_SQ, 0, PHI_CU)
166
- permutations(0, PHI, PHI_CU)
167
- @len_edge = PHI * Math.sqrt(PHI + 2)
168
- @scayl = 46
169
- when 6
170
- @name = 'Cuboctahedron:'
171
- @notes = format("%s %d triangles, 6 squares\nVertices 12\nEdges 24", TYPE, 8)
172
- permutations(1, 0, 1)
173
- @len_edge = ROOT2
174
- @scayl = 170
175
- when 7
176
- @name = 'Truncated Cube:'
177
- @notes = format("%s %d triangles, 6 octogons\nVertices 24\nEdges 36", TYPE, 8)
178
- permutations(ROOT2 - 1, 1, 1)
179
- @len_edge = 2 * (ROOT2 - 1)
180
- @scayl = 155
181
- when 8
182
- @name = 'Truncated Octahedron:'
183
- @notes = format("%s %d squares, 8 hexagons\nVertices 24\nEdges 36", TYPE, 6)
184
- permutations(0, 1, 2)
185
- permutations(2, 1, 0)
186
- @len_edge = ROOT2
187
- @scayl = 100
188
- when 9
189
- @name = 'Rhombicuboctahedron:'
190
- @notes = format("%s %d triangles, 18 squares\nVertices 24\nEdges 48", TYPE, 8)
191
- permutations(ROOT2 + 1, 1, 1)
192
- @len_edge = 2
193
- @scayl = 80
194
- when 10
195
- @name = 'Truncated Cuboctahedron:'
196
- @notes = format("%s %d squares, 8 hexagons, 6 octogons\nVertices 48\nEdges 72", TYPE, 12)
197
- permutations(ROOT2 + 1, 2 * ROOT2 + 1, 1)
198
- permutations(ROOT2 + 1, 1, 2 * ROOT2 + 1)
199
- @len_edge = 2
200
- @scayl = 50
201
- when 11
202
- @name = 'Icosidodecahedron:'
203
- @notes = format("%s %d triangles, 12 pentagons\nVertices 30\nEdges 60", TYPE, 20)
204
- permutations(0, 0, 2 * PHI)
205
- permutations(1, PHI, PHI_SQ)
206
- @len_edge = 2
207
- @scayl = 70
208
- when 12
209
- @name = 'Truncated Dodecahedron:'
210
- @notes = format("%s %d triangles, 12 decagons\nVertices 60\nEdges 90", TYPE, 20)
211
- permutations(0, 1 / PHI, PHI + 2)
212
- permutations(1 / PHI, PHI, 2 * PHI)
213
- permutations(PHI, 2, PHI_SQ)
214
- @len_edge = 2 * (PHI - 1)
215
- @scayl = 60
216
- when 13
217
- @name = 'Truncated Icosahedron:'
218
- @notes = format("%s %d pentagons, 20 hexagons\nVertices 60\nEdges 90", TYPE, 12)
219
- permutations(0, 1, 3 * PHI)
220
- permutations(2, 2 * PHI + 1, PHI)
221
- permutations(1, PHI + 2, 2 * PHI)
222
- @len_edge = 2
223
- @scayl = 45
224
- when 14
225
- @name = 'Small Rhombicosidodecahedron:'
226
- @notes = format("%s %d triangles, 30 squares, 12 pentagons\nVertices 60\nEdges 120", TYPE, 20)
227
- permutations(1, 1, PHI_CU)
228
- permutations(PHI_SQ, PHI, 2 * PHI)
229
- permutations(PHI + 2, 0, PHI_SQ)
230
- @len_edge = 2
231
- @scayl = 50
232
- when 15
233
- @name = 'Great Rhombicosidodecahedron:'
234
- @notes = format("%s %d squares, 20 hexagons, 12 decagons\nVertices 120\nEdges 180", TYPE, 30)
235
- permutations(1 / PHI, 1 / PHI, PHI + 3)
236
- permutations(2 / PHI, PHI, 2 * PHI + 1)
237
- permutations(1 / PHI, PHI_SQ, 3 * PHI - 1)
238
- permutations(2 * PHI - 1, 2, PHI + 2)
239
- permutations(PHI, 3, 2 * PHI)
240
- @len_edge = 2 * PHI - 2
241
- @scayl = 48
242
- else # start again
243
- @curr_id = 0
244
- create_poly(curr_id)
245
- end
246
- end
247
- end
248
-
249
- Polyhedrons.new title: 'Polyhedrons'