Mousetrap()は、マウスをクリックしたときの座標から、グラフ用の引数を取得します。最初のスクリプトは、マウスボタンを押すたびに実行され、2番目のスクリプトはマウスボタンを放すたびに実行され、ハンドルの新しい座標に従って、グラフを動的に更新します。Handleと同様に、Mousetrapの座標に初期値を設定することが重要になります。グラフにMousetrap()とHandle()の両方を含める場合は、Handle()をMousetrap()の前に配置します。そうすれば、Handle()の方がMousetrap()より先にクリックを捉えることができます。
x0 = 0;
y0 = 0;
z0 = 0;
win = New Window( "3次元関数の等高線",
Graph Box(
Frame Size( 300, 300 ),
X Scale( -5, 5 ),
Y Scale( -5, 5 ),
Contour Function(
Exp( -(x - x0) ^ 2 ) * Exp( -(y - y0) ^ 2 ) * (x - x0),
x,
y,
z0 / 10
);
Handle( -4.5, z0, z0 = Round( y * 10 ) / 10 );
// zの丸め値をハンドルから取得
V Line( -4.5 );
Text Size( 9 );
Text(
Counterclockwise,
{-4.6, -4},
"ドラッグして等高線のz値を設定: z = " || Char( z0 / 10 )
);
Marker Size( 2 );
Marker( 2, {x0, y0} );
Mousetrap( // 基準点をクリックポイントに設定
x0 = x;
y0 = y;
);
Text(
{-4.25, -4.9},
"任意の位置をクリックして関数の中心点を設定。"
);
)
);
メモ: Mousetrap()の式でx0をxに、y0をyに設定する代わりに、Function( {xx, yy}, Show( xx, yy ); x0 = xx; y0 = yy );を使うことができます。xxとyyは、この関数の正式なパラメータで、 ユーザがグラフをクリックしたときにMousetrapによって渡される引数に含まれています。Function( {xx, yy}...)ではxxとyy名前を明示的に指定しており、xとyに限らず任意の名前を付けられることがわかります。
図12.27 Mousetrap()とHandle()
グラフ上で点を視覚的に補間したりするために、Mousetrap()を使ってデータテーブルに点を収集することもできます。次に、(二変量の関係の散布図のような)プロット上でマウスをクリックし、その点をデータテーブルに追加するスクリプトの例を示します。スクリプトを実行してグラフ内をクリックすると、クリックした点がデータテーブルに記録されます。
dt = New Table( "データ1" );
New Column( "xx", Numeric );
New Column( "yy", Numeric );
x = 0;
y = 0;
Add Point = Expr(
dt << Add Rows( 1 );
Row() = N Row();
:xx = x;
:yy = y;
);
win = New Window( "点の追加",
Graph Box(
Frame Size( 500, 300 ),
X Scale( -5, 5 ),
Y Scale( -5, 5 ),
For Each Row( Marker( {xx, yy} ) );
Mousetrap( {}, Add Point );
)
);