I have often thought that Processing::Proxy in ruby-processing is a bit of hack (further it doesn't always do what you need to mimic vanilla processings "inner" class access to methods/variables), here is a more respectable alternative using forwardable. As a bonus shows the neat Vec3D :to_vertex method in action:-
require 'forwardable'
load_libraries :icosahedron, :vecmath
def setup
size 640, 360, P3D
@ico1 = Icosahedron.new self, 75.0
@ico2 = Icosahedron.new self, 75.0
@ico3 = Icosahedron.new self, 75.0
end
def draw
background 0
lights
translate(width / 2, height / 2)
push_matrix
translate(-width / 3.5, 0)
rotate_x frame_count * PI / 185
rotate_y frame_count * PI / -200
stroke 170, 0, 0
no_fill
@ico1.draw
pop_matrix
push_matrix
rotate_x frame_count * PI / 200
rotate_y frame_count * PI / 300
stroke 170, 0, 180
fill 170, 170, 0
@ico2.draw
pop_matrix
push_matrix
translate(width / 3.5, 0)
rotate_x frame_count * PI / -200
rotate_y frame_count * PI / 200
no_stroke
fill 0, 0, 185
@ico3.draw
pop_matrix
end
Here is the library class that uses forwardable:-
class Icosahedron
extend Forwardable
def_delegators(:@app, :begin_shape, :end_shape)
attr_reader :r, :app, :renderer
def initialize(app, radius)
@r = radius
@app = app
@renderer = AppRender.new(app)
end
def draw
phi = (1.0 + Math.sqrt(5.0)) / 2.0
h = r / Math.sqrt(1.0 + phi * phi)
v =
[
Vec3D.new(0, -h, h * phi), Vec3D.new(0, -h, -h * phi),
Vec3D.new(0, h, -h * phi), Vec3D.new(0, h, h * phi),
Vec3D.new(h, -h * phi, 0), Vec3D.new(h, h * phi, 0),
Vec3D.new(-h, h * phi, 0), Vec3D.new(-h, -h * phi, 0),
Vec3D.new(-h * phi, 0, h), Vec3D.new(-h * phi, 0, -h),
Vec3D.new(h * phi, 0, -h), Vec3D.new(h * phi, 0, h)
]
begin_shape(Java::ProcessingCore::PConstants::TRIANGLES)
draw_triangle(v[0], v[7], v[4])
draw_triangle(v[0], v[4], v[11])
draw_triangle(v[0], v[11], v[3])
draw_triangle(v[0], v[3], v[8])
draw_triangle(v[0], v[8], v[7])
draw_triangle(v[1], v[4], v[7])
draw_triangle(v[1], v[10], v[4])
draw_triangle(v[10], v[11], v[4])
draw_triangle(v[11], v[5], v[10])
draw_triangle(v[5], v[3], v[11])
draw_triangle(v[3], v[6], v[5])
draw_triangle(v[6], v[8], v[3])
draw_triangle(v[8], v[9], v[6])
draw_triangle(v[9], v[7], v[8])
draw_triangle(v[7], v[1], v[9])
draw_triangle(v[2], v[1], v[9])
draw_triangle(v[2], v[10], v[1])
draw_triangle(v[2], v[5], v[10])
draw_triangle(v[2], v[6], v[5])
draw_triangle(v[2], v[9], v[6])
end_shape
end
def draw_triangle(p1, p2, p3)
p1.to_vertex(renderer)
p2.to_vertex(renderer)
p3.to_vertex(renderer)
end
end
No comments:
Post a Comment