Wolfram EngineをVisualBasicで使う(11:数式を画像にする)
Wolfram Mathematicaの中で、数式を書くとき、パレット使うと、教科書に出ているような形で数式を入力できます。また、Wolfram言語で書いたものもこの形式に変換することもできます。
入力を教科書の数式のようにするのはさすがに無理ですが、Wolfram言語で書いた数式を教科書のような形式にして、これをそれなりの画像にすることはできそうです。
- GUIのデザインは次のようにします。テキストボックスにWolfram言語で数式を入力してボタンを押すと、それを成形して、画像として下のPictureBoxに表示できるようにします。
-
コードは次のようになります。画像の大きさなどは必要に応じて変えてくださいね。
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ml As IKernelLink = MathLinkFactory.CreateKernelLink("-linkmode launch -linkname 'C:\Program Files\Wolfram Research\Wolfram Engine\13.3\WolframKernel.exe'")
ml.WaitAndDiscardAnswer()
ml.EvaluateToOutputForm("eqn = HoldForm[" + TextBox1.Text + "]; graphic = Graphics[{Text[eqn, {0, 0}] }]", 0)
Dim result_plot As Image = ml.EvaluateToImage("Rasterize[graphic, ""Image"", ImageSize -> 150]", 300, 300)
PictureBox1.Image = result_plot
End Sub
End Class
今回は、VisualBasicの記述よりは、Wolfram言語での記述がカギです。
最初の処理、
ml.EvaluateToOutputForm("eqn = HoldForm[" + TextBox1.Text + "]; graphic = Graphics[{Text[eqn, {0, 0}] }]", 0)
はどういうことかというと、「HoldForm」というのは、式の中を評価せずにそのままにしておくよ、ということで、テキストボックスに入れた式をeqnに代入します。
で、「Graphics」+「Text」で、文字列eqnを画像の中央に配置してグラフィックスとして処理できるようにします。
を参照。
Dim result_plot As Image = ml.EvaluateToImage("Rasterize[graphic, ""Image"", ImageSize -> 150]", 300, 300)
この行で出来上がった画像を指定されたサイズでラスタライズします。それを画像オブジェクトとしてVisualBasicに返します。
-
実際に実行してみます。最初に次の普通の数式を入れてみます。
y = (x^2 + 3*x + 8) / (x - 2)
「Show」を押すと、次のようになりました。
-
もう少し複雑な次の2つをそれぞれ試してみます。Wolfram言語の表記方法に従って入力します。
y = (x^2 + 3*x + 8) / Sqrt[x – 2]
y = Integrate[x^2 + Sin[x]Cos[x], x]
-
ただ、このままではこれらの数式をMS Wordに貼ったりして再利用できないため、エクスポート用の次の1行を足して画像ファイルとして保存するようにしました(これはVisualBasic側のコマンドです)。
result_plot.Save("C:\equation\equation.png", Imaging.ImageFormat.Png)
- 実行すると次のように画像ファイルが作成されました。
-
今日はここまで。