行列と幾何変換 II

今回の授業では、平面上の図形の点の線形変換とアフィン変換を考えます。

復習:「家」の輪郭を描く。

ヒント:以下の三角の点列と四角の点列を使って、シンプルな「家」を描けます。

  • triangle_nodes: (-3,2), (3,2), (0,3)
  • square_nodes: (-2,2), (-2,0), (2,0), (2,2)
In [5]:
%ここで点の座標を書いてください。
triangle_nodes = [-3, 2; 3, 2; 0, 3; -3, 2]';
square_nodes = [-2, 2;-2, 0; 2, 0; 2, 2]';

hold on
plot(triangle_nodes(1,:), triangle_nodes(2,:),'-ro')
plot(square_nodes(1,:), square_nodes(2,:),'-ro')
grid on
axis("equal")
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 -3 -2 -1 0 1 2 3 gnuplot_plot_1a gnuplot_plot_2a

2. 線形変換

2.1 拡大・縮小変換

点の$x$座標または$y$座標を$t$倍にすることで、図形の拡大と縮小ができます。

$x$方向で$t$倍にする変換に対応する行列$A_x$:

$$ x'=tx,y' = y \Leftrightarrow \left(\begin{array}{c} x' \\ y' \end{array}\right) = \left(\begin{array}{cc} t & 0 \\ 0 & 1 \end{array}\right) \left(\begin{array}{c} x \\ y \end{array}\right) \quad A_x:=\left(\begin{array}{cc} t & 0 \\ 0 & 1 \end{array}\right) $$

$y$方向で$t$倍にする変換に対応する行列$A_y$:

$$ x'=x,y' = ty \Leftrightarrow \left(\begin{array}{c} x' \\ y' \end{array}\right) = \left(\begin{array}{cc} 1 & 0 \\ 0 & t \end{array}\right) \left(\begin{array}{c} x \\ y \end{array}\right) \quad A_y=\left(\begin{array}{cc} 1 & 0 \\ 0 & t \end{array}\right) $$

演習1

演習1で考えた「家」を$x$方向$2$倍、$y$方向$1.5$倍に伸ばして、描いてください。

今回の変換は二つの線形変換の合成になって、合成変換はまた行列で表現することができます。

$$ \left(\begin{array}{c} x' \\ y' \end{array}\right) = A_x \left(\begin{array}{c} x \\ y \end{array}\right) ,\quad \left(\begin{array}{c} x'' \\ y'' \end{array}\right) = A_y \left(\begin{array}{c} x' \\ y' \end{array}\right) \quad \Rightarrow \left(\begin{array}{c} x'' \\ y'' \end{array}\right) = A_y A_x \left(\begin{array}{c} x \\ y \end{array}\right) \quad $$

即ち、$A=A_yA_x$が合成変換に対応する行列です。

$$ A = A_yA_x = \left(\begin{array}{cc} 2 & 0 \\ 0 & 1.5 \end{array}\right) $$
In [20]:
%ここで演習のコードを書いてください。

p_list = [-3,2;-2,2; -2,0; 2,0; 2,2;  3,2; 0,3; -3,2]';

hold on
plot(p_list(1,:),p_list(2,:),'-r')

A=[2, 0; 0, 1.5];

new_p_list = A*p_list;
plot(new_p_list(1,:), new_p_list(2,:),'-b')

grid on
axis("equal")
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -2 -1 0 1 2 3 4 5 6 7 -6 -4 -2 0 2 4 6 gnuplot_plot_1a gnuplot_plot_2a

2.2 回転変換

点$(x,y)$を原点に関して反時周り$\alpha$度で回転するための変換を考えます。

回転後の点を$(x',y')$とする。回転変換は以下の行列を使って表現できます。

$$ \left(\begin{array}{c}x\\y\end{array}\right) \Rightarrow \left(\begin{array}{c}x'\\y'\end{array}\right) = A \left(\begin{array}{c}x\\y\end{array}\right) $$

ここで、$A$は以下の形を持っています。 $$ A=\left(\begin{array}{cc} \cos \alpha & -\sin \alpha \\ \sin \alpha & \cos \alpha \end{array}\right) $$

回転変換の行列を求める

$(x,y)$を極座標で考えます。 $$ (x,y) = ( r \cos(\theta) , r \sin(\theta) ) $$ この点を反時周り$\alpha$度で回転する後、新しい座標$(x',y')$は以下のようになります。 $$ (x',y') = ( r \cos(\theta+\alpha), r \sin (\theta+\alpha) ) $$ 三角関数の計算を行って、以下の結果が分かります。 $$ x'= r \cos(\theta) \cos(\alpha) - r \sin(\theta) \sin(\alpha),\quad y'= r \cos(\theta) \sin(\alpha) + r \sin(\theta) \cos(\alpha) $$

例1:

頂点(0,0), (1,0), (1,1)を持っている三角形を反時計周り60度で回転します。 回転前の三角形をを青色、回転後の三角形を赤色で描きます。

In [6]:
p_list =[ 0, 1, 1;
          0, 0, 1 ]
          
fill( p_list(1,:), p_list(2,:), 'blue')

alpha = 60/180*pi;
A=[cos(alpha), -sin(alpha); sin(alpha), cos(alpha)];
new_p_list = A*p_list;
hold on
fill( new_p_list(1,:), new_p_list(2,:), 'red')
axis("equal")
p_list =

   0   1   1
   0   0   1

Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.2 0.4 0.6 0.8 1 1.2 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a

演習2

演習1で考えた「家」をそれぞれ反時計周り30度,60度、90度、180度で回転して、描画しなさい。

In [6]:
%ここで演習のコードを書いてください。

p_list = [-3,2;-2,2; -2,0; 2,0; 2,2;  3,2; 0,3; -3,2]';

hold on
plot(p_list(1,:),p_list(2,:),'-r')

%回転行列を作ってください。
alpha = 30/180*pi;
A=[cos(alpha), -sin(alpha); sin(alpha), cos(alpha)];

new_p_list = A*p_list;
plot(new_p_list(1,:), new_p_list(2,:),'-b')
grid on
axis("equal")
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -1 0 1 2 3 -3 -2 -1 0 1 2 3 gnuplot_plot_1a gnuplot_plot_2a

2.3 直線$y=x$に関する反射変換

直線$y=x$に関する反射変換に対応する行列を求めます。

$R^2$空間の基底 $\{e_1, e_2\}$ ($e_1=(1,0), e_2=(0,1)$)を考えます。

  • $e_1$の$y=x$に関する反射は $f_1=(0,1)$です。

  • $e_2$の$y=x$に関する反射は$f_2=(1,0)$です。

よって、任意の点 $$ (x,y) = x\cdot e_1 + y\cdot e_2 $$ の$y=x$に関する反射点は $$ (x',y') =x \cdot f_1 + y \cdot f_2 = x\cdot (0,1) + y \cdot (1,0) $$ です。

ですので、直線$y=x$に関する反射変換は以下の式で現れます。 $$ \left( \begin{array}{c} x' \\ y' \end{array}\right) = \left( \begin{array}{cc} 0 & 1 \\ 1 & 0 \end{array}\right) \left( \begin{array}{c} x \\ y \end{array}\right) $$

例2:

「家」の直線$y=x$に関する反射変換を行います。

In [10]:
%ここに回答を書いてください。
hold on

%以下のp_listを自作の家のデータに書き直してください。
p_list = [-3,2;-2,2; -2,0; 2,0; 2,2;  3,2; 0,3; -3,2]';
plot(p_list(1,:), p_list(2,:),'-r')

A=[0, 1; 1, 0];

new_p_list = A*p_list;
plot(new_p_list(1,:), new_p_list(2,:),'-g')

%反射軸を描く
xlist=-3:0.5:3; ylist=xlist;
plot(xlist, ylist,'-b')

grid on
axis("equal")
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a

演習 3

直線$y=2x$に関する反射の変換行列を求めよ。この変換を「家」に作用してみてください。

ヒント:以下の計算手順で、??のあるところを答えを書いてください。

直線$y=2x$に関する反射変換に対応する行列を求めます。

$R^2$空間の基底 $\{e_1, e_2\}$ ($e_1=(1,0), e_2=(0,1)$)を考えます。

  • ベクトル$e_1$の$y=2x$に関する反射は $f_1=(??,??)$です。

  • ベクトル$e_2$の$y=2x$に関する反射は$f_2=(??,??)$です。

よって、任意の点

$$ (x,y) = x\cdot e_1 + y\cdot e_2 $$

の$y=2x$に関する反射点は

$$ (x',y') =x \cdot f_1 + y \cdot f_2 = x\cdot (??,??) + y \cdot (??,??) $$

です。

ですので、直線$y=2x$に関する反射変換は以下の式で現れます。

$$ \left( \begin{array}{c} x' \\ y' \end{array}\right) = \left( \begin{array}{cc} ?? & ?? \\ ?? & ?? \end{array}\right) \left( \begin{array}{c} x \\ y \end{array}\right) $$
In [ ]:
%ここに回答を書いてください。
hold on

%以下のp_listを自作の家のデータに書き直してください。
p_list = [-3,2;-2,2; -2,0; 2,0; 2,2;  3,2; 0,3; -3,2]';
plot(p_list(1,:), p_list(2,:),'-r')

A=[??];

new_p_list = A*p_list;
plot(new_p_list(1,:), new_p_list(2,:),'-g')


grid on
axis("equal")

2.4 一般的な線形変換

以下の行列Aは点列に関してどうのような変換を行いますか? 図形を描いて確認してください。

また、Aを自由に試して描画する時、以下のことを考えてください。

  • 変換前後の図形の面積の変化とAの行列式の関係
  • 特に、行列式が0,または負の場合、それに対応する幾何変換の特徴
  • 変換前に平行である線分は変換後に変わりますか?
  • 図形の中の点と点の間の距離は変換前後変わりますか?

様々な変換行列 A

  • A=[1,1;0,1]
  • A=[1,0;0,-1]
  • A=[1,1;1,1]
In [28]:
p_list = [-3,2;-2,2; -2,0; 2,0; 2,2;  5,2; 0,3; -3,2]';
plot(p_list(1,:), p_list(2,:),'-ro')
hold on
A=[-2,1;0,1]
new_p_list = A*p_list;
plot(new_p_list(1,:), new_p_list(2,:),'-g')

grid on
axis("equal")
A =

  -2   1
   0   1

Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -4 -2 0 2 4 6 -8 -6 -4 -2 0 2 4 6 8 gnuplot_plot_1a gnuplot_plot_2a

3. アフィン変換

アフィン変換は線形変換(拡大や縮小,回転など)と平行移動を組み合わせた変換です. 一般的なアフィン変換は以下の形にかけます。

$$ \left(\begin{array}{c}x\\y\end{array}\right) \Rightarrow \left(\begin{array}{c}x'\\y'\end{array}\right) = \left(\begin{array}{cc}a&b\\c&d\end{array}\right) \left(\begin{array}{c}x\\y\end{array}\right) + \left(\begin{array}{c}x_0 \\ y_0 \end{array}\right) $$

ここで、$(x_0,y_0)$は平行移動の方向を示しています。

注意: アフィン変換は線形変換ではないです!

演習 4

以下の変換に対応する$A$と$(x_0,y_0)$を求めて、変換を「家」の図形にかけてみてください。

  • [1] 反時計回り45度回転して、$x$方向で距離$2$、$y$方向で距離$3$移動すること。
  • [2] $x$方向で距離$2$、$y$方向で距離$3$で移動してから、反時計回り45度回転すること。

[2]のヒント:

$x_1=2, y_1=3$とすると、

$$ \left(\begin{array}{c}x\\y\end{array}\right) \Rightarrow \left(\begin{array}{c}x'\\y'\end{array}\right) = \left(\begin{array}{cc}a&b\\c&d\end{array}\right) \left( \left(\begin{array}{c}x\\y\end{array}\right) + \left(\begin{array}{c}x_1 \\ y_1 \end{array}\right) \right) = \left(\begin{array}{cc}a&b\\c&d\end{array}\right) \left(\begin{array}{c}x\\y\end{array}\right) + \left(\begin{array}{cc}a&b\\c&d\end{array}\right) \left(\begin{array}{c}x_1 \\ y_1 \end{array}\right) $$
In [ ]: