Mousetrap()は、マウスをクリックしたときの座標から、グラフ用の引数を取得します。最初のスクリプトは、マウスボタンを押すたびに実行され、2番目のスクリプトはマウスボタンを放すたびに実行され、ハンドルの新しい座標に従って、グラフを動的に更新します。Handleと同様に、Mousetrapの座標に初期値を設定することが重要になります。グラフにMousetrap()とHandle()の両方を含める場合は、Handle()をMousetrap()の前に配置します。そうすれば、Handle()の方がMousetrap()より先にクリックを捉えることができます。
次の例では、Mousetrap()とHandle()の両方を使って、Mousetrap()の座標によって変化する3次元の関数を定めます。Handle()の値に基づいて、等高線を1本描きます。
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
);
// zの丸め値をハンドルから取得
Handle( -4.5, z0, z0 = Round( y * 10 ) / 10 );
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 );
)
);
この例では、MouseTrapの最初のスクリプトの引数が空であることに注意してください。マウスボタンを押しても、何も起こりません。第2引数のスクリプトadd pointは、マウスボタンを放したときに実行され、データ点が追加されます。クリックしてドラッグし、マウスボタンを放した場合、データセットに追加される点は、マウスボタンを押した位置の点ではなく、マウスを移動した後の位置の点です。