Class: IRB::RubyModel

Inherits:
Object show all
Defined in:
lib/irb/easter-egg.rb

Instance Method Summary collapse

Constructor Details

#initializeRubyModel

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_modelObject



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