視円錐のベクトル方程式を求めてみる。
点 から点 を中心に視野角60度で眺めたときの視円錐のベクトル方程式を求めよ
→
まず視心のベクトル方程式を求める。
視心上の点は次の条件を満たすはずだ。
但しは正数。
次に、視心上で、から距離1である点を求めよう。
(なので、
)
よって、視心のベクトル方程式は次のように書き換えることもできる。
但しは正数。
数値を代入すると、
この式は、からの方向にだけ進んだ点の座標を示している。
視心上の各点が、視心と垂直な方向に、何らかの大きさを持つ円(自身を中心とする)を描いていると考えることで、視円錐は実現する。
この円上の点をベクトル方程式で表現してやればよいのだ。
円の半径は、と視野角(画角)によって決まる。
と垂直な向きに円があるので、どこでもよいから円の端をとすれば、
3点を頂点とする三角形は直角三角形であることが分かる。
この直角三角形の辺は、視円錐の母線であるから角は視野角の半分の角度を持つ。
よって、半径は、であることが分かる。
(例えば、今回の場合は、視野角が60度なので、
となる。)
点がこの円の内部にあるとするならば、
…①
のはずである(円のベクトル方程式)。
そして…②である。
今、を消してしまおう。
もしを活かしたまま回答を得ようものなら、答えるときにとは何なのかを言葉で説明しなくてはならないが、それはあくまでも最終手段。できることなら問題に与えられた点だけを使って答えたいのである。
図から明らかにである。
①は
②は
①へ②を代入すると
両辺は明らかに正。2乗すると、
となる。
但し、には正であるという条件が課されていたので、
とできる。
よって、具体的な数字を代入すると
では最後に、この方程式の正当性をmatlabで確認してみよう。
まずは次のようなファイル「view_cone.m」を書く。
function bool = view_cone(x, y, z) OP = [x, y, z]; OC = [1, 1, 1]; CT_ = [3, 4, 12]; CT = CT_./norm(CT_); CP = OP - OC; angle_of_view = pi/3; bool = (norm(CP) < (1/cos(angle_of_view/2))*dot(CP, CT));
このファイルを保存したら、次のコードを実行する。
hold on; %視円錐 for x=[0:0.25:10] for y =[0:0.25:10] for z=[0:0.25:10] if(view_cone(x,y,z)) scatter3(x,y,z); end end end end %視心 for k=[0:0.01:10] tmp = [1,1,1] + (k/13)*[3,4,12]; x = tmp(1); y = tmp(2); z = tmp(3); scatter3(x,y,z); end
結果、次の図のように得られた。右は、視心を正面にしたものである。