- 締切済み
円又は楕円を透視図または平行投影した場合の、投影平面上の楕円の公式の方
円又は楕円を透視図または平行投影した場合の、投影平面上の楕円の公式の方程式またはそれを解説した書物を探しています。 コンピューターで3Dを作成する際、点の座標変換は分かりますが、平面上で元の円又は楕円がどのような式に変換されるのか分かりません。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- blueflower1024
- ベストアンサー率53% (16/30)
まず、前回の訂正からです。 > さらに、XY平面に平行投影(Z=0)したものをプロットしてみます。 > http://www.wolframalpha.com/ > にて > "[2 Cos[T]/2 - 1 Sin[T]/2, 2 Cos[T]/Sqrt[2] + 1 Sin[T]/Sqrt[2]]" > と入力してください。 > > 見た目はやっぱり楕円ですね。変換後はX=Yの位置に焦点があるようです。 > 元の楕円の > (2,0,0)は、(1, sqrt2, -1)に、 > (0,1,0)は、(-1/2, 1/sqrt2, 1/2)に、 > 変換されていますので、明らかに焦点が移動しています。 プロット結果を良く見ると、X軸とY軸のスケールが同じではないので、 「変換後はX=Yの位置に焦点があるようです」 は間違いでした。 返還前の焦点(2,0)、(0,1)を変換した位置、 (1, sqrt2)、(-1/2, 1/sqrt2) に、焦点があるように見えます。 というわけで、楕円を空間上で回転しても、XY平面状に投影してしまえば、焦点の位置は変わらないのでは。 そんな気がしました。 つまり、変換前の焦点の座標がわかっていれば、変換後の焦点の位置から、長径、短径は容易に求まるのはず。 これでよいのではないでしょうか。 また、楕円 (x - x1 )2/a2 + ( y - y1)2/b2 = 1 は、 x = a2 cosT + x1 y = b2 sinT + y1 と表せますので、前回の回答と同じ例 (Z軸周りに45°、次にY軸周りに45°回転) を使うとすると、 XY平面上の任意の点 P=(x,y) を変換した結果は、 P'=[x/2 - y/2, x/sqrt2 + y/sqrt2] だから、 変換後のx',y'は、 x' = (a2 cosT + x1) / 2 - (b2 sin + y1) / 2 y' = (a2 cosT + x1) / sqrt2 + (b2 sin + y1) / sqrt2 と表せます。 元のx,yで表したい場合は、上記P'の式が求める式になるでしょうか。 以上、また計算間違いがあったら恥ずかしいな。 よろしくお願いします。
- blueflower1024
- ベストアンサー率53% (16/30)
なかなか、はっきりした回答にならなくて、すみません。 一緒になって考えている感じですね。 さて、平行投影に絞って、考えます。 XY平面状に、中心(0,0)、遠い焦点(2,0)、近い焦点(0,1)で楕円を描きます。 これを、Z軸周りに45°、次にY軸周りに45°回転させます。 最後に、回転した楕円をXY平面に平行投影します。 これで斜めから見た楕円が得られるはずです。 回転行列 Az= [cos, sin, 0] [-sin, cos, 0] [0, 0, 1] 回転行列 Ay= [cos, 0, -sin] [0, 1, 0] [sin, 0, cos] AzAy= [(cos cos), (sin), (-cos sin)] [(-sin cos), (cos), (sin sin)] [(sin), 0, (cos)] = [1/2, 1/sqrt2, -1/2] [-1/2, 1/sqrt2, 1/2] [1/sqrt2, 0, 1/sqrt2] 楕円の定義 P=[r1 cosT, r2 sinT, 0] (r1=2, r2=1) 行列をかけて、変換を適用すると、 P・AzAy= [2 cosT / 2 - 1 sinT / 2, 2 cosT / sqrt2 + 1 sinT / sqrt2, -2 cosT / 2 + 1 sinT / 2] これが変換後の楕円を表す式となります。 さらに、XY平面に平行投影(Z=0)したものをプロットしてみます。 http://www.wolframalpha.com/ にて "[2 Cos[T]/2 - 1 Sin[T]/2, 2 Cos[T]/Sqrt[2] + 1 Sin[T]/Sqrt[2]]" と入力してください。 見た目はやっぱり楕円ですね。変換後はX=Yの位置に焦点があるようです。 元の楕円の (2,0,0)は、(1, sqrt2, -1)に、 (0,1,0)は、(-1/2, 1/sqrt2, 1/2)に、 変換されていますので、明らかに焦点が移動しています。 行列をテキストだけで表現すると、表情にわかりづらいですが、これでよろしかったでしょうか。
補足
おつきあい戴いてありがとうございます。 極座標と行列は、忘れてしまいました(^^;; (後で勉強します。) さて、この得られた変換後の楕円を表す式をXY座標で表現するとどうなるのでしょうか。 (x - x1 )2/a2 + ( y - y1)2/b2 = 1の形にしたときの中心座標(x1,y1)と長径と短径のa,bはどのように表されるのでしょうか。 言い忘れましたが、楕円の射影を描くプログラムを作っています。 具体的には、惑星の軌道を任意の視点から描くプログラムです。 通常のプログラム言語と同じように、私が使っているプログラム言語で楕円を描画するには、中心座標と長径と短径が必要なのです。
- blueflower1024
- ベストアンサー率53% (16/30)
ご質問の意図を了解しました。 なるほど、難しいですね。 透視投影した場合、元の空間の平行が、変換後に維持されませんので、円を表すときに直交座標系が使えないということになります。 3次元空間を極座標系で表すと、 P=(x, y, z) x=r sinθ cosφ y=r sinθ sinφ z=r cosθ なので、 N=(a, b, z) :円が存在する面の法線ベクトル N・P = 0 r=一定 を制約条件にして、円が定義できます。 上記のx,y,zを透視変換にかければ、a, b, c, r, θ, φであらわされた変換後の円が得られます。 これでどうでしょうか。 厳密な証明でなくて、ごめんなさい。
補足
おつきあいありがとうございます。 もう少し具体的にします。 XYZ空間のXY平面上に、中心が(0,0,0)で、半径rの円を描きます。 これを、斜め上(極座標的に言うとたとえば緯度45°、経度45°等で、画面のX軸はもとのXY平面に平行)から平行透視した射影(平面図形)の方程式を求めるとします。 円の場合、変換後の楕円の方程式を導くのは容易です。 視線と水平に直交する方向が、得られる楕円の長軸で、元の円の直径に等しい。 短軸は円の直径×Sin45°になります。 従って求める円の射影の方程式は、経度に寄らず「xの2乗/rの2乗+yの2乗/(r×Sin45°)の2乗=1 この元の図形が楕円だった場合、射影の平面図形(楕円)の方程式はどうなるのでしょうか。 XYZ空間のXY平面に楕円を描いて、長軸と短軸を線分として描きます。 これを、z軸と平行でない角度から射影して得られる楕円の長軸と短軸は、もとの楕円の長軸と短軸と一致しません。 言葉でお伝えするのは難しいですね。 分かって戴けたでしょうか。
- blueflower1024
- ベストアンサー率53% (16/30)
円または楕円は、 ・中心の位置ベクトル ・中心から近い焦点へのベクトル ・中心から遠い焦点へのベクトル の3つで定義できます。 それぞれ、透視変換を行うことが可能なので、変換後のベクトルから、変換後の円、楕円が作れるのでは。
お礼
平行透視の場合だけこつこつと解いてみました。 空間にあるx^2/a^2 + y^2/b^2 = 1, z = 0で表される楕円を、Y軸の正の方向から見て時計回りにθy、Z軸の正の方向からみて反時計回りにθzの方向から平行透視した図形が楕円になると仮定して、その楕円の式を導く。 座標変換後のX軸を視線とすると、( x, y, z )は、( X, Y, Z )を上記の逆変換した座標と一致するので、 x = ( X*Cos[θy] - Z*Sin[θy] )*Cos[θz] - Y*Sin[θz] y = ( X*Cos[θy] - Z*Sin[θy] )*Sin[θz] + Y*Cos[θz] z = X*SIn[θy] + Z*Cos[θy] これを、x^2/a^2 + y^2/b^2 = 1, z = 0に代入し、YをXに、ZをYに置き換えて(X軸からみたYZ平面上の平行透視を、改めてXY平面として)整理すると、 X^2*( Sin[θz]^2/a^2 + Cos[θz]^2/b^2 ) + 2*X*Y*Cos[θz]*Sin[θz]*( 1/a^2 -1/b^2 )*1/Sin[θy] + y^2*( Cos[θz]^2/a^2 + Sin[θz]^2/b^2 )*1/Sin[θy^2 = 1 この式のX^2、2*X*Y、Y^2の係数をそれぞれA、B、Cとする。 一方、変換後の楕円を、長軸とX軸との角度がX軸から反時計回りにθ、長半径をα、短半径をβの楕円と仮定すると、この楕円上の任意の点を( x0, y0 )とし、座標系を反時計回りにθ回転させてできた座標( x0, y0 )は、 x0 = x*Cos[θ] + y*Sin[θ] y0 = -x*Sin[θ] + y*Cos[θ] また、 x0^2/α^2 + y0^2 / β^2 = 1 となるので、上記を代入して整理すると。 x^2*( Cos[θ]^2/α^2 + Sin[θ]^2/β^2) + 2*x*y*Cos[θ]*Sin[θ]*( 1/α^2 - 1/β^2 ) + y^2*( Sin[θ]^2/α^2 + Cos[θ]^2/β^2) = 1 この式のx^2、2*x*y、y^2の係数は、それぞれA、B、Cに等しい(最初の仮定)ので、 Cos[θ]^2/α^2 + Sin[θ]^2/β^2 = A Cos[θ]*Sin[θ]*( 1/α^2 - 1/β^2 ) = B Sin[θ]^2/α^2 + Cos[θ]^2/β^2 = C 変換された楕円の長軸上の点を( x1,y1 )とすると、 x1^2 + y1^2 = α^2, Cos[θ] = x1/α Sin[θ] = y1/α これによって、先の3式のα、β、θを消去すると、 x1 = ( A*x1 + B*y1 )*( x1^2 + y1^2 ) x1^2 - y1^2 = ( A*x1^2 - C*y1^2)*( x1^2 + y1^2 ) この連立4次方程式を数式ソフト(Mathematicaを使用)で解くと、定数項が無いので解は7つ得られ、そのうちの( 0, 0 )、( - 1/Sqrt[A], 0 )、( 1/Sqrt[A], 0 )、は明らかに不適。残る4つの解が長軸と短軸上の4点となる。 実際にこれで楕円を描くソフトを作ってみましたが、線分で近似した楕円を変換したものとぴったり一致しました。 尚、Mathematicaで得られた解の公式は、数百行になりました。Mathematicaってすごい。 平行透視でさえこんなにややこしいのですから、透視変換したら大変なことになりそうです。 結果的に言うと、透視変換するのにこんなことをするヤツはいない、と分かりました。
補足
回答有り難うございます。 ご指摘の内容は、もちろん最初に考えましたが、 円を斜め上から見ると楕円になるように、焦点のベクトルを座標変換しただけでは変換された形状を得られないのは明らかです。 ある楕円を、斜め上から見ると、見える形状の焦点は元の楕円の焦点を変換した位置にはなりません。 長軸、短軸も元の図形のそれとは違う位置になります。
補足
補足ありがとうございます。 「XYZ空間のXY平面に楕円を描いて、長軸と短軸を線分として描きます。 これを、z軸と平行でない角度から射影して得られる楕円の長軸と短軸は、もとの楕円の長軸と短軸と一致しません。」 これを理解戴いてないのでサンプルを作成しました。 下記をご覧下さい。 http://gallery.me.com/kuromarusangyou 1で、まずXY平面上に長半径1、短半径0.7(離心率≒0.714)の楕円を書きます。 1は、上記をプリントしたものを真上から写真で撮ったものです。 2は上記の楕円をCADで3D化して斜め上から見たものを2D化した(座標の回転の結果を平行透視した)ものを、 目分量で長軸を水平にし、接線を描いたものです。 赤と紫が元のXY平面上の図形。 黒は、目分量で回転したものに接線を書き加えました。 ご覧のように、投影されたXY平面上の楕円は、 長軸も、短軸も、焦点も、元の図形を変換したXY座標と全く違います。 3は参考までに、1を斜めから写真で撮って、CADにとりこみ、 目分量で長軸を水平にしたものを再びCADに取り込んで、 接線を書き加えました。 写真で撮ったので透視変換になるので、想像通り中心さえ移動しています。 しかしやはり楕円なのは理論通りですね。 元の楕円の方程式はx2+y2/0.49 = 1です。 この図形を、x軸の正の方向から見て時計回りに45°、Z軸の正の方向から見て時計回りに45°回転した図形の、 XY平面への投影、即ちZを無視した場合の楕円のXY平面上での式はどうなるのでしょうか。 (参考図は、わざわざ楕円の長軸を水平になるように傾けているので、 座標上はX軸に水平な楕円の公式の「x2/a2 + y2/b2 = 1」のxとyが、それぞれxとyの関数に置き換わるはずですが。)