PointLineへの憧れ
はじめに
本記事の内容は、動的幾何学ソフト「PointLine」に触発されて得られた知見に基づいています。下記にPointLineへのリンクを掲載し、謝意を表します。
PointLineにおける点オブジェクトは、すべてがGeoGebraでいう「自由オブジェクト」であり、原則としてどの点でも動かすことができる。そして、点を動かした際の、他の点の挙動は、とても独特であり、しかしながら不規則という訳でもなく、非常に魅力的な動きをする。
本記事は、PointLineにおける点の挙動を、GeoGebraの視点から理解・説明しようという試みである。
※長期企画になります。分かるところから書き、随時増やしていきます。
円の中心と、円上の点
補助オブジェクト:C,D(自由な点)
AのOn Update スクリプト
SetValue[B,B+(UnitVector[Vector[C, B]] x(ExtendedAffineRatio[C, B, A] Distance[C, B]))/2]
SetValue[C,A]
SetValue[D,B]
BのOn Update スクリプト
SetValue[A,A+(UnitVector[Vector[D, A]] x(ExtendedAffineRatio[D, A, B] Distance[D, A]))/2]
SetValue[C,A]
SetValue[D,B]
※直感的説明:差分のベクトルのうち、「相手の点」成分の1/2のみで、相手の点を押す。
なお、
UnitVector[Vector[C, B]] x(ExtendedAffineRatio[C, B, A] Distance[C, B])
は冗長なので、以下ではこれを
というオリジナルツールとして標記する。
Push[<始点>, <目標>, <補助点>]
で、「始点が補助点からどれだけ動いたか」を表すベクトルのうち、「補助点→目標」方向の成分のみを抽出する。
外接する2つの円の中心
補助オブジェクト:C,D(自由な点)
前提オブジェクト:diff(2つの円の半径の差分;固定値)
円Aの定義
Circle[A, (Distance[A, B] + diff) / 2]
円Bの定義
Circle[B, (Distance[A, B] - diff) / 2]
Aのスクリプト
If[Distance[A,B]>diff,SetValue[B,B+Push[A,B,C]/3],SetValue[B,B+Push[A,B,C]]]
SetValue[C,A]
SetValue[D,B]
Bのスクリプト
If[Distance[A,B]>diff,SetValue[A,A+Push[B,A,D]/3],SetValue[A,A+Push[B,A,D]]]
SetValue[C,A]
SetValue[D,B]
※直感的説明:AB間の距離がdiffより大きい場合→差分のベクトルのうち、「相手の点」成分の1/3倍のみで、相手の点を押す。
AB間の距離がdiff以下になった場合→差分のベクトルのうち、「相手の点」成分の1倍で、相手の点を押す。