技術屋にゃん兵衛のてくてくらぼ by データウィズ [DataWith]

気の向くままソフトについて書いてます。バリバリエンジニアではないのであくまでも初心者目線で。

Wolfram EngineをVisualBasicで使う(11:数式を画像にする)

Wolfram EngineをVisualBasicで使う(11:数式を画像にする)

 

Wolfram Mathematicaの中で、数式を書くとき、パレット使うと、教科書に出ているような形で数式を入力できます。また、Wolfram言語で書いたものもこの形式に変換することもできます。

 

入力を教科書の数式のようにするのはさすがに無理ですが、Wolfram言語で書いた数式を教科書のような形式にして、これをそれなりの画像にすることはできそうです。

 

  1. GUIのデザインは次のようにします。テキストボックスにWolfram言語で数式を入力してボタンを押すと、それを成形して、画像として下のPictureBoxに表示できるようにします。

    フォームの作成
  2. コードは次のようになります。画像の大きさなどは必要に応じて変えてくださいね。

    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を画像の中央に配置してグラフィックスとして処理できるようにします。

    reference.wolfram.com

     を参照。

    Dim result_plot As Image = ml.EvaluateToImage("Rasterize[graphic, ""Image"", ImageSize -> 150]", 300, 300)

    この行で出来上がった画像を指定されたサイズでラスタライズします。それを画像オブジェクトとしてVisualBasicに返します。

  3. 実際に実行してみます。最初に次の普通の数式を入れてみます。

    y = (x^2 + 3*x + 8) / (x - 2)

    Wolfram言語での数式入力

    「Show」を押すと、次のようになりました。

    出力された数式
  4. もう少し複雑な次の2つをそれぞれ試してみます。Wolfram言語の表記方法に従って入力します。

    y = (x^2 + 3*x + 8) / Sqrt[x – 2]

    平方根の表示

    y = Integrate[x^2 + Sin[x]Cos[x], x]

     

    積分の表示
  5. ただ、このままではこれらの数式をMS Wordに貼ったりして再利用できないため、エクスポート用の次の1行を足して画像ファイルとして保存するようにしました(これはVisualBasic側のコマンドです)。

    result_plot.Save("C:\equation\equation.png", Imaging.ImageFormat.Png)

  6. 実行すると次のように画像ファイルが作成されました。

  7.  

    レビューすると、次のように数式が画像で保存されています。

    生成された画像ファイル

 

今日はここまで。