「数式処理ソフト DERIVE(デライブ)の第28回で座標変換について、「並進・回転」と「アフィン変換」などを紹介したが、ここで、もう一度、その特徴をおさらいしておこう。図形に対して並進と回転を行っても変わらないものは、なんじゃな?」
「図形の形とか面積でしょ」
「そうじゃな。数学的には、並進と回転を行ってピタリと重なる図形を「合同」といっておるが、まさにそういうことじゃな」
「一方のアフィン変換では、確か、形も面積も変わってしまうのだったわね」
「アフィン変換で等価な図形同士を「アフィン合同」というのだそうじゃが、楕円も真円もアフィン合同となるの」
「どんな図形同士もアフィン合同になるのかしら?」
「いや、双曲線と楕円などは、アフィン合同にはならない」
「でも、CGでは、アフィン変換してしまうと形がゆがんでしまうわね」
「まさに、その通りじゃが、並進と回転だけでは、少し、応用範囲が狭いのじゃ」
「遠くのものは、小さく、近くのものは、大きく見せたいからね」
「そこで、数学的には、アフィン変換なのじゃが、CGでは、並進、回転、伸縮と続けて与えていきたいのじゃ。
並進は加算で、回転や伸縮は、乗算という操作の違いは、煩雑じゃ。そこを工夫したのが「同次座標」というものじゃ」
「定義は、どうなるのかしら?」
「そうじゃな。天下り式に定義を書いても良いのじゃが、ここは、発見法的に工夫していこうと思うのじゃ」
「で、どうするの?」
「元の点の位置ベクトルを[x,y]で表したとき、並進後の位置は、[u,v]=[x+p,y+q]としたいのじゃな」
「そうすれば、いいじゃないの!」
「あはは。しかし、回転では、回転行列を掛けなければならないので、ここは、足し算ではなくて、かけ算で、統一できないかということじゃ」
「それはできないでしょ」
「うん。このまま2次元の位置ベクトルをにらんでいても、どうもうまい工夫がない。
以前、3次方程式の解法でも余分の変数を導入してうまくいったように、難しい問題では、余分な変数や次元を加えると不思議にうまくいくことがある。そこで、3次元のベクトルを考える」
「え? でも、平面は、2次元だよね」
「そこなのじゃが、3つめの座標の役割は、おいおい、考えていこうということで、位置座標を[x,y,1]で表してみよう」
「そうすると、変換後の位置も[u,v,1]とするわけね」
「そうじゃ。そうすると、並進は、どうすればよい?」
「[1, 0, 0],[ 0, 1, 0],[ p, q, 1]]とすれば、行列のかけ算でできるわね・・・」
「回転は、[COS(s), SIN(s), 0; - SIN(s), COS(s), 0; 0, 0, 1]となる。ここで、回転角sを反時計回りに正とした。また、行列の書き方を簡略にしておる」
「3番目の座標は、使われていないわね」
「ダミーのような役割じゃな。伸縮ではどうかな」
「x方向は、α倍、y方向は、β倍とすると、[α, 0, 0; 0, β, 0; 0, 0, 1]とすれば、いいのじゃない」
「そうじゃ。これで、並進、回転、伸縮という3つの操作をすべて、行列のかけ算で表すことができたというわけじゃ」
「これも、28項で紹介したものじゃったが、「実数係数のax^2+2hxy+by^2+2gx+2fy+c=0は、係数の違いによって、円錐曲線か直線などを表す」ということじゃったが、統一的に変換していくためには、どうするか、という点を上で紹介した方法で扱ってみようというわけじゃ。
まず、この式をベクトルと行列でどう表したらよいかな」
「[x, y, 1][a, h, g; h, b, f; g, f, c][x, y, 1]`=0となるわね。最後の'は、転置を表す記号」
「その通り。
3次元ベクトルをX、係数行列をKとすると、さっきの式は、X*K*X’=0と書けるが、ここで、U=X*Hとして、Hは、変換行列であるとする。
これから、X=U*H-1となるので、X*K*X'=U*H-1*K*(U*H-1)'=U*(H-1*K*H-1’)*U’
ここで、Uは、[u,v,1]であって変換後の3次元ベクトルを表し、(H-1*K*H-1’)は、変換後の係数行列となる」
「まずは、xとyの1次の項を消去することを考えると、並進行列V=[1, 0, 0; 0, 1, 0; p, q, 1]として、変換後の係数行列を計算すると次のようになるわ。
V-1*K*V-1’=[a, h, - ap + g - hq; h, b, - bq + f - hp; - ap + g - hq, - bq + f -
hp, ap^2 + bq^2 + c - 2fq - 2p(g - hq)]」
「これから、3行1列と3行2列の係数をゼロとするために、
- ap + g - hq = 0, - bq + f - hp = 0の連立方程式を解くと、p = (bg - fh)/(ab - h^2)
、q = (af - gh)/(ab - h^2)となる」
「その変換結果は、au^2 + 2huv + bv^2 + (a(bc - f^2) - bg^2 - h(ch - 2fg))/(ab -
h^2)=0となって、確かに1次の項は、消去されているの」
「p、qの分母がゼロとなるときは、どうなるのかしら」
「うん。それがまさに28項で出てきた、D0=DET([[a,h],[h,b]])=ab-h^2 じゃな。
このときは、並進のp,qが求まらないが、その代わりに、ab=h^2、af=hg、bg=fhという条件が出てくる。(このうちの2つが独立)
係数行列に上記の条件を代入して与式を求めてみると、次のようになる。
2xy√(ABS(ab)) + 2fx√(ABS(a/b)) + ax^2 + by^2 + 2fy + c=0」
「xとyの1次項が残っているね」
「そうだの。ここで、場合を分けて考える必要があるのじゃな。ab=h^2なので、aとbは同符号である必要がある。
まずは、両方が正である場合を取り上げてみよう。a=α(>0)、b=β(>正)と置いてみると、
与式は、(√αx + √βy)^2 + 2f(√αx + √βy)/√β + c = 0となるので、aとbを元に戻すと、
√ax + √by = (√(f^2 - cb) - f)/√b または - (√(f^2 - cb) + f)/√bとなる」
「ということは、aとbの両方が正であると直線になるって事なのね」
「そうじゃな。一般的には、平行な2直線を表すが、特別な場合、たとえば、f=±√c√bのような時は、両直線が一本になるの」
「aとbが両方とも負の時は、じゃ、放物線になるの?」
「そうなのじゃな。上と同様にa=-α、b=-βとしてみると、
与式は、(√αx - √βy)^2 - 2f(√αx + √βy)/√β - c = 0となる」
「さっきと微妙に違うわね」
「√αx + √βy=w、√αx - √βy=zと置くと、z^2 - c - 2fw/√β = 0となるので、結局、
z^2 - c - 2fw/√-b = 0という放物線を表すことになる」
「さて、次は、D0=ab-h^2がゼロでない場合に戻って、回転させるわけね」
「回転行列M=[COS(s), SIN(s), 0; - SIN(s), COS(s), 0; 0, 0, 1]であるので、並進に引き続き、回転させることを考える。
M-1=[COS(s), - SIN(s), 0; SIN(s), COS(s), 0; 0, 0, 1]、その転置は、[COS(s), - SIN(s),
0; SIN(s), COS(s), 0; 0, 0, 1]、
また、並進後の係数行列は、
[a, h, 0; h, b, 0; 0, 0, - (b^2g^2 - 2bfgh + f^2h^2)/(b(ab - h^2)) - f^2/b
+ c]であるので、この新しい係数行列Kに対して、
M-1*K*(M-1)'を計算して、その結果の1行2列と2行1列(これは等しい)がゼロになる条件を求めると、
2hCOS(s)^2 + (a - b)SIN(s)COS(s) - h = 0となるが、倍角の公式を適用すると、結局、TAN(2s) = 2h/(b
- a)がその条件になることが分る」
「DERIVEだと倍角の公式などがうまく適用されないことがあるわね」
「そうじゃのう。三角関数については、必ずしも思うようにならないことがあるのう」
「この角度は、多価関数になるのだけど、どう、決めればいいのかな」
「元々のsは、0~πで考えていたのだけれど、要は、新しいu、v軸に図形の主軸が一致するように回転できればいいのであるから、
s=-π/4~π/4としてよい」
「これで、x、yの1次項とxyの項が消去されたことになるのね」
「そうじゃの。この新しい係数行列をここに記載するのは、複雑すぎるので省略しよう」
「まとめるとどうなるのかな」
「ab=h^2でないときは、並進行列=V=[1, 0, 0; 0, 1, 0; p, q, 1]、ここで、[p = (bg - fh)/(ab
- h^2) ∧ q = (af - gh)/(ab - h^2)]として、
係数行列Kに対して、V-1*K*(V-1)’を計算すると1次項が消去される。
これを新係数行列とすれば、同様に回転行列を使ってxyの項を消去できる。角度は、TAN(2s) = 2h/(b - a)で決まる。sは、s=-π/4~π/4とすれば、よい、ということかしら」
「そうじゃな。新座標をu、vとすれば、変換後の座標は、[u,v,1](このようにして得られた係数行列)[u,v,1]’として求められるのじゃ。
たいていは、楕円か双曲線になる」
「ab=h^2のときでは、両方が正符号の時は、√ax+√byを新変数にすると直線を表すことが分る。
また、両方が負の時は、放物線ね。28項のところには、まだ、調べていない例外的なケースもあるのね」
「そうじゃの。それらについては、残念じゃが、省略しよう。これまで、使ってきた、3次元のベクトルの意味などは、次回に回そうかの」
「お疲れ様でした」