» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら
ユーザーが入力した数式を2Dグラフにプロットする
このVCSSLプログラムは、ユーザーが入力した数式を2Dグラフにプロットします。 サンプル的な短いコードなので、改造や流用のベースに適しています。
スポンサーリンク
使用方法
ダウンロードと展開(解凍)
まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされます。
その後、ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。
» 展開がエラーで止まってしまう場合や、ファイル名が文字化けしてしまう場合は…
プログラムの起動
Windows をご使用の場合
上記でZIPファイルを展開したフォルダ内にある、以下のバッチファイルをダブルクリック実行してください:
もしプログラムを書き変えながら使いたい場合は、代わりに「 VCSSL_Editor__プログラム編集はこちら.bat 」を実行してください。
正常に起動できると、初回のみ、Java実行環境を入手するか等を尋ねられるので、適時答えて済ませると、プログラムが起動します。 2回目以降はすぐに起動します。
Linux 等をご使用の場合
ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)
» javaコマンドが使用できない等のエラーが表示される場合は…
起動後の操作方法
起動すると、まず数式を入力する画面が表示されますので、入力してください。
続いてX軸の範囲(最小値と最大値)を入力すると、グラフ画面が起動し、数式のグラフがプロットされます。
コード解説
それでは、このプログラムのコード内容について解説していきます。 このプログラムのコードはVCSSLで記述されています。
前提
このプログラムのコード内容は、「 配列を2Dグラフにプロットする 」の応用となっています。 必要に応じて、そちらのコードもご参照ください。
コード全体
まずは、コード全体を見てみましょう。50行未満の短いコードです。
以上です。流れとしては、前半部で各パラメータや数式などを設定・取得し、 後半部で数式の値を計算して座標値配列に格納し、最後にそれをグラフにプロットしています。
先頭部分
先頭部分を見てみましょう。
先頭の「 coding Shift_JIS; 」では、プログラムの文字コードを明示しています( UTF-8も可 )。 必須ではありませんが、書いておくと文字化けするのを防げます。
「 import tool.Graph2D; 」の部分は、2次元グラフを扱うためのライブラリ「 tool.Graph2D 」を読み込んでいます。
「 import Math; 」の部分は、各種数学関数を提供する標準ライブラリ「 Math 」を読み込んでいます。 こうしておく事で、ユーザーが入力する数式で sin や cos などの使用をサポートする事ができます。
各パラメータや数式の用意
続いて、各パラメータや数式の用意です。
この通り、基本的には普通の変数定義です。
「 const int N = 100; 」の const は値を変更できなくする(定数にする)ためのキーワードで、付けても付けなくてもいいですが、付けておくと誤って書き換えてしまう事を防げます。
input関数は、ダイアログを表示して、ユーザーに値を入力してもらうための関数です。 ここではプロット範囲や数式などの入力に使用しています。 GUIで入力画面を作っても良いのですが、値が少ない場合はこのようにinput関数を使うほうが楽です。
座標値配列の用意
続いて今回の中核です。ここではユーザーが入力した数式の値を計算して、座標値配列に代入します。
ここで使用している feval 関数は、文字列変数に格納された式の内容を計算(評価)して、 値を float 型で返す関数です。 第二引数に 0.0 を指定していますが、こうしておくと式中の整数リテラル(数字)を小数と見なすオプションが適用されます (0.0でなくてもfloat型の値なら何でも同じ)。
今回のように数式プロットツールなどを作る場合、ユーザーが式中に "1/2" や "sin(1)" といった項を記述する事が予想されますが、 これを言語仕様のまま処理すると、整数除算や引数型エラーなど、色々と面倒な事になります。 なので、このようなオプションを付けて、数字を小数として扱わせます。
なお、feval 関数は eval 関数の派生型で、実はここは普通に eval 関数でも実行できます。 しかし、eval 関数は戻り値をstring型の配列で返すので、今回のように結果をfloat型の変数で受け取る場合、 内部でstring→float変換や、配列→非配列変換などのやや重い処理が生じます。 今回くらいの計算量では問題にならないのですが、プロット点数を増やしたり、 アニメーションなどを行う場合はボトルネックになっても嫌なので、 このように結果がfloatと決まりきっている場合は feval 関数を使用します。
式の動的評価というと一般に遅いイメージがありますが、 VCSSLの eval / feval 関数は、同じ式内容での連続呼び出しに関しては構文解析結果がキャッシュされるため、 あまり気にする必要はありません。 関数コールのオーバーヘッドを除けば、数式をそのままコード中にベタ書きしたのと大差ない速度で走ります。
プロット
最後に、書き出したファイルを2次元グラフにプロットする部分です。
上のほうの行の、newGraph2D関数で、2次元グラフソフトを起動しています。 この関数は、呼ぶ度にグラフソフトを1個起動し、そのグラフソフトに固有のID番号を割り振って返します。
例えば2次元グラフソフトを何個も起動した場合、12番グラフ、22番グラフ、101番グラフ、 …といったように、それぞれに番号が割り振られているわけです。 上では、生成したグラフに割り振られたID番号をint型変数「 graph 」に格納しているわけです。
続いて下のほうの行です。ここでは、setGraph2DData関数で、先ほど起動した2Dグラフソフトに、 座標値配列 xData, yData をプロットさせています。 ここで第一引数に、先ほどグラフ起動時に受け取ったID番号 graph を指定しています。 グラフが複数ある場合でも、このようにID番号で操作対象のグラフを区別できるわけです。
ライセンス
このVCSSL/Vnanoコード( 拡張子が「.vcssl」や「.vnano」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています※。 記事中にC言語/C++/Java言語などでのサンプルコードが掲載されいてる場合は、それらについても同様です。 そのままでのご利用はもちろん、改造や流用などもご自由に行ってください。
※ ただし、このコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。
※ Vnano の実行環境については、別途スクリプトエンジンのソースコードも一般公開しており、 何らかのソフトウェア内に組み込んでご利用いただく事も可能です。詳細はこちらをご参照ください。
この記事中の商標などについて
- OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
- Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
- Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
- その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。
Vnano版 | 積分値のグラフ描画用データを出力するプログラム |
|
|
数値的に積分を行い、結果の関数をグラフに描くためのデータを出力するコードです。 |
3Dグラフを回転アニメーションさせるツール |
|
|
3Dグラフを、Z軸まわりにゆっくりと回転アニメーションさせるツールです。全角度のグラフを、連番の画像ファイルに保存する事もできます。 |
連番ファイルから3Dグラフをアニメーション描画するツール |
|
|
フォルダ内の連番データファイルを読み込み、3Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。 |
連番ファイルから2Dグラフをアニメーション描画するツール |
|
|
フォルダ内の連番データファイルを読み込み、2Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。 |
z = f(x,y,t) の形の数式を3Dグラフとしてアニメーション描画するツール |
|
|
入力欄に z = f(x,y,t) の形の数式を入力すると、それを3次元のグラフにアニメーション描画してくれる簡易ツールです。 |
y = f(x,t) の形の数式を2Dグラフとしてアニメーション描画するツール |
|
|
入力欄に y = f(x,t) の形の数式を入力すると、それを2次元のグラフにアニメーション描画してくれる簡易ツールです。 |
t を媒介変数とする x(t), y(t), z(t) の数式を3Dグラフに描画し、アニメーションもできるツール |
|
|
入力欄に x(t), y(t), z(t) の形の数式を入力すると、それを t を媒介変数として3次元のグラフに描画し、アニメーションもできる簡易ツールです。 |
t を媒介変数とする x(t), y(t) の数式を2Dグラフに描画し、アニメーションもできるツール |
|
|
入力欄に x(t), y(t) の形の数式を入力すると、それを t を媒介変数として2次元のグラフに描画し、アニメーションもできる簡易ツールです。 |
z = f(x,y) の形の数式を3Dグラフとして描画するツール |
|
|
入力欄に z = f(x,y) の形の数式を入力すると、それを3次元のグラフに描いてくれる簡易ツールです。 |
y = f(x) の形の数式を2Dグラフとして描画するツール |
|
|
入力欄に y = f(x) の形の数式を入力すると、それを2次元のグラフに描いてくれる簡易ツールです。 |
配列を3Dグラフにアニメーションプロットする(曲面/メッシュグラフ) |
|
|
座標値配列の内容を、3次元の曲面/メッシュグラフに連続でプロットし、アニメーションさせるサンプルプログラムです。 |
配列を3Dグラフにアニメーションプロットする(点/線グラフ) |
|
|
座標値配列の内容を、3次元の点/線グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。 |
配列を2Dグラフにアニメーションプロットする |
|
|
座標値配列の内容を、2次元グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。 |
配列を3Dグラフにプロットする(曲面/メッシュグラフ) |
|
|
座標値配列の内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。 |
ファイルを3Dグラフにプロットする(曲面/メッシュグラフ) |
|
|
座標値ファイルの内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。 |
ユーザーが入力した数式を2Dグラフにプロットする |
|
|
実行時にユーザーが入力した数式の値を、2次元グラフにプロットするサンプルプログラムです。 |
配列を3Dグラフにプロットする(点/線グラフ) |
|
|
座標値配列の内容を、3次元の点/線グラフにプロットするサンプルプログラムです。 |
配列を2Dグラフにプロットする |
|
|
座標値配列の内容を、2次元グラフにプロットするサンプルプログラムです。 |
ファイルを3Dグラフにプロットする(点/線グラフ) |
|
|
座標値ファイルの内容を、3次元の点/線グラフにプロットするサンプルプログラムです。 |
ファイルを2Dグラフにプロットする |
|
|
座標値ファイルの内容を、2次元グラフにプロットするサンプルプログラムです。 |