リニアングラフの最新版をリリース、2D版でも描画エンジンの直接操作が可能に

RINEARNではこの度、3次元グラフソフト「リニアングラフ3D」の最新版「 5.6.26 」、 および2次元版「リニアングラフ2D」の最新版「 5.6.24 」をリリースしました。

今回は、それぞれの主なアップデート内容をお知らせします!

リニアングラフ2Dでも、Java®言語による描画エンジンの直接操作が可能に

まずは、今回のアップデートの最も大きな点についてご紹介しましょう。

リニアングラフをJava言語で制御するAPI

リニアングラフは、2D版と3D版の両方において、Java言語から制御するためのAPIをサポートしています。 これにより、ファイルを開いたり、オプションを操作したり、画像を保存したりといった、基本的なグラフ操作をJava言語プログラムから行う事ができます。 加えて、プログラム内で生成したデータを、ファイルを介さずに配列として渡してプロットしたり、それを高速に繰り返してアニメーションさせたり、といった事も可能です。

3Dでは、描画を細かく制御するための、描画エンジンの操作APIを既にサポート
一方で2Dでは…

ただ、プログラムからの制御では、上述のような一般的なグラフソフトの機能の範囲をさらに超えて、 「 ここに、この色と大きさで点を描きたい 」や「 こことここを繋ぐ、これくらいの太さの線を引きたい 」 といった細かい描画操作を行いたくなる場面もあります。

そのような用途をカバーするために、既にリニアングラフ3Dでは、描画エンジンを直接操作可能なAPIをサポートしていました。 一方で2D版の方では、これまで未サポートの状態が続いていました。

今回から、2Dでも描画エンジンの直接操作が可能に

そこで今回のアップデートでは、リニアングラフ2DのJava言語用APIを拡充し、3D同様の描画エンジン操作機能を新たにサポートしました。 これによって、以下のような簡単な記述で、画面上に自由に点や線などを描く事が可能です:

- 描画エンジンAPIの使用例 (部分的に抜き出し) -
code/Graph2DRendererApiSample.java

上記は、リニアングラフ2Dの配布パッケージ内に「 Sample5.java 」として同梱されているコードから、ヘッダや main 関数宣言などを削って、本質部分を抜き出したものです。

上記を実行すると、以下のように点と線が描かれたグラフが表示されます:

描画エンジンの直接操作機能は、イベント処理などを併せて実装する事で、既存のプロットオプションやその他のグラフ機能と併用できます(同梱の Sample6.java がそのサンプル実装です)。 そのため、自由にグラフ内容を描画したいという用途だけでなく、 既存の方法で(データファイルを開いたりして)プロットしているグラフに、補助線などを重ね描きしたいといった用途にも使用可能です。

この機能の詳しい使い方については、同梱の取扱説明書か、以下のWeb版ユーザーガイドのページ、およびAPIリファレンスのページなどをご参照ください:

上記APIを通して操作可能な描画エンジン機能については、現状ではまだ単純なものしかカバーしていませんが、今後も必要性や需要に応じて拡充していく予定です(3Dも同様です)。

リニアングラフ3Dでは、細かい描画周りの微調整が中心

一方でリニアングラフ3Dでは、今回は大きな機能の追加などは無く、描画周りの品質を向上させるための微調整が中心です。

具体的には、各座標軸の長さを変えても軸ラベルの余白が一定に保たれるようにしたり、 近接した面ポリゴンの遠近制御の精度(Zソート法という描画アルゴリズムを採用しているため、限界があります)を向上させて、 操作時に稀に局所的に前後関係が反転する“ちらつき”を抑えたり、等々です。 詳細は配布パッケージ同梱のリリースノートをご参照ください。

2D/3D両者において、APIで配列データを渡した後に、その配列が内部でバッファとして流用される挙動の修正も

機能面の拡張については、以上の通りです。

加えて、今回のアップデートでは、両者のJava言語用APIにおいて、半ばバグに近い(仕様では未定義な)不便な挙動があった点の修正を行いました。 具体的には、以下の通りです。

Java言語用APIには、グラフに配列データを渡してプロットさせる機能があります。 ただ、渡した配列データは、リニアングラフ内部で読み込まれるだけでなく、一次処理のためのバッファとしても使用され、 従って呼び出し元の配列の内容が、リニアングラフによって書き変えられてしまうケースも存在しました(※グラフの描画内容には問題は生じません)。 例えば、対数プロットオプションを使用した場合などに、配列内の値が対数値に変換されていました。

これは、この機能が、アニメーションなどの高速データ転送時のオーバーヘッドを削るため、 「 バッファを兼ねた配列スペースに値を詰めてそのまま参照を渡す 」という設計/実装になっていたためです。 しかしドキュメントにはその旨の記載もなく、仮に記載があったとしてもデフォルト挙動としては厄介すぎるという判断から、 今回から配列の参照がそのまま渡されるのではなく、別の配列を自動確保した上で全要素値がコピーされて渡されるようにしました。

これによってリニアングラフ内外で配列の参照が切れるため、渡した配列が読まれた後は、リニアングラフ側から操作される事はなくなりました。 一方で、データの受け渡しのオーバーヘッドが若干増加しました。 現状では問題になるようなオーバーヘッドではありませんが、将来的には、 コピーせずバッファ参照を直接渡せる方法も(オプションなどで切り替え可能にして)再びサポートするかもしれません。

その他、細かい点も

他にも、いくつか細かい点の更新などを含んでいます。メニュー非表示時の余白の調整や、ビルド環境の OpenJDK 16 への移行などです。詳細はリリースノートをご参照ください。

今回のアップデート内容は以上です。 今回も、追加/修正されたいくつかの機能において、ユーザー様からのご意見・ご要望や、先行開発版による動作検証などのご協力をいただきました。 今回ご協力くださった方々や、貴重なフィードバックをお寄せいただいた方々には、この場をお借りして、改めて御礼申し上げます。

これからも、RINEARNでは貢献活動の一環として、リニアングラフのメンテナンスや改良を継続してまいりますので、どうぞ今後ともご愛用いただけますと幸いです。