coding Shift_JIS; import Math; import Text; import GUI; import File; import tool.Graph2D; /** グラフに描画する数式 x(t) のデフォルト入力値です。 */ const string DEFAULT_X_EXPRESSION = "cos(5*t)"; /** グラフに描画する数式 y(t) のデフォルト入力値です。 */ const string DEFAULT_Y_EXPRESSION = "sin(10*t)"; /** 媒介変数 t(時刻)の最大値(終了値)のデフォルト入力値です。 */ const string DEFAULT_T_MAX = "1.0"; /** 媒介変数 t(時刻)の最小値(開始値)のデフォルト入力値です。 */ const string DEFAULT_T_MIN = "-1.0"; /** 媒介変数 t の範囲を分割する点数(プロット点数)のデフォルト入力値です。 */ const string DEFAULT_T_N = "300"; // 以下、グラフやGUIコンポーネントIDを格納する変数 /** グラフのIDを格納します。 **/ int graph = NULL; /** 入力画面のウィンドウのIDを格納します。 */ int window = NULL; /** x(t) の数式を入力するテキストフィールドのIDを格納します。 */ int xExpressionField = NULL; /** y(t) の数式を入力するテキストフィールドのIDを格納します。 */ int yExpressionField = NULL; /** 時刻 t の最大値を入力するテキストフィールドのIDを格納します。 */ int tMaxField; /** 時刻 t の最小値を入力するテキストフィールドのIDを格納します。 */ int tMinField; /** 時刻の刻み数(=グラフのプロット点数)を入力するテキストフィールドのIDを格納します。 */ int tNField; /** PLOTボタンのIDを格納します。 */ int plotButton; /** CLEARボタンのIDを格納します。 */ int clearButton; /** ANIMATIONボタンのIDを格納します。 */ int animationButton; /** EXPORTボタンのIDを格納します。 */ int exportButton; /** EXITボタンのIDを格納します。 */ int exitButton; /** * プログラムの開始時に自動で実行されます。 */ void main(){ // GUIを備えたツールではコンソール画面は邪魔なので非表示化 hide(); // システム側で標準接続されている2DグラフソフトがあればIDを取得(無ければnewGraph2D関数同様、新規に立ち上がる) graph = getGraph2D(); // ※ 普通に newGraph2D 関数で新規生成しないのは、このプログラムがリニアングラフ2Dにも同梱されるツールであり、 // リニアングラフ2D上でメニューからこのプログラムを実行した際に、そのグラフ自身を制御対象とするためです。 // グラフ画面の位置とサイズを設定 setGraph2DLocation(graph, 330, 0); setGraph2DSize(graph, 720, 600); // 設定画面を起動 createInputWindow(); // ※ ユーザーがボタンを押すとグラフが描かれる処理などは、 // 後方の onButtonClick 関数を起点として実行されます。 } /** * 引数に指定された数式をグラフにプロットします。 * * @param xExpression プロットするxの数式(時刻変数tの関数) * @param yExpression プロットするyの数式(時刻変数tの関数) * @param yMin 時刻変数tの最小値(開始値) * @param yMax 時刻変数tの最大値(終了値) * @param n プロット点数 */ void plotGraph( string xExpression, string yExpression, double tMax, double tMin, int n ){ // グラフソフトに転送するデータ配列 double xArray[n]; double yArray[n]; // グラフを構成する点の x, y 座標および時刻 t を格納する変数 //(入力された x, y の数式の中でも変数 t は参照するので、スコープの都合上ここで宣言) double x; double y; double t; // x, y の数式が文法的に正しいか検査 if( !evaluable(xExpression, 0.0) ){ alert("x(t)の式に誤りがあります。"); return; } if( !evaluable(yExpression, 0.0) ){ alert("y(t)の式に誤りがあります。"); return; } // 時間範囲をn分割した時刻 t において、数式から x, y の値を求め、配列に格納 float dt = (tMax-tMin)/(n-1); for( int i=0; i