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