#!ruby # -*- mode: ruby; coding: utf-8 -*- # Last updated: <2016/02/13 01:33:57 +0900> # # エルミート曲線をDXRubyで描画してみる # # 参考ページ # # 1.エルミート曲線軌道 # http://1st.geocities.jp/shift486909/program/hermite.html # # 2005-09-18 - ゲームプログラムめも日記 # http://d.hatena.ne.jp/kenmo/20050918#p1 # # エルミート曲線 | ゲームを作りたい人のためのソースコード集 # http://blog.higashisanmyaku.jp/?eid=123 require 'dxruby' Window.caption = "Hermite Curve" fnt = Font.new(12) # 始点、終点 p = [ [100, 200], [500, 300] ] # 始点ベクトル、終点ベクトル v = [ [50, -150], [20, -200] ] mode = 0 # 四角を描画 def draw_dot(x, y, size, color) x1, y1 = x - size, y - size x2, y2 = x + size, y + size Window.drawBoxFill(x1, y1, x2, y2, color) end # ベクトルを描画 def draw_vec(x, y, vx, vy, color) Window.drawLine(x, y, x + vx, y + vy, color) end Window.loop do break if Input.keyPush?(K_ESCAPE) if Input.mousePush?(M_LBUTTON) # マウスの左ボタンが押されたので各座標を指定する mx, my = Input.mousePosX.to_f, Input.mousePosY.to_f case mode when 0 p[0] = [mx, my] when 1 v[0] = [mx - p[0][0], my - p[0][1]] when 2 p[1] = [mx, my] when 3 v[1] = [mx - p[1][0], my - p[1][1]] end mode += 1 mode = 0 if mode >= 4 end p0x, p0y = p[0] p1x, p1y = p[1] v0x, v0y = v[0] v1x, v1y = v[1] # 始点、終点、始点ベクトル、終点ベクトルを描画 draw_dot(p0x, p0y, 2, [255, 0, 0]) draw_dot(p1x, p1y, 2, [255, 0, 0]) draw_vec(p0x, p0y, v0x, v0y, [0, 128, 255]) draw_vec(p1x, p1y, v1x, v1y, [0, 128, 255]) d = 48 # 分解度 d.times do |i| t1 = (0.0 + i) / (d - 1.0) t2= t1 * t1 t3= t1 * t1 * t1 mp0= t3 * 2.0 - t2 * 3.0 + 1.0 mv0= t3 - t2 * 2.0 + t1 mp1= -t3 * 2.0 + t2 * 3.0 mv1= t3 - t2 x= p0x * mp0 + v0x * mv0 + p1x * mp1 + v1x * mv1 y= p0y * mp0 + v0y * mv0 + p1y * mp1 + v1y * mv1 draw_dot(x, y, 1, C_WHITE) end Window.drawFont(4, 4, "Please click [#{mode}]", fnt) end