「動かそうとすると別の点が動く」の実現法
問題
GeoGebraで、下図のような挙動を実現する方法はあるでしょうか。
点Aをドラッグすると、点Aではなく、点Bが動く。
点Bをドラッグすると、点Bではなく、点Aが動く。
なんとも不思議な挙動です。
検討①
まず、「点Aをドラッグしても、点Aが動かない」というのは、どうすれば実現できるでしょうか。
方法1:点Aのプロパティから、点Aを固定する。
しかし、ゆくゆくは、点Bをドラッグしたときに、点Aを動かしたいことを考えると、この方法は使えないでしょう。
方法2:点Aのプロパティから、選択を許さないようにする。
この方法はいい感じです。しかし、ゆくゆくは、点Aをドラッグした際の挙動を、点Bに伝えなければなりません。そう考えると、どうしてもユーザーに、選択でき、動かせる自由な点をドラッグしてもらわないことには、実現できそうにありません。
方法3:点Aが動いたそばから、もとの位置に戻すスクリプトを書く。
点Aは、固定せず、かつ選択を許しておきます。
点Aのそばに、自由な点Cを作ります。
点AのOn Update ハンドラに、以下を記述します。
SetValue[A,C]
点Cは非表示にしておきます。
点Aをドラッグすると、即座に点Aが点Cの位置に移動します。もはや、点Aをいくらドラッグしても、点Cがある位置から動きません。
点Aをドラッグしたとき、いったい何が起こっているのでしょうか。順を追って見てみましょう。
①初期状態
何もしない状態です。点Aと、非表示である点Cは、同じ位置にあります。
②点Aをドラッグしたとき
ここで、点Aをドラッグすると、点Aはマウスポインタの位置まで移動します。実際には、1回のドラッグ操作では、点Aはほんの少ししか移動しませんが、下図では見やすいように誇張してあります。
③点AのOn Update スクリプトが実行される
ドラッグによって、点Aの位置が更新されたので、点AのOn Update スクリプトが実行されます。
その結果、点Aは点Cの位置に移動します。
④次のドラッグ操作によって点Aが移動する
ここで、点Aを離さずにドラッグし続けると、2回目のドラッグ操作が行われます。その結果、点Aは、点Cの位置から、マウスポインタの位置まで移動します。
⑤点AのOn Update スクリプトが実行される
2回目のドラッグによって、点Aの位置が更新されたので、点AのOn Update スクリプトが実行されます。
その結果、点Aは点Cの位置に移動します。
以下、同じことの繰り返し。動画にすると、こんな感じです。
点Aは、2段階の移動をセットで行っているということです。
第一段階:ドラッグ操作を原因として、「マウスポインタ上に移動する」。
第二段階:On Update スクリプトを原因として、「点Cの位置に移動する」という動きです。
第一段階が終了し、第二段階が未了の状態は、ディスプレイには表示されません。そのため、あたかも点Aが点Cの位置にあり続けるように見えるのです。
しかしながら、一瞬とはいえ、点Aがドラッグ操作でマウスポインタの位置まで移動する、という状態が現れます。これを利用すれば、欲しかった動きを取得することができます。
〜つづく〜