数式処理ソフト DERIVE(デライブ) de ドライブ

30.座標変換(その2)

座標変換の続き

「数式処理ソフト 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つの操作をすべて、行列のかけ算で表すことができたというわけじゃ」

x、yの2元2次方程式への応用

「これも、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がゼロでない場合に戻って、回転させるわけね」

D0がゼロでない場合の回転

「回転行列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の項が消去されたことになるのね」

「そうじゃの。この新しい係数行列をここに記載するのは、複雑すぎるので省略しよう」

xとyの2元2次方程式のまとめ

「まとめるとどうなるのかな」

「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次元のベクトルの意味などは、次回に回そうかの」

「お疲れ様でした」