(追記:2014-3-3) Gvizについてのまとめ頁を作りました。

Gvizの目次 - Rubyの世界からGraphvizの世界にこんにちは!


前回の続きなわけです。

Graphvizがドローイングソフトになってしまった件について

今回は、GvizのDraw系メソッドを使ってサインカーブを描いたら、その美しさに癒やされたという話です。

gviz | RubyGems.org | your community gem host

melborne/Gviz

つまり、Gvizでこんなお遊びもできるよという話ですね。


まずは座標軸を。

#graph.ru
line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

save :sine
% gviz build
% open sine.dot

出力です。ちなみにこのlineは内部的には見えないノードを結ぶエッジで描いてます。

Alt title noshadow

point

さて、最初にpointを使ってサインカーブを書いてみます。

line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

r = 50
(-180).step(to:180, by:5).each do |i|
  y = r * Math.sin(i * Math::PI / 180.0)
  point :"#{i}", x:i, y:y
end

save :sine

このコードのポイント、何だか分かりますか?

そうです、Numeric#stepでキーワード引数使ってるところですね!Ruby2.1の新機能です。これまだ、るりまにも載っていません(riにはあります)。

出力です。

Alt title noshadow

サインカーブです。美しいです。

circle

さて、次にcircleを使ってサインカーブに立体感を出してみます。

line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

r = 50
(-180).step(to:180, by:5).each do |i|
  y = r * Math.sin(i * Math::PI / 180.0)
+  circle :"#{i}", x:i, y:y
end

save :sine

出力です。

Alt title noshadow

立体感出ました。干渉縞が見えます。いいですね。

さて、次は少しcircleの径を弄ってみます。原点からの距離に応じて経を大きくします。

line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

r = 50
(-180).step(to:180, by:5).each do |i|
  y = r * Math.sin(i * Math::PI / 180.0)
+  circle :"#{i}", x:i, y:y, r:(i*0.004).abs
end

save :sine

出力です。

Alt title noshadow

うねってます、トルネードです。

もっと径を大きくしてみます。密度も増やし、色を付けて。

+ nodes colorscheme:"blues9"
+ nums = (1..9).cycle

line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

r = 50
+ (-180).step(to:180, by:1).each do |i|
  y = r * Math.sin(i * Math::PI / 180.0)
+  circle :"#{i}", x:i, y:y, r:(i*0.02).abs, color:nums.next
end

save :sine

出力です。

Alt title noshadow

印象が大分変わりました。サインカーブの面影が消えました。中心辺りじっと見てるとその渦の中に吸い込まれそうになります。美しいです。ところで、こういうときEnumerable#cycleは便利ですね。

diamond

次に、diamondをやってみます。

line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

r = 50
(-180).step(to:180, by:5).each do |i|
  y = r * Math.sin(i * Math::PI / 180.0)
+  diamond :"#{i}", x:i, y:y
end

save :sine

出力です。

Alt title noshadow

金属棒を曲げたような硬質な感じがします。カーブのところの格子状模様がいいですね。

diamondのサイズを変えて、色を付けてみます。

line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

r = 50
(-180).step(to:180, by:5).each do |i|
  y = r * Math.sin(i * Math::PI / 180.0)
+  diamond :"#{i}", x:i, y:y, width:5, color:"brown"
end

save :sine

出力です。

Alt title noshadow

面白い形ができました。レモン絞りの突起のような形が中に見えます。

star

Graphvizにはstarという変わったshapeもあります。最後にこれを出力してみましょう。

line :x, from:[-180,0], to:[180,0]
line :y, from:[0,-100], to:[0, 100]

r = 50
(-180).step(to:180, by:5).each do |i|
  y = r * Math.sin(i * Math::PI / 180.0)
+  star :"#{i}", x:i, y:y, width:5, color:"gold"
end

save :sine

出力です。

Alt title noshadow

頂点の軌跡が描くサインカーブが美しいです。


簡単なコードで変化に飛んだ実に美しい絵が描かれるものです。


=== Ruby関連電子書籍100円で好評発売中! ===

M’ELBORNE BOOKS

ruby_parallel rack js_oop



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS