見出し画像

インドラの真珠:回転と相似変換

 図形を原点を中心として回転します。
点 $${(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}$$の終点(矢印の先端)をドラッグすると図形全体を任意に回転できます。 ベクトルの長さも変えることができて、その長さに比例して図形も拡大・縮小されます。
 もとの図形は緑の点をドラッグして変形、左下の黒い点をドラッグして位置変更ができます。 

画像7

 行列での計算は,回転行列をかけて、さらに拡大・縮小の係数をかけるのですが,このような変換を相似変換といいます。 

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

画像7

       ========================

ここからあとは,この図の作り方です。
 Cinderellaでは、上の2つはいずれも「モード」メニューの「変換」「相似変換」で作図することができます。

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

画像1

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

画像2

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

画像3

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

画像4

「平行移動」と同じように,家の図の位置を動かしたり,変形できるようにするには,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;
);
画像5

なお,はじめにリンク先で動かしたものは,ベクトルが4つ(直交するベクトルの組)と行列の式が表示されています。これらは作図ツールやCindyScriptで作ることができますが,これはパスします。

次節:鏡映変換

インドラの真珠:目次 に戻る