Class: IRB::RubyModel
Instance Method Summary collapse
- #init_ruby_model ⇒ Object
-
#initialize ⇒ RubyModel
constructor
A new instance of RubyModel.
- #render_frame(i) ⇒ Object
Constructor Details
#initialize ⇒ RubyModel
Returns a new instance of RubyModel.
63 64 65 |
# File 'lib/irb/easter-egg.rb', line 63 def initialize @faces = init_ruby_model end |
Instance Method Details
#init_ruby_model ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/irb/easter-egg.rb', line 67 def init_ruby_model cap_vertices = (0..5).map {|i| Vec.new(*Complex.polar(1, i * Math::PI / 3).rect, 1) } middle_vertices = (0..5).map {|i| Vec.new(*Complex.polar(2, (i + 0.5) * Math::PI / 3).rect, 0) } bottom_vertex = Vec.new(0, 0, -2) faces = [cap_vertices] 6.times do |j| i = j-1 faces << [cap_vertices[i], middle_vertices[i], cap_vertices[j]] faces << [cap_vertices[j], middle_vertices[i], middle_vertices[j]] faces << [middle_vertices[i], bottom_vertex, middle_vertices[j]] end faces end |
#render_frame(i) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/irb/easter-egg.rb', line 83 def render_frame(i) angle = i / 10.0 dir = Vec.new(*Complex.polar(1, angle).rect, Math.sin(angle)).normalize dir2 = Vec.new(*Complex.polar(1, angle - Math::PI/2).rect, 0) up = dir.cross(dir2) nm = dir.cross(up) @faces.each do |vertices| v0, v1, v2, = vertices if v1.sub(v0).cross(v2.sub(v0)).dot(dir) > 0 points = vertices.map {|p| [nm.dot(p), up.dot(p)] } (points + [points[0]]).each_cons(2) do |p1, p2| yield p1, p2 end end end end |