同次座標でアフィン変換をコンプリしよう
このページはマス旅の一部です。
前回は、同次座標の射影変換行列で並進が表現できましたね。
アフィン変換には並進の他に回転もありました。また、アフィン変換の部分として相似変換もあります。
今回は、同次座標で並進の他に、回転、拡大も表してみよう。
そして、「同次座標でアフィン変換をコンプリしよう。」
1.バラバラに考える
バラバラに考える
<並進(Taranslation)>
前回、アフィン平面の点を射影平面の点に置き換えたことを思い出そう。
ベクトル点a=(a,b,c)をベクトルp=(u1,u2,u3)だけ並進するアフィン変換は
b=a+p=(a+u1,b+u2,c+u3)=[a+u1,b+u2,c+u3,1]t
={{E3,p},{0,0,0,1}}[a1,a2,a3,t]
より、
4胞化して、
T={{E3,列p},{行O,1}}
<拡大(Scaling)>
拡大は並進のpをたす必要がない代わりに、
aの各成分を1倍以外の倍率に拡大縮小できるようにすればよいね。
だから、単位行列E3をS3=diag(sx,sy,xz)におきかえ、
列pを列Oに置き換えよう。
S={{S3,列O},{行O,1}}
<回転(Rotation)>
回転は拡大縮小する部分だけを回転に変更すればよい。
S3をR3におきかえよう。
R={{R3,列O},{行O,1}}
2.変換の合成順序
役者がそろいました。
バラバラだった変換をつないで使います。
問題はつなぐ順番です。
T,S,Rを仲間わけしてみましょう。
Tには中心はありません。
しかし、
S,Rは原点を動かしません。
Tは原点だった点も動かしてしまいます。
どういうことでしょうか。
画像編集アプリをイメージしてください。
点や線や面を画面において絵をかきます。
必要な部分だけかこって、
選ばれたオブジェクトだけ平行移動するなんてことをやったことがありませんか。
しかし、Tという変換は必要な点だけ選んで移動するという機能はありません。
レイアーという機能があるアプリもありますよね。
でも、Tという変換はレイアー機能はありません。
つまり、便利な機能を知っているからこそ、錯覚しがちですが、
Tという変換で、「選んでもいないのに空間全体が並進しまうので原点も移動してしまいます。」
T変換を先にやってから、S,Rをやるとどうなるでしょうか。
S,Rには並進自体は通知されてませんから、
相変わらずもとの原点から測った移動後の図形を拡大・回転をしてしまうです。
予想と違う結果になります。
だから、先にS,Rをやるべきです。最後がTです。
SR= {{S3,列O},{行O,1}}{{R3,列O},{行O,1}} = {{S3R3,列O},{行O,1}}
T(SR)={{E3,列p},{行O,1}} {{S3R3,列O},{行O,1}}
={{S3R3,列p},{行O,1}}
おやおや、TのE3をS3R3に置き換えただけの1つの変換行列ができました。
3つの変換を1つの行列で実行できるなんて、すっごく便利ですね。
3.振り返り
3つの変換が1つの行列で実行できることがわかったのでさっそく実行してみよう。
課題:geogebraで空間内の点A(3,4,5)をxy平面でθ回転し、S3倍に拡大し、p=(3,2,1)並進した点Bの位置を行列の積で求めよう。
アプレットの作成で「空間図形」を選びます。
設定の表示で、「グラフィックビュー」もオンにします。
タイトルは「アフィン変換の3要素を1つ行列で実現する」
A=(3,4,5)
t=slider(1, 10, 1) #非表示にします。
sx=slider(0.1, 2, 0.1)
sy=slider(0.1, 2, 0.1)
sz=slider(0.1, 2, 0.1)
θ=slider(0, 2pi, 2pi/24) ♯アニメーションをオンにします。
S3={{sx,0,0},{0,sy,0},{0,0,sz}}
R3={{cos(θ),-sin(θ),0},{sin(θ),cos(θ),0},{0,0,1}}
M=S3 R3
M11=Element(M,1,1)
M12=Element(M,1,2)
M13=Element(M,1,3)
M21=Element(M,2,1)
M22=Element(M,2,2)
M23=Element(M,2,3)
M31=Element(M,3,1)
M32=Element(M,3,2)
M33=Element(M,3,3)
p=(3,2,1) #位置ベクトルとして表示されるので非表示
a=(3,4,5) #点Aをさします。
ad={{3t},{4t},{5t},{t}) #ad=(3t,4t,5t,t)と入力すると4次元目が無視されます。
S={{M11,M12,M13,x(p)},{M21,M22,M23,y(p)},{M31,M32,M33,z(p)},{0,0,0,1}}
m1=S ad
b1=Element(m1,1,1)/Element(m1,4,1)
b2=Element(m1,2,1)/Element(m1,4,1)
b3=Element(m1,3,1)/Element(m1,4,1)
B=(b1,b2,b3) #点Bの属性で、残像を表示をONにします。
点Bが円周の24等分点を綺麗に回転する軌跡が表示されますね。
そこで、グラフィックビューのsx、sy, szを変更することで、ベクトルの1つの成分だけが伸縮するためめ、点Bの軌跡も変わることが実感できるね。