練習問題3

Get Version

1.0.0

課題19: 円

# kadai19.rb
require 'sgl'

def setup
  window -200, -200, 200, 200
  background 100
  $x = 0
  $y = 0
end

def onMouseDown(x, y)
  $x = x
  $y = y
end

def display
  color 100, 0, 0
  circle($x, $y, 100)
end

mainloop

円を描く.マウスボタンを押すと,ボタンを押したところに移動する. プログラムの構造は課題15Aで導入された構造を使っている.

def display
  colorHSV 66, 100, 100, 30
  circle($x, $y, 100, POLYGON)
end

塗り潰された円を描く.

def display
  colorHSV 33, 100, 100, 30
  circle($x, $y, 100, POLYGON, 5)
end

五角形を描く.いままで円といってきたものは,実は正確には正32角形である. 上記circle文の5のところを32にすると,普通の円と同じになる.

def display
  x = mouseX
  y = mouseY
  colorHSV 8, 100, 100, 50
  circle(x, y, 100, POLYGON, 7)
end

マウスを押されないでもついてくるようにする.

課題20: 三次元

# kadai20.rb
require 'sgl'

window -200, -200, 200, 200

push
color 100, 0, 0
translate 30, 40, 20
rotateZ 10
rotateY 20
rotateX 30
scale 20
rect -5, -5, 5, 5
pop

wait

課題14の物体の移動の例とほとんど同じだが,translate 30, 40, 20として 三つの値を指定している点,rotateZだけではなく,rotateY rotateXを 使っている点が違う.三つめの値はZ軸,奥行きである.手前が正の値,奥の ほうが負の値となる.vertexを使った形の描画は,三つの値を指定することで 3Dに対応できる.

require 'sgl'

def setup
  window -200, -200, 200, 200
  background 100
end

def display
  x = mouseX
  y = mouseY

  push
  color 100, 0, 0
  translate x, y, 0
  rotateX x
  rotateY y
  scale 20
  rect -5, -5, 5, 5
  pop
end

mainloop

マウスの移動と組み合わせることもできる.

require 'sgl'

def setup
  window -200, -200, 200, 200
  background 100
  $pos = []             # 中身が空の配列を用意する.
end

def display
  x = mouseX
  y = mouseY

  $pos << [x, y]     # 配列に現在のマウスの位置を追加する.

  $pos.each {|pos|   # 配列の各々の要素について,{}の中身を実行する.
                     # その各々の要素は,posという変数に入る.
    x = pos[0]
    y = pos[1]

    push
    colorHSV 0, 100, 100, 10
    translate x, y, 0
    rotateX x
    rotateY y
    scale 20
    rect -5, -5, 5, 5
    pop
  }

  if 10 < $pos.length    # 配列がたまりすぎた場合は,先頭から順に捨てていく.
    $pos.shift
  end
end

mainloop

配列の使用と組み合わせてみている.

30th June 2007