
インドラの真珠:回転と相似変換
図形を原点を中心として回転します。
点 $${(x,\ y)}$$を角θだけ回転した点を $${(X, \ Y)}$$とすると
$${X=x \cos \theta-y \sin \theta }$$
$${Y=x \sin \theta+y \cos \theta }$$
となります。
この係数を拾い出して
$${\begin{pmatrix}\cos \theta & -\sin \theta\\ \sin \theta & \cos \theta\\ \end{pmatrix} }$$
と表します。
これを「行列」といいます。行列を用いると,はじめの式は
$${\begin{pmatrix}X\\ Y\\ \end{pmatrix} = \begin{pmatrix}\cos \theta & \sin \theta\\ \sin \theta & \cos \theta\\ \end{pmatrix} \begin{pmatrix}x\\ y\\ \end{pmatrix} }$$
と表すことができます。右辺は行列どうしのかけ算です。行列についての,詳しくはここでは説明を省きます。CinderellaJapanの「Cinderella入門「行列と変換」をごらんください。ここでは,このような行列を用いて回転ができる,と思うくらいでよいでしょう。さらに係数をつけると回転に加えて拡大・縮小ができます。
リンク先を開くと,見出し画像の図が出ます。「1.平行移動」で作った家の絵を回転・拡大縮小できます。図形を原点を中心として回転すると同時に原点を中心に拡大・縮小します。
図で,赤いベクトルは青いベクトル(基本ベクトル)を回転したものです。赤いベクトル$${v_1}$$の終点(矢印の先端)をドラッグすると図形全体を任意に回転できます。 ベクトルの長さも変えることができて、その長さに比例して図形も拡大・縮小されます。
もとの図形は緑の点をドラッグして変形、左下の黒い点をドラッグして位置変更ができます。

行列での計算は,回転行列をかけて、さらに拡大・縮小の係数をかけるのですが,このような変換を相似変換といいます。
こちらのリンク先を開くと回転・拡大縮小のものと同じような図が出ますが,こちらはベクトル$${v_1}$$ の大きさは一定です。したがって,変化するのは角$${\theta}$$ だけで,原点周りの回転だけをします。

========================
ここからあとは,この図の作り方です。
Cinderellaでは、上の2つはいずれも「モード」メニューの「変換」「相似変換」で作図することができます。
ベクトルを2つと家の絵を描いておきます。これは「平行移動」で描いたものと同じようなものですが,こんどはベクトルを2つにしますので,家の絵はDから始まります。描き方は 「平行移動」のページを見てください。
まず,原点を始点とし,終点が$${x}$$ 軸上にある線分ABを作ります。次に,原点を始点とする線分ACを終点は適当にしてとります。「要素を動かす」ツールボタンを選んで,編集メニューからインスペクタを選び,この2つの線分を矢印にします。

「モード」メニューの「変換」から「相似変換」を選びます。 相似変換の設定は4つのステップからなります。
まず「1つ目のもとになる点を選ぶかこのモードを抜けます」というガイドが出るので、まず点Aをクリックし,「1つ目の点が写る点を選んでください」というガイドがでたらもう一度点Aをクリックします。 点Aを2回です。
「2つ目のもとになる点を選ぶかこのモードを抜けます」というガイドが出るので、ベクトルABの終点Bをクリックし,「2つ目の点が写る点を選んでください」というガイドがでたらベクトルACの終点Cをクリックします。

すると画面右上に相似変換のボタンができます。 動かすモードで家の図全体を選んでボタンを押すと変換した図ができます。

点Cをドラッグして動作を確かめてください。
どうなっているか説明しましょう。∠BACが回転行列の角で,$${\overrightarrow{AB}}$$ と$${\overrightarrow{AC}}$$ の長さの比が拡大比になるように作ったのが,Cinderellaの変換ー相似変換なのです。
始めに原点中心の円を描いておいて、2つのベクトルの終点をこの円周上にとれば、ACの長さが一定なので,回転だけができます。

「平行移動」と同じように,家の図の位置を動かしたり,変形できるようにするには,CindyScriptで同じようなプログラムを描きます。
Initialization スロットに,oldpos=D.xy; を,Draw スロットに次のコードを書きます。
if(mover()==D,
m=D.xy-oldpos;
E.xy=E.xy+m;
F.xy=F.xy+m;
G.xy=G.xy+m;
H.xy=H.xy+m;
oldpos=D.xy;
);

なお,はじめにリンク先で動かしたものは,ベクトルが4つ(直交するベクトルの組)と行列の式が表示されています。これらは作図ツールやCindyScriptで作ることができますが,これはパスします。
次節:鏡映変換
インドラの真珠:目次 に戻る