SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|

2017-12-02(Sat) ドット絵をベクトルデータに変換

  ちょっとした用途のため、ドット絵をベクトルデータに変換するプログラムを書いてみた。

  画像の説明

  すると、なんだか「ゲームセンターあらし」を彷彿させる絵柄が現れた(笑)。


2017-12-07(Thu) タートルグラフィックスを実装

  先日に引き続き、ちょっとした用途のため、自製グラフィックライブラリにタートルグラフィックスの関数を追加することにした。習作として、フラクタル図形を描画するプログラムも書いてみる。やり始めたら極めてアッサリと、併せて数時間でできてしまった。

  まずは、12次のC曲線。

  画像の説明

 def c_curve(win, n, l)
     unless(n == 0)
         win.tLeft(45)
         c_curve(win, n - 1, l)
         win.tRight(90)
         c_curve(win, n - 1, l)
         win.tLeft(45)
     else
         win.tForward(l)
     end
 end
 
 win.tHome
 win.tRight(90)
 c_curve(win, 12, 4)

  次に、12次のドラゴン曲線。

  画像の説明

 def r_dragon(win, n, l)
     unless(n == 0)
         win.tLeft(45)
         r_dragon(win, n - 1, l)
         win.tRight(90)
         l_dragon(win, n - 1, l)
         win.tLeft(45)
     else
         win.tForward(l)
     end
 end
 
 def l_dragon(win, n, l)
     unless(n == 0)
         win.tRight(45)
         r_dragon(win, n - 1, l)
         win.tLeft(90)
         l_dragon(win, n - 1, l)
         win.tRight(45)
     else
         win.tForward(l)
     end
 end
 
 win.tHome
 win.tRight(90)
 r_dragon(win, 12, 4)

  最後に、7次のツリー。

  画像の説明

 def tree(win, n, l)
     unless(n == 0)
         win.tSetPenWidth(n * 2)
         win.tForward(l)
         win.tRight(25)
         tree(win, n - 1, l / 1.5)
         win.tLeft(55)
         tree(win, n - 1, l / 1.3)
         win.tRight(30)
         win.tBack(l)
     else
         win.tForward(l)
         win.tBack(l)
     end
 end
 
 win.tHome
 tree(win, 7, 96)

  描画結果は、svg形式でファイル出力される。上記の図形はOperaにレンダリングさせたもの。

  CADもイイけど、こういうロジックで描画させる方が好みだわ。


2017-12-16(Sat) パーフェクト破線描画ライブラリを実装

  自由な曲線を、意図した通りに制御しつつ描くためにはベジェ曲線が最適だ。それは角丸の長方形を描くためにも有用。破線も描きたい。しかも、一点鎖線も二点鎖線も、開始点も終止点も、線が直角に曲がっても破綻しない破線が。

  というわけで、先日のタートルグラフィックスに、パーフェクトなベジェ曲線と破線描画機能を実装してみた。文法は以下。

tThrough(終止点への角度, 終止点への距離, 終止点からの角度, {オプション})

  以下で、半径100の擬似真円を描ける。

4.times { tThrough(45, 141.421356, 45) }

  ちょっと調べた限り、タートルグラフィックスにベジェ曲線を実装した事例は多くないようだが、その中でも、我ながらもっともシンプルかつ美しい実装方法であると自負している。オプションを与えることで、制御点までの距離や、破線のパターン等も指定できる。

  で、描いたのがコレ。

  画像の説明

  で、それを描くコードがコレ。

     # ベジェ曲線テスト
     win.tSetPos(64, 64)
     win.tSetHeading(90)
     win.tArc(360, 4)
 
     win.tForward(100)
     win.tArc(360, 4)
 
     2.times {
         win.tThrough( 45, sqrt(120 ** 2 + 120 ** 2), -45)
         win.tArc(360, 4)
         win.tThrough(-45, sqrt(120 ** 2 + 120 ** 2),  45)
         win.tArc(360, 4)
     }
 
     # 波線テスト
   [false, true].each {|fit|
 
     win.tSetPos(64, fit ? 192 : 128)
     win.tSetHeading(90)
     win.tArc(360, 4)
 
     win.tDForward(*win.fit_dline(100, [0, [20, 10]], { :FIT => fit }))
     win.tArc(360, 4)
 
     2.times {
         win.tDThrough( 45, sqrt(120 ** 2 + 120 ** 2), -45, { :PAT => [0, [20, 10]], :DIVS => 16, :FIT => fit })
         win.tArc(360, 4)
         win.tDThrough(-45, sqrt(120 ** 2 + 120 ** 2),  45, { :PAT => [0, [20, 10]], :DIVS => 16, :FIT => fit })
         win.tArc(360, 4)
     }
   }

  で、ちょいとライブラリをOpenGL版に入れ替え、意味もなく3Dにしてグリグリと回してみたり。

  画像の説明

  思い返せば、このライブラリの原型を作ったのは10年以上前になるのか。こんなに長らく付き合うことになるとは思ってもみなかったな。