Hatena::ブログ(Diary)

わさっき RSSフィード

2014年08月06日

[] 画像生成の方法

GitHubで公開している三角パズルsolverですが,今朝,sample以下を大幅に見直し,それに合わせてlib以下も書き換えました.lib/helper.rbでこれまで定義していたメソッドモジュールTrianglePuzzle::Helperに入れ,外部コマンド(convert,ffmpeg)やフォント(Liberation-Sans-Regular*1)が利用可能かチェックするメソッドを新たに定義しました.

画像は,ImageMagickのconvertコマンドに,引数を与えて生成させています.その座標は,Rubyスクリプトで算出しています.image_stepbystepという名前のブランチをmasterから派生させ,作り方が分かるよういくつかの画像を置きました*2.本記事でも画像を1枚ずつ,紹介することにします.

まずはキャンバスを用意します.400x400とし,分かりやすいようskyblueで塗りつぶしましておきます.

f:id:takehikom:20140806210449j:image

次に,適当な半径の円を描きます.この円は,本来の(問題や解答の)図には出現しない,いわば基準線です.

f:id:takehikom:20140806210450j:image

10個の数を置くための位置を決め,線で結びます.

f:id:takehikom:20140806210451j:image

6個の和を置くための位置を決め,点線を引きます.「2つの数の和」の先は,3箇所とも,円周上にあります*3

f:id:takehikom:20140806210452j:image

6個の和を乗せるための四角形を配置します.

f:id:takehikom:20140806210453j:image

6個の和を置きます.1桁でも2桁でも,センタリングさせています*4

f:id:takehikom:20140806210454j:image

10個の数を乗せるための円を配置します.

f:id:takehikom:20140806210455j:image

10個の数を置きます.ここはすべて1桁なので,センタリングの方法は共通です.

f:id:takehikom:20140806210456j:image

キャプションを置きます.

f:id:takehikom:20140806210457j:image

図は一応完成,なのですが,上や左に比べて,下と右の余白が大きいのが気になります.そこで,左と,余白の長さが同じになるように,下と右をカットします.

f:id:takehikom:20140806210458j:image

左・下・右の余白は同じになりました*5が,画像サイズが当初の400x400よりも小さくなってしまいました.そこで,400x400に拡大します.

f:id:takehikom:20140806210459j:image

これで出来上がりです.が,白塗り・円なしの,デフォルトの図も,貼り付けておきましょう.

f:id:takehikom:20140806210500j:image

*1:このフォントは,http://www.fontex.org/download/liberation-sans.ttfよりダウンロードできます.Ubuntuでは,「apt-get install fonts-liberation」コマンドでインストール可能です.

*2スクリプトは,lib/image.rbのみ変更しています.

*3:その3つの点で正三角形になります.それらと,10個の数字のうち最も中心から遠い3つの数を置く中心点を結ぶと,正六角形ができます.

*4:現在,フォント名は「Liberation-Sans-Regular」固定でして,フォントフォントサイズの変更は今後の課題です.

*5:上の余白の変更は,キャプションの配置も変更する必要があるので,今回,行っていません.

2014年08月04日

[] 三角パズルsolverをGitHubで公開

gitrubyなどが利用可能な方は,以下のコマンドで動作確認ができます.まず

$ git clone https://github.com/takehiko/trips
$ cd trips

とします.

$ ruby sample/run1.rb

で,例題を解きます.

$ ruby sample/run2.rb

を実行すると,ヒントが減ると時間のかかるのを確認したあと,問題と解答の2枚の画像を作成します.

$ ruby sample/run3.rb

ではなく

$ ruby sample/run3.rb execute

を実行することで,一辺の長さが5の場合のすべての解(オンメモリ),4の場合のすべての解のGIFアニメMPEG4動画の生成を行います*1.時間もディスクも消費するので,「ruby sample/run3.rb」の実行では,メッセージを表示して終了するようにしました.

画像と動画の生成スクリプトについては,新たにエントリを作ってお知らせします.

*1:動画はf:id:takehikom:20140803212045fよりご覧ください.毎秒2枚なので,960通りの解の表示には8分かかります.8kbpsにしていることもあり,めまぐるしく動く数字のところは,かなり汚い表示となります.