coding Shift_JIS; import Math; import Text; import GUI; import File; import tool.Graph3D; /** グラフに描画する数式 z(x,y) のデフォルト入力値です。 */ const string DEFAULT_Z_EXPRESSION = "sin(2*x) + cos(2*y)"; /** グラフのX範囲の最大値のデフォルト入力値です。 */ const string DEFAULT_X_MAX = "1.0"; /** グラフのX範囲の最小値のデフォルト入力値です。 */ const string DEFAULT_X_MIN = "-1.0"; /** グラフのメッシュにおけるX方向の点数のデフォルト入力値です。 */ const string DEFAULT_X_N = "80"; /** グラフのY範囲の最大値のデフォルト入力値です。 */ const string DEFAULT_Y_MAX = "1.0"; /** グラフのY範囲の最小値のデフォルト入力値です。 */ const string DEFAULT_Y_MIN = "-1.0"; /** グラフのメッシュにおけるY方向の点数のデフォルト入力値です。 */ const string DEFAULT_Y_N = "80"; // 以下、グラフやGUIコンポーネントIDを格納する変数 /** グラフのIDを格納します。 **/ int graph = NULL; /** 入力画面のウィンドウのIDを格納します。 */ int window = NULL; /** z(x,y) の数式を入力するテキストフィールドのIDを格納します。 */ int expressionField = NULL; /** X軸の最大値を入力するテキストフィールドのIDを格納します。 */ int xMaxField = NULL; /** X軸の最小値を入力するテキストフィールドのIDを格納します。 */ int xMinField = NULL; /** グラフのメッシュにおけるX方向の点数を入力するテキストフィールドのIDを格納します。 */ int xNField = NULL; /** Y軸の最大値を入力するテキストフィールドのIDを格納します。 */ int yMaxField = NULL; /** Y軸の最小値を入力するテキストフィールドのIDを格納します。 */ int yMinField = NULL; /** グラフのメッシュにおけるY方向の点数を入力するテキストフィールドのIDを格納します。 */ int yNField = NULL; /** PLOTボタンのIDを格納します。 */ int plotButton = NULL; /** CLEARボタンのIDを格納します。 */ int clearButton = NULL; /** EXPORTボタンのIDを格納します。 */ int exportButton = NULL; /** EXITボタンのIDを格納します。 */ int exitButton = NULL; /** * プログラムの開始時に自動で実行されます。 */ void main(){ // GUIを備えたツールではコンソール画面は邪魔なので非表示化 hide(); // システム側で標準接続されている3DグラフソフトがあればIDを取得(無ければnewGraph3D関数同様、新規に立ち上がる) graph = getGraph3D(); // ※ 普通に newGraph3D 関数で新規生成しないのは、このプログラムがリニアングラフ3Dにも同梱されるツールであり、 // リニアングラフ3D上でメニューからこのプログラムを実行した際に、そのグラフ自身を制御対象とするためです。 // グラフ画面の位置とサイズを設定 setGraph3DLocation(graph, 350, 0); setGraph3DSize(graph, 720, 600); // プロットオプションを設定 setGraph3DOption( graph, "WITH_POINTS", false ); setGraph3DOption( graph, "WITH_LINES", false ); setGraph3DOption( graph, "WITH_MEMBRANES", true ); setGraph3DOption( graph, "WITH_MESHES", false ); // 設定画面を起動 createInputWindow(); // ※ ユーザーがボタンを押すとグラフが描かれる処理などは、 // 後方の onButtonClick 関数を起点として実行されます。 } /** * 引数に指定された数式をグラフにプロットします。 * * @param zExpression プロットするzの数式(xとyの関数) * @param xMin x軸の最小値 * @param xMax x軸の最大値 * @param xN グラフのメッシュにおけるX方向の点数 * @param yMin y軸の最小値 * @param yMax y軸の最大値 * @param yN グラフのメッシュにおけるY方向の点数 */ void plotGraph( string zExpression, double xMin, double xMax, int xN, double yMin, double yMax, int yN ){ // グラフに転送するデータ配列 double xArray[yN][xN]; double yArray[yN][xN]; double zArray[yN][xN]; // グラフを構成する点の X, Y, Z 座標を格納する変数 //(入力された z の数式の中でも変数 x, y は参照するので、スコープの都合上ここで宣言) double x; double y; double z; // z の数式が文法的に正しいか検査 if( !evaluable(zExpression, 0.0) ){ alert("z(x,y)の式に誤りがあります。"); return; } // xとyの範囲をそれぞれxN,yN分割したメッシュの格子点において、数式からzの値を求め、配列に格納 float dx = (xMax-xMin)/(xN-1); float dy = (yMax-yMin)/(yN-1); for( int xi=0; xi