行列と幾何変換

平面上の点$(x,y)$を新しい点$(x',y')$に変換すること、所謂幾何変換を考えます。

内容の概要:

  • 平面上の点とグラフの表示
  • 線形変換
  • アフィン変換
  • 同次座標系

1. 平面上の点とグラフの表示

Octaveでは、plotを使って、点の表示ができます。

使い方:

  • plot( 点列のX座標のリスト、点列のY座標のリスト、プロットのフォマット)

例1:

(1,0)と (2,3)2つの点を「+」のマックで表示するために、下の命令を使用する。

  • plot ([1,2], [0,3], '+')
In [9]:
%plot -f svg
% 2つの点の表示
plot ([1,2], [0,3], 'r+')
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 2.5 3 1 1.2 1.4 1.6 1.8 2 gnuplot_plot_1a

配列を使って、点列を描画します。

Octaveの中では、「:」は「すべて」の意味をもっています。即ち、「すべての行」、または、「すべての列」です。

例: p_list =[ 0, 1, 1 ; 0, 0, 1] について、

  • p_list(:,1) はp_listのすべての行、第1列を示しています。即ち、点列の1番目の点。
  • p_list(1,:) はp_listの第1行、すべての列を示しています。即ち、すべての点のx座標。

注意

これからの計算では、長さがnである点列を$2\times n$の形の行列で表現します。そうすると、行列の各列は点列の点に対応します。

例2:

三点(0,0), (1,0), (1,1)を描いてみます。

ここで、「axis("equal")」によって、x軸とy軸のアスペクト比を1にすることができます。

In [2]:
p_list =[ 0, 1, 1 ; 
          0, 0, 1]

plot( p_list(1,:), p_list(2,:), 'r+-')
grid on
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 0 0.2 0.4 0.6 0.8 1 gnuplot_plot_1a

演習 1:「家」の輪郭を書いてください。

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

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

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つの点列を一つの点列にしてください。適当に、窓、ドアを追加しても良いです。

In [1]:
%ここでコードを書いてください。
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,:),'-bd')
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

2. 線形変換

2.1 拡大・縮小変換

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

$x$方向で$t$倍にする変換

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

$y$方向で$t$倍にする変換

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

演習2

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

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
In [ ]: