« 時計をつくる1 | トップページ | 時計をつくる3 »

2009年5月 9日 (土)

時計をつくる2

前回は単純な線だった時計の時針と分針をもう少し時計らしい針にしてみます。
draw_polygonというメソッドを使えばよいらしい。
とりあえず針を描くだけでまだ時間は刻みません。

針の形状を座標の配列にしてdraw_polygonに渡してやると
その形で描画してくれます。

draw_polygonで描いてみるとジャギが目立ちます。アンチエイリアスをサポートしているらしいGCDC経由で描画を試したのですが、画面に何も表示されなくなってしまった。単純に置き換えるだけではダメらしい。とりあえずDCで描くように作ってみた。今回座標計算はしてますが無意味。

  1. require 'rubygems'
  2. require 'wx'
  3. require 'RTC.rb'
  4.  
  5. class RubyThroughClock < RTC
  6.   def initialize(parent = nil)
  7.     super()
  8.  
  9.     evt_paint(){drawClock()}
  10.     m_spinctrl1.evt_spinctrl(m_spinctrl1.get_id()){|event| updateHour(event)}
  11.     m_spinctrl2.evt_spinctrl(m_spinctrl2.get_id()){|event| updateMin(event)}
  12.  
  13.     # structure for testing
  14.     @time = Struct.new('Time', :hour, :min).new
  15.     @time.hour = 0
  16.     @time.min = 0
  17.   end
  18.  
  19.   def updateHour(event)
  20.     @time.hour = @m_spinctrl1.get_value
  21.     drawClock()
  22.   end
  23.  
  24.   def updateMin(event)
  25.     @time.min = @m_spinctrl2.get_value
  26.     drawClock()
  27.   end
  28.  
  29.   def drawClock()
  30.     paint do |dc|
  31.     #paint_buffered do |gc|
  32.       #dc = Wx::GCDC.new(dc)
  33.  
  34.       # Set background color
  35.       dc.set_background_mode(Wx::TRANSPARENT)
  36.       dc.set_background(Wx::NULL_BRUSH)
  37.  
  38.       # Clear DC
  39.       dc.set_brush(Wx::Brush.new(Wx::TRANSPARENT_BRUSH))
  40.       dc.clear
  41.  
  42.       # Get current time
  43.       #time = Time.now
  44.       time = @time
  45.  
  46.       # Draw the current time
  47.       dc.set_pen(Wx::Pen.new(Wx::RED, 8))
  48.       time_str = "%02d" % time.hour.to_s + ':' + "%02d" % time.min.to_s
  49.       dc.draw_text(time_str, 5, dc.size.height - 30)
  50.  
  51.       # Calculate hour's x,y
  52.       hour_x = - (dc.size.height / 2) * Math.sin(Math::PI * ( - 30 * (time.hour % 12)) / 180)  + (dc.size.width  / 2)
  53.       hour_y = - (dc.size.height / 2) * Math.cos(Math::PI * ( - 30 * (time.hour % 12)) / 180)  + (dc.size.height / 2)
  54.  
  55.       # Calculate min's x,y
  56.       min_x = - (dc.size.height / 2) * Math.sin(Math::PI * (- 6 * time.min ) / 180)  + (dc.size.width  / 2)
  57.       min_y = - (dc.size.height / 2) * Math.cos(Math::PI * (- 6 * time.min ) / 180)  + (dc.size.height / 2)
  58.  
  59.       # Draw Circle
  60.       dc.draw_circle(dc.size.width / 2, dc.size.height / 2, dc.size.height / 2)
  61.  
  62.       # Draw Hour hand
  63.       hand = [ [0, dc.size.height / 30], [-5, 0], [0, -dc.size.height / 4], [5, 0] ]
  64.       dc.set_pen(Wx::Pen.new(Wx::WHITE, 1))
  65.       dc.draw_polygon(hand, dc.size.width / 2, dc.size.height / 2)
  66.  
  67.       # Draw Min hand
  68.       hand = [ [0, dc.size.height / 30], [-5, 0], [0, -dc.size.height / 2], [5, 0] ]
  69.       dc.set_pen(Wx::Pen.new(Wx::GREEN, 2))
  70.       dc.draw_polygon(hand, dc.size.width / 2, dc.size.height / 2)
  71.     end
  72.   end
  73. end
  74.  
  75.  
  76. class App < Wx::App
  77.   def on_init
  78.     f =  ::RubyThroughClock.new
  79.     f.show
  80.   end
  81. end
  82. App.new.main_loop
  83.  

実行結果。やはりジャギが目立ちます。

01

|

« 時計をつくる1 | トップページ | 時計をつくる3 »

時計をつくる」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1201593/29523193

この記事へのトラックバック一覧です: 時計をつくる2:

« 時計をつくる1 | トップページ | 時計をつくる3 »