うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

「動かそうとすると別の点が動く」の実現法

問題

GeoGebraで、下図のような挙動を実現する方法はあるでしょうか。

f:id:usiblog:20180107013553g:plain

点Aをドラッグすると、点Aではなく、点Bが動く。

点Bをドラッグすると、点Bではなく、点Aが動く。

なんとも不思議な挙動です。

 

検討①

まず、「点Aをドラッグしても、点Aが動かない」というのは、どうすれば実現できるでしょうか。

 

方法1:点Aのプロパティから、点Aを固定する。

f:id:usiblog:20180107014059p:plain

しかし、ゆくゆくは、点Bをドラッグしたときに、点Aを動かしたいことを考えると、この方法は使えないでしょう。

 

方法2:点Aのプロパティから、選択を許さないようにする。

f:id:usiblog:20180107014117p:plain

この方法はいい感じです。しかし、ゆくゆくは、点Aをドラッグした際の挙動を、点Bに伝えなければなりません。そう考えると、どうしてもユーザーに、選択でき、動かせる自由な点をドラッグしてもらわないことには、実現できそうにありません。

 

方法3:点Aが動いたそばから、もとの位置に戻すスクリプトを書く。

点Aは、固定せず、かつ選択を許しておきます。

点Aのそばに、自由な点Cを作ります。

f:id:usiblog:20180107015737p:plain

点AのOn Update ハンドラに、以下を記述します。

SetValue[A,C]

点Cは非表示にしておきます。

f:id:usiblog:20180107015909g:plain

点Aをドラッグすると、即座に点Aが点Cの位置に移動します。もはや、点Aをいくらドラッグしても、点Cがある位置から動きません。

f:id:usiblog:20180107020042g:plain

点Aをドラッグしたとき、いったい何が起こっているのでしょうか。順を追って見てみましょう。

①初期状態

何もしない状態です。点Aと、非表示である点Cは、同じ位置にあります。

f:id:usiblog:20180107021930p:plain

 

②点Aをドラッグしたとき

ここで、点Aをドラッグすると、点Aはマウスポインタの位置まで移動します。実際には、1回のドラッグ操作では、点Aはほんの少ししか移動しませんが、下図では見やすいように誇張してあります。

f:id:usiblog:20180107022020p:plain

 

③点AのOn Update スクリプトが実行される

ドラッグによって、点Aの位置が更新されたので、点AのOn Update スクリプトが実行されます。

その結果、点Aは点Cの位置に移動します。

f:id:usiblog:20180107022358p:plain

 

④次のドラッグ操作によって点Aが移動する

ここで、点Aを離さずにドラッグし続けると、2回目のドラッグ操作が行われます。その結果、点Aは、点Cの位置から、マウスポインタの位置まで移動します。

f:id:usiblog:20180107022634p:plain

 

⑤点AのOn Update スクリプトが実行される

2回目のドラッグによって、点Aの位置が更新されたので、点AのOn Update スクリプトが実行されます。

その結果、点Aは点Cの位置に移動します。

f:id:usiblog:20180107022715p:plain

以下、同じことの繰り返し。動画にすると、こんな感じです。

f:id:usiblog:20180107023630g:plain

点Aは、2段階の移動をセットで行っているということです。

第一段階:ドラッグ操作を原因として、「マウスポインタ上に移動する」。

第二段階:On Update スクリプトを原因として、「点Cの位置に移動する」という動きです。

第一段階が終了し、第二段階が未了の状態は、ディスプレイには表示されません。そのため、あたかも点Aが点Cの位置にあり続けるように見えるのです。

しかしながら、一瞬とはいえ、点Aがドラッグ操作でマウスポインタの位置まで移動する、という状態が現れます。これを利用すれば、欲しかった動きを取得することができます。

 

〜つづく〜