Skip to content

Commit 2672a4f

Browse files
committed
icosahedra variants
1 parent aa0cdb1 commit 2672a4f

File tree

2 files changed

+120
-40
lines changed

2 files changed

+120
-40
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# This sketch uses magic numbers for icosahedron, see lib/icosahedron.rb for a calculated version
2+
# But neatly illustrates use of `tap` with PShape and `slice` with an array
3+
attr_reader :ico
4+
5+
def setup
6+
sketch_title('Icosahedron Shape')
7+
@ico = create_icosahedron
8+
end
9+
10+
def draw
11+
background(0, 0, 200)
12+
lights
13+
translate(width / 2, height / 2)
14+
scale(150)
15+
push_matrix
16+
rotate_x(0.01 * frame_count)
17+
rotate_z(0.025 * frame_count)
18+
shape(ico)
19+
pop_matrix
20+
end
21+
22+
FACES = [
23+
2, 1, 0,
24+
3, 2, 0,
25+
4, 3, 0,
26+
5, 4, 0,
27+
1, 5, 0,
28+
29+
11, 6, 7,
30+
11, 7, 8,
31+
11, 8, 9,
32+
11, 9, 10,
33+
11, 10, 6,
34+
35+
1, 2, 6,
36+
2, 3, 7,
37+
3, 4, 8,
38+
4, 5, 9,
39+
5, 1, 10,
40+
41+
2, 7, 6,
42+
3, 8, 7,
43+
4, 9, 8,
44+
5, 10, 9,
45+
1, 6, 10
46+
].freeze
47+
48+
VERTS = [
49+
0.000, 0.000, 1.000,
50+
0.894, 0.000, 0.447,
51+
0.276, 0.851, 0.447,
52+
-0.724, 0.526, 0.447,
53+
-0.724, -0.526, 0.447,
54+
0.276, -0.851, 0.447,
55+
0.724, 0.526, -0.447,
56+
-0.276, 0.851, -0.447,
57+
-0.894, 0.000, -0.447,
58+
-0.276, -0.851, -0.447,
59+
0.724, -0.526, -0.447,
60+
0.000, 0.000, -1.000
61+
].freeze
62+
63+
def create_icosahedron
64+
create_shape.tap do |sh|
65+
sh.begin_shape(TRIANGLES)
66+
sh.no_stroke
67+
sh.fill(200, 0, 0)
68+
FACES.each_slice(3).each do |a, b, c|
69+
one = a * 3
70+
two = b * 3
71+
three = c * 3
72+
sh.vertex(VERTS[one], VERTS[one + 1], VERTS[one + 2])
73+
sh.vertex(VERTS[two], VERTS[two + 1], VERTS[two + 2])
74+
sh.vertex(VERTS[three], VERTS[three + 1], VERTS[three + 2])
75+
end
76+
sh.end_shape
77+
end
78+
end
79+
80+
def settings
81+
size(400, 400, P3D)
82+
end
+38-40
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,51 @@
1+
# Using fully qualified java names instead of 'java_import'
12
class Icosahedron
2-
attr_reader :app, :r
3-
TRIANGLES = Java::ProcessingCore::PConstants.TRIANGLES
3+
attr_reader :app, :radius, :renderer
44
def initialize(app, radius)
5-
@app, @r = app, radius
5+
@app = app
6+
@radius = radius
7+
@renderer = Java::MonkstoneVecmath::GfxRender.new(app.g)
68
end
7-
8-
##
9+
910
# Draw an icosahedron defined by a radius r.
10-
#
1111
def draw
1212
# Calculate the vertex data for an icosahedron inscribed by a sphere radius 'r'.
1313
# Use 4 Golden Ratio rectangles as the basis.
1414
phi = (1.0 + Math.sqrt(5.0)) / 2.0
15-
h = r / Math.sqrt(1.0 + phi * phi)
15+
h = radius / Math.sqrt(1.0 + phi * phi)
1616
v =
1717
[
18-
Vec3D.new(0, -h, h * phi), Vec3D.new(0, -h, -h * phi), Vec3D.new(0, h, -h * phi), Vec3D.new(0, h, h * phi),
19-
Vec3D.new(h, -h * phi, 0), Vec3D.new(h, h * phi, 0), Vec3D.new(-h, h * phi, 0), Vec3D.new(-h, -h * phi, 0),
20-
Vec3D.new(-h * phi, 0, h), Vec3D.new(-h * phi, 0, -h), Vec3D.new(h * phi, 0, -h), Vec3D.new(h * phi, 0, h)
21-
]
22-
23-
app.begin_shape(TRIANGLES)
24-
draw_triangle(v[0], v[7],v[4])
25-
draw_triangle(v[0], v[4], v[11])
26-
draw_triangle(v[0], v[11], v[3])
27-
draw_triangle(v[0], v[3], v[8])
28-
draw_triangle(v[0], v[8], v[7])
29-
draw_triangle(v[1], v[4], v[7])
30-
draw_triangle(v[1], v[10], v[4])
31-
draw_triangle(v[10], v[11], v[4])
32-
draw_triangle(v[11], v[5], v[10])
33-
draw_triangle(v[5], v[3], v[11])
34-
draw_triangle(v[3], v[6], v[5])
35-
draw_triangle(v[6], v[8], v[3])
36-
draw_triangle(v[8], v[9], v[6])
37-
draw_triangle(v[9], v[7], v[8])
38-
draw_triangle(v[7], v[1], v[9])
39-
draw_triangle(v[2], v[1], v[9])
40-
draw_triangle(v[2], v[10], v[1])
41-
draw_triangle(v[2], v[5], v[10])
42-
draw_triangle(v[2], v[6], v[5])
43-
draw_triangle(v[2], v[9], v[6])
18+
Vec3D.new(0, -h, h * phi), Vec3D.new(0, -h, -h * phi), Vec3D.new(0, h, -h * phi), Vec3D.new(0, h, h * phi),
19+
Vec3D.new(h, -h * phi, 0), Vec3D.new(h, h * phi, 0), Vec3D.new(-h, h * phi, 0), Vec3D.new(-h, -h * phi, 0),
20+
Vec3D.new(-h * phi, 0, h), Vec3D.new(-h * phi, 0, -h), Vec3D.new(h * phi, 0, -h), Vec3D.new(h * phi, 0, h)
21+
]
22+
app.begin_shape(Java::ProcessingCore::PConstants.TRIANGLES)
23+
draw_triangle(v[0], v[7], v[4])
24+
draw_triangle(v[0], v[4], v[11])
25+
draw_triangle(v[0], v[11], v[3])
26+
draw_triangle(v[0], v[3], v[8])
27+
draw_triangle(v[0], v[8], v[7])
28+
draw_triangle(v[1], v[4], v[7])
29+
draw_triangle(v[1], v[10], v[4])
30+
draw_triangle(v[10], v[11], v[4])
31+
draw_triangle(v[11], v[5], v[10])
32+
draw_triangle(v[5], v[3], v[11])
33+
draw_triangle(v[3], v[6], v[5])
34+
draw_triangle(v[6], v[8], v[3])
35+
draw_triangle(v[8], v[9], v[6])
36+
draw_triangle(v[9], v[7], v[8])
37+
draw_triangle(v[7], v[1], v[9])
38+
draw_triangle(v[2], v[1], v[9])
39+
draw_triangle(v[2], v[10], v[1])
40+
draw_triangle(v[2], v[5], v[10])
41+
draw_triangle(v[2], v[6], v[5])
42+
draw_triangle(v[2], v[9], v[6])
4443
app.end_shape
4544
end
46-
47-
def draw_triangle(p1, p2, p3)
48-
app.vertex(p1.x, p1.y, p1.z)
49-
app.vertex(p2.x, p2.y, p2.z)
50-
app.vertex(p3.x, p3.y, p3.z)
45+
46+
def draw_triangle(pt1, pt2, pt3)
47+
pt1.to_vertex(renderer)
48+
pt2.to_vertex(renderer)
49+
pt3.to_vertex(renderer)
5150
end
52-
53-
end
51+
end

0 commit comments

Comments
 (0)