Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

リサージュ図形

松江市 中学生Ruby教室でも使われたR2Dを使って、リサージュ図形をアニメーションしてみました。
R2Dを使うと手軽に視覚化できるので楽しいですね。
以下は、(x,y)=(cos\theta, sin(2\theta+\alpha^\circ))\alphaを0度から30度刻みで360度までアニメーションするスクリプトです。学生時代に行ったオシロスコープの実験を思い出しました。

# -*- coding: utf-8 -*-
require 'r2d'
include Math

w = window

class Numeric
  def to_rad
    self*PI/180
  end
end

alpha = 0
exp = ->(deg, alpha) {
  # (x, y) = (cosθ, sin(2θ+α))
  [cos(deg.to_rad)*200+w.w/2, -sin(2*deg.to_rad+alpha.to_rad)*200+w.h/2]
}
update do
  Rectangle.new(0, 0, w.w, w.h, 'black')
  Text.new(10, 10, 30, "α = #{alpha}", 'green')
  x1, y1 = exp.call(0, alpha)
  5.step(360, 5) {|deg|
    x2, y2 = exp.call(deg, alpha)
    Line.new(x1, y1, x2, y2, 2, "red")
    x1, y1 = x2, y2
  }
  alpha >= 330 ? alpha = 0 : alpha += 30
end

window :show

実行結果

静止画ですが、実際にはアニメーションで表示されます。