hirax.net::inside out::2009年11月05日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2009年10月 を読む << 2009年11月 を読む >> 2009年12月 を読む

2009-11-05[n年前へ]

無料のMathematica Player + IronRuby でグラフィック出力 

 無料のWolfram Mathematica Playerに付属のMathematicaカーネルではグラフィック出力ができず、グラフ描画や各種グラフィック機能を有効利用するための方法を試行錯誤していました。そんな中、「Mathematica Player+IronPython関連記事」中の、無料のMathematica Playerで画像を出力してみた(IronPythonで)」で実に技術を駆使した方法で、その問題が解決されていました。

 基本的な計算は、Mathematica Playerに付属するMathematicaカーネルにやらせ、その結果を画像にするRasterize部分を、Mathematica Playerにやらせる、そしてその結果を.NET/LINKで「操作スクリプト」に送りつける(スクリプト側はデータを受け取る)という、具合です。こういったスクリプトをさらりと書けるようになりたいものです…。

 さて、というわけで、IronRubyで同様のことをしてみました。まずは、クラスなどは作らず、ただ単に「(ネットワークからの)データ取得→計算・画像作成→Windows上でフォーム上に描画」ということを順を追って行うスクリプトを書いてみました。それが、下になります。

# c.f. http://boxheadroom.com/2009/10/30/mathematica_ipy_image
# c.f. http://d.hatena.ne.jp/arikui/20070918/1190050541

com='ExampleData[{"Geometry3D","Beethoven"}] '
width=1000

include System
require 'System.Windows.Forms'
require 'System.Drawing'
require 'mscorlib'
require 'Wolfram.NETLink'
include Wolfram::NETLink

kernelLink=MathLinkFactory.CreateKernelLink()
kernelLink.WaitAndDiscardAnswer()
kernelLink.EvaluateToInputForm(
   '$ct={{0,0,1},{0,1,0},{1,0,0}};',0)
tmpl='$im=Rasterize['+com+
    ', ImageSize->'+width.to_s+',Background->Black];'
kernelLink.EvaluateToInputForm(tmpl,0)
k=kernelLink.EvaluateToInputForm(
    '$im=ImageData[$im,"Byte"];',0)
k=kernelLink.EvaluateToInputForm(
      '$im2=$ct.#&[#]&/@#&/@$im;',0)
kernelLink.PutFunction(
        "EvaluatePacket",1)
kernelLink.PutSymbol("$im2")
kernelLink.EndPacket()
kernelLink.WaitForAnswer()
ret=kernelLink.GetObject()

height=ret.length/width/3
form=System::Windows::Forms::Form.new()
form.width  = width
form.height = height
graph=System::Windows::Forms::PictureBox.new()
graph.width=width
graph.height=height
graph.top=0
graph.left=0
graph.image=System::Drawing::Bitmap.new(
       width, height)
height.times{|y|
 width.times{|x|
  color=System::Drawing::Color.FromArgb(
             255,ret[y,x,0],
             ret[y,x,1], ret[y,x,2])
  graph.image.SetPixel(x, y, color)    
  }
}
graph.Refresh
form.controls.add(graph)
form.ShowDialog()
 このスクリプトを流すと、まずMathKernel.exeのパス(場所)を尋ねるダイアログが現れ、次にMathematicaPlayer.exeのパスを尋ねるダイアログが現われます。そして、Mathematica Playerが起動した後に、下の画像のような「ルートヴィヒ・ヴァン・ベートーヴェンの三次元像」が作成され、Windows上にダイアログとして現れます。



 …数式処理ソフトウェアで眺めるベートーベンも(そのデータがネットワーク上から取得できることも合わせて)面白いですが、ここまで色々できてしまうということが、とても楽しいものです。つまりは、結果よりも、過程を楽しんでいるような感じです。

 ところで、Pythonのコードを読むのは初めてだったのですが、何だか知らない言語を読むというのは「違った視点」を感じるような気がして、新鮮なものですね。

無料のMathematica Player + IronRuby でグラフィック出力