#!ruby -Ks # -*- mode: ruby; encoding: sjis -*- # Last updated: <2014/05/29 06:14:08 +0900> require 'dxruby' # 二次ベジェ曲線を描画するクラス class BezierDraw DBG = true # 二次ベジェ曲線を描画するための頂点リストを生成 # # @param [Number] x1 始点 x 座標 # @param [Number] y1 始点 y 座標 # @param [Number] x2 制御点 x 座標 # @param [Number] y2 制御点 y 座標 # @param [Number] x3 終点 x 座標 # @param [Number] y3 終点 y 座標 # @return [Array] ベジェ曲線を描画するための頂点座標配列 # def BezierDraw.calc(x1, y1, x2, y2, x3, y3) p = [] p.push([x1, y1]) t = 0.05 while t < 1.0 v = 1.0 - t a = v * v b = 2 * v * t c = t * t x = a * x1 + b * x2 + c * x3 y = a * y1 + b * y2 + c * y3 p.push([x, y]) t += 0.05 end p.push([x3, y3]) return p end # ベジェ曲線を描画 # # @param [Object] img Imageオブジェクト # @param [Array] p 頂点座標配列 # @param [Array] lcol 色配列。A,R,G,B が入ってる。 # def BezierDraw.draw(img, p, lcol) (p.size - 1).times do |i| j = i + 1 img.line(p[i][0], p[i][1], p[j][0], p[j][1], lcol) end end end if $0 == __FILE__ # ---------------------------------------- # 動作テスト img = Image.new(640, 480) p = [[30, 240], [300, 10], [600, 400]] lcol = [255, 255, 0, 0] Window.loop do break if Input.keyPush?(K_ESCAPE) p[1] = Input.mousePosX, Input.mousePosY x0, y0 = p[0] for i in 1..2 do x1, y1 = p[i] Window.drawLine(x0, y0, x1, y1, [128, 128, 128]) x0, y0 = x1, y1 end img.clear x1, y1 = p[0] x2, y2 = p[1] x3, y3 = p[2] np = BezierDraw.calc(x1, y1, x2, y2, x3, y3) BezierDraw.draw(img, np, lcol) Window.draw(0, 0, img) end end