うしブログ

うしブログ

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

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

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

画面上の固定された位置に点を作成する裏技

このアプレットでは、画面をパンしたりズームしたりすると、それに伴って三角形DEFも、平行移動や拡大・縮小が行われます。

これは、3点D,E,Fがいずれも、特定の座標によって定義されているからです。

 

ところが、こちらのアプレットでは、三角形DEFは、画面をパンしてもズームしても、画面上の一定の位置を維持します。

これは、3点D,E,Fが、特定の座標によって定義されているわけではなく、特殊な方法で定義されているためです。

このように、画面上の一定の位置を維持する点(以下「画面固定点」という。)を作成することは、通常はできません。本記事では、画面固定点を作成する裏技を説明します。

裏技と言っても、バグを利用したり、システムを改変したりするわけではありません。あくまで、GeoGebraに実装された、通常利用可能な機能の組合せです。

 

方法

何でも良いので、テキストオブジェクトを1つ作成する。ここでは、そのテキストオブジェクトの名前は、「text1」であるとする。

f:id:usiblog:20180210230228p:plain

text1の位置を、

Corner[4] + (-10, 10)

として、「画面上の固定された位置」チェックボックスをオフにする。

f:id:usiblog:20180210230718p:plain

この時点で、text1は画面上から消えるが、問題ない。

 

続いて、画面固定点を作りたい場所(画面上の好きな場所で構わない)に、「点」ツールで点オブジェクトを作成する。ここでは、その点オブジェクトの名前は、「A」であるとする。

f:id:usiblog:20180210230922p:plain

入力バーに、以下の文字列(以下「コピペ文字列」という。)をコピペして、エンターキーを押す。

Corner[4] + (CopyFreeObject[( x(A)-x(Corner[4]) )/Distance[Corner[text1,1], Corner[text1,2]]]*Distance[Corner[text1,1], Corner[text1,2]], CopyFreeObject[( y(A)-y(Corner[4]) )/Distance[Corner[text1,1], Corner[text1,2]]]*Distance[Corner[text1,1], Corner[text1,2]])

なお、上記で作成したテキストや点の名前を、本記事が前提とする「text1」「A」以外にする場合には、コピペ文字列のうち、「text1」「A」とある部分(太字・色付にしてある)を、適宜置き換えて利用していただきたい。

 

そうすると、点Aの上に、新たな点が作成される。

f:id:usiblog:20180210232017p:plain

この点(上図でいう点B)が、目的の画面固定点である。これが作成された後であれば、もう点Aは消してしまっても差し支えない。

画面固定点である点Bは、画面をパンしてもズームしても、画面上の一定の位置をキープする。

f:id:usiblog:20180210232514g:plain

何が起こっているのか

テキストオブジェクトは、画面をパンすると、それに伴って移動しますが、画面をズームしても、見かけ上の大きさは変わりません。画面固定点の作成は、このテキストオブジェクトの性質を利用しています。

f:id:usiblog:20180210233442g:plain

なぜテキストオブジェクトなのか。ズームによって見かけ上の大きさが変わらないオブジェクトは、他にも存在します(点、スライダー、ボタン、チェックボックス、図など)。しかし、オブジェクトの大きさが計測でき、かつ動作が安定的であるものとして、テキストオブジェクトが最も適切だったので、これを採用しました。

 

コピペ文字列内の、

Distance[Corner[text1,1], Corner[text1,2]]

は、text1の左下隅から右下隅までの距離であり、すなわち、text1の横幅を表します。以下、これを「w」と表記します。

wは変数であり、画面を縮小するほど大きくなり、拡大するほど小さくなります。だからこそ、ズーム操作をしても、text1の見かけ上の大きさが維持されるのです。

これを利用して、任意の定数p, qを決めてやって、「画面の左上隅の点を、x軸方向にw*p, y軸方向にw*qだけ平行移動した点」を作成してやれば、その点は画面固定点となるのです。

 

定数p, qは、画面上のどの位置に画面固定点を作成したいかによって決めます。

今回は、自由な点オブジェクトAを、画面固定点を作成したい位置の目印として利用しました。そして、pの値は、

CopyFreeObject[( x(A)-x(Corner[4]) )/Distance[Corner[text1,1], Corner[text1,2]]]

としています。これは、「(点Aのx座標-Corner[4]のx座標)÷テキストの横幅」です。もっともこの値は、パンやズームによって変動するため、CopyFreeObjectコマンドで、現在の画面における計算結果を定数として取得しています。

同様に、qの値は、

CopyFreeObject[( y(A)-y(Corner[4]) )/Distance[Corner[text1,1], Corner[text1,2]]]

としています。

pとqの値をこのように決めることで、画面固定点の位置を、点Aと同じ位置とすることができます。