『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

点P(Px,Py,Pz)から方向ベクトル(x,y,z)にのびた直線が、原点O(0,0,0)、半径rの球の表面と交わる点Qの座標を求めたいのですが、どなたか教えていただけないでしょうか。

O-P-Qの三角形を作ると、辺OPの長さ、辺OQの長さ(=r)と∠OPQの角度は求まるので、余弦定理から辺PQの長さが求まります。
辺PQの長さに方向ベクトル(x,y,z)を掛ければ、ベクトルPQが求まるので、ベクトルOP+ベクトルPQ=ベクトルOQが求まると思うのですが、間違っているでしょうか。

A 回答 (2件)

なにやら難しいことをお考えのようですが、以下のようにやれば簡単です。



直線は、(X,Y,Z)=(Px,Py,Pz)+t(x,y,z)と表されるので、直線上の点(X,Y,Z)は、
 X=Px+tx
 Y=Py+ty
 Z=Pz+tz
である。(※)

これを球の方程式X^2+Y^2+Z^2=r^2に代入し、tの2次方程式を解いてtの値(2つ。ただし、接するなら1つ)を求め、※に代入すれば、Qの座標がわかる。
    • good
    • 4
この回答へのお礼

ありがとうございました。
勉強させていただきました。

お礼日時:2005/05/24 21:38

それで合っています。



ただ、PQの長さをtとおいて、座標で直接に2次方程式を作ったほうが計算が楽なようです。
(これでできる2次方程式は、ご質問にある余弦定理と全く同じ式になります。)
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございました。
自信が持てました。

お礼日時:2005/05/24 21:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q3次元座標2点からの直線式の求め方

お世話になります。

3次元座標2点からの直線式(ax+by+cz=0)の求め方を教えて下さい。

2次元座標であれば、1つの傾きから算出できるのですが、3次元座標になると、X-Y平面、Y-Z平面での傾きの使い方がこんがらかってしまいます。
基本的な質問で申し訳ありませんが、よろしくお願い致します。

座標1 = (x1,y1,z1)
座標2 = (x2,y2,z2)

以上

Aベストアンサー

> 直線式(ax+by+cz=0)の求め方を教えて下さい。
3次元座標では(ax+by+cz=0)は原点を通る平面になり、直線の式ではありません。ax+by+cz=dは平面の一般式です。

2点を通る直線の式には公式があります。
以下のように簡単に導けます。
点(x1,y1,z1)を通り方向ベクトル(x2-x1,y2-y1,z2-z1)の直線ですから
媒介変数形式で
(x,y,z)=(x1,y1,z1)+t(x2-x1,y2-y1,z2-z1)
と成ります。
これを変形してすれば
(x-x1)/(x2-x1)=(y-y1)/(y2-y1)=(z-z1)/(z2-z1)
と3次元座標の直線の式となります。

Q球と平面の交わりである円の中心と半径

球x^2+y^2+z^2=25と平面3x-4y+5z-30=0の交わりである円の中心と半径を求めよ。
という問題です。

円の中心の座標を(a,b.c)とすると、平面上にあるので3a-4b-5c=30
という条件式は求まったのですが、その他の条件式がさっぱりです。
平面をxについての式に変形して球に代入をしてみたりはしたのですが手詰まりしてしまいました。
ご回答よろしくお願いします。

Aベストアンサー

>円の中心の座標を(a,b.c)とすると、平面上にあるので3a-4b-5c=30…(1)

「円の中心(a,b,c)と半径r」と「球の中心(0,0,0)と半径R=5」の間に3平方の定理が成り立つことから
 (a^2+b^2+c^2)+r^2=25…(2)

球の中心と円の中心の距離は球の中心から平面に降ろした垂線の長さに等しいことから
a^2+b^2+c^2=30^2/(9+16+25)=18…(2) なので
r^2=25-18=7
∴r=√7 …(3)
(a,b,c)を通る平面の法線は原点を通ることから
 x/3=y/(-4)=z/5(=tと置く)…(4)
この法線上に点(a,b,c)があることから
 a/3=-b/4=c/5=t…(5)
a=3t,b=-4t,c=t …(6)
(6)を(2)に代入
(9+16+25)t^2=18
∴t=3/5
(6)から
 ∴a=9/5,b=-12/5,c=3

Q平面の交線の方程式

2平面の交線の方程式はどうやって求めるのですか?

例で適当に問題を作ってみたんで教えてください
x-y+3z-1=0,x+2y-z-3=0

どなたか教えていただけませんか?

Aベストアンサー

akatukinoshoujoさん、こんにちは。

>x-y+3z-1=0・・・・(1)
>x+2y-z-3=0・・・・(2)とおきましょう。
(1)(2)より、連立方程式を解いて、x、y、zをそれぞれどれか一つの文字で表していきます。

(1)×2 2x-2y+6z-2=0
(2)   x+2y-z-3=0
------------------------------これを足してみると
      3x+5z-5=0
      x=-5(z-1)/3・・・・(☆)

(1)   x-y+3z-1=0
(2)×3 3x+6y-3z-9=0
------------------------------これらを足し合わせると
      4x+5y-10=0
      4x=-5(y-2)
      x=-5(y-2)/4・・・・(★)

(☆)(★)より、yとzをxであらわせたので、つなげてみましょう。

x=-5(y-2)/4=-5(z-1)
もうちょっと整理すると、
x/5 =(y-2)/-4 =(z-1)/-3
となって、これは(0,2,1)を通り、方向ベクトルが(5,-4,-3)の
直線になることを示しています。


方程式が2つあるので、どれか一つの文字で表して、つなげてみるといいですね。
頑張ってください!!

akatukinoshoujoさん、こんにちは。

>x-y+3z-1=0・・・・(1)
>x+2y-z-3=0・・・・(2)とおきましょう。
(1)(2)より、連立方程式を解いて、x、y、zをそれぞれどれか一つの文字で表していきます。

(1)×2 2x-2y+6z-2=0
(2)   x+2y-z-3=0
------------------------------これを足してみると
      3x+5z-5=0
      x=-5(z-1)/3・・・・(☆)

(1)   x-y+3z-1=0
(2)×3 3x+6y-3z-9=0
------------------------------これらを足し合わせると
   ...続きを読む

Q楕円と直線の交点を求めるには

<楕円>
原点座標:(DX,DY)
X軸の半径:a
Y軸の半径:b
 角度:なし
<直線>
始点座標:(SX,SY)
終点座標:(EX,EY)

 この2つの図形が交わるかどうか、また交わる場合にはその交点の座標を知りたいのです。
 「楕円の方程式」「直線の方程式」「解の公式」を使用して手で計算することはできるのですが、
計算式として表すことができません。(中学レベル程度の知識なので・・・)
EXCELで数式を設定したいので、上の変数名を使用した具体的な計算式を教えていただければありがたいです。
よろしくお願いいたします。

Aベストアンサー

手で計算できるなら、Excelで計算することは十分可能と思われますが・・・
ポイントは、解の式を、いきなり与えられた文字で表そうとするのではなく、
・線分の式の係数
・線分の式を楕円の式に代入してできる2次方程式の係数
をそれぞれ算出するようにすれば、無理はないのではないでしょうか?

具体的には、
線分の式をy=mx+nとすれば、m=(EY-SY)/(EX-SX), n=SY-m*SX
楕円に代入すると、(x-DX)^2/a^2+(mx+n-DY)^2/b^2=1
これを整理して、px^2-2qx+r=0とすれば、
p=(1/a^2)+(m^2/b^2)
q=(DX/a^2)+((DY-n)/b^2)
r=(DX^2/a^2)+((DY-n)^2/b^2)-1
解は、x=(q±√(q^2-pr))/p

このm,n,p,q,r,(2つの)xをEXCELで書くのはなんとでもなりませんか?
あとは、SX<=x<=EXに含まれるかを判定すればよいでしょう。
もちろん、q^2-pr<0の場合は、即「交点なし」です。

手で計算するのと、ほんと同じでしょう?

手で計算できるなら、Excelで計算することは十分可能と思われますが・・・
ポイントは、解の式を、いきなり与えられた文字で表そうとするのではなく、
・線分の式の係数
・線分の式を楕円の式に代入してできる2次方程式の係数
をそれぞれ算出するようにすれば、無理はないのではないでしょうか?

具体的には、
線分の式をy=mx+nとすれば、m=(EY-SY)/(EX-SX), n=SY-m*SX
楕円に代入すると、(x-DX)^2/a^2+(mx+n-DY)^2/b^2=1
これを整理して、px^2-2qx+r=0とすれば、
p=(1/a^2)+(m^2/b^2)
q=(DX/a^2)+((...続きを読む

Q円柱と直線の交点

円柱の表面と直線との交点を求める一般解を調べているのですが、わかりません。

よろしくお願いします。

Aベストアンサー

前回のアドバイスで、後は機械的に出ると思いますが...。

直線の媒介変数方程式を円柱の方程式に代入します。
(前回は書き落としましたが、λ・μの少なくとも一方はゼロでないことを仮定します。)
(λt+x0)^2+(μt+y0)^2=r^2
(λ^2+μ^2)t^2+2(λx0+μy0)t+(x0^2+y0^2-r^2)=0
ここで、D=(λx0+μy0)^2-(λ^2+μ^2)(x0^2+y0^2-r^2)とすると、

D<0の時、解はなし。

D=0の時、t=-(λx0+μy0)/(λ^2+μ^2)より
 x=-λ(λx0+μy0)/(λ^2+μ^2)+x0
 y=-μ(λx0+μy0)/(λ^2+μ^2)+y0
 z=-ν(λx0+μy0)/(λ^2+μ^2)+z0

D>0の時、t=(-(λx0+μy0)±√D)/(λ^2+μ^2)
 x=λ(-(λx0+μy0)±√D)/(λ^2+μ^2)+x0
 y=λ(-(λx0+μy0)±√D)/(λ^2+μ^2)+y0
 z=λ(-(λx0+μy0)±√D)/(λ^2+μ^2)+z0

不注意な計算ミスが無ければこれで良いはずですが、ご自身で確認してみて下さい。

前回のアドバイスで、後は機械的に出ると思いますが...。

直線の媒介変数方程式を円柱の方程式に代入します。
(前回は書き落としましたが、λ・μの少なくとも一方はゼロでないことを仮定します。)
(λt+x0)^2+(μt+y0)^2=r^2
(λ^2+μ^2)t^2+2(λx0+μy0)t+(x0^2+y0^2-r^2)=0
ここで、D=(λx0+μy0)^2-(λ^2+μ^2)(x0^2+y0^2-r^2)とすると、

D<0の時、解はなし。

D=0の時、t=-(λx0+μy0)/(λ^2+μ^2)より
 x=-λ(λx0+μy0)/(λ^2+μ^2)+x0
 y=-μ(λx0+μy0)/(λ^2+μ^2)+y0
 z=-ν(λx0+μy0)/(λ^2+μ^2)+z0

D>0...続きを読む

Q球上の任意の点の求め方

中心(0,0,0)、半径rの球があるとき、
球上(球の表面)の任意の点(座標(x,y,z))を求める方法を
教えていただけたらと思います。

どうぞよろしくお願いいたします。

Aベストアンサー

#4です。補足に回答します。
例えば半径1の球上のとある点P(x,y.z)=(1,0,0)を曲座標表示するとどうなるか?という御質問かと理解しました。

線分OPをx-y平面上に正射影したもの(ここでは線分OPそのままですが)とx軸とななす角はθ=0(rad)(いわゆる0度)
線分OPとz軸とのなす角φ=π/2(rad)(いわゆる90度)

従って曲座標表示ではP(r、θ、φ)=(1、0、π/2)

確認のために式に当てはめて元のxyz座標を求めてみると
x=1*sin(π/2)*cos(0)=1*1*1=1
y=1*sin(π/2)*sin(0)=1*1*0=0
z=1*cos(π/2)=1*0=0
元の直角座標系の点P(x,y.z)=(1,0,0)と一致するので正しいことが確認された。

Q二つの球面が交わってできる円の方程式

XYZ座標において、二つの球面が交わって出来る交線の円の方程式の解き方を教えてください。
ただし半径は同じ長さRとします。
それぞれの二つの球の方程式を

(X-a)^2+(Y-b)^2+(Z-c)^2=R<2

(X-d)^2+(Y-e)^2+(Z-f)^2=R<2 とすると?

そこからどのようにして解いたら良いか分かりません。
代入するんでしたっけ、それともイコールでつなぐんでしたっけ?

高校数学を学んでから十数年経った今、数学が必要になり勉強し直しています。
どなたか、教えてください。

Aベストアンサー

かなり懐かしい問題ですね^^。
自信があるようなないような・・・・。
円の中心と、半径を求めるのは簡単ですが・・・^^
とりあえず参考までに・・・

空間における円の方程式は、球と平面の交線で表せますから、
二球の共通平面を求めることが必要ですね。

この場合、単純に二式を引くと、二次の項がすべて消えるので
二つの球の共通平面の式が得られます。
よって、求めたい二球の交線からなる円の式は、

・平面の式
・どちらか一方の球の式

の二式を同時に満たす関数ということになります。
空間上の円は一つの式で表せません。



一般に以下の式で表せる二つの図形、

f(x、y、z)=0
g(x、y、z)=0

の交点を通る図形は、m、kを任意の定数として、

mf(x、y、z)+kg(x、y、z)=0

あるいは、(普通mもkも、0でないのでs=k/mとして)

f(x、y、z)+sg(x、y、z)=0

を満たします。このlとkの選び方で、どういう図形かがきまりますね。
この、f(x、y、z)とg(x、y、z)にそれぞれ球の式を代入すると、
二球の交線を通る図形の一般式 が得られます。

かなり懐かしい問題ですね^^。
自信があるようなないような・・・・。
円の中心と、半径を求めるのは簡単ですが・・・^^
とりあえず参考までに・・・

空間における円の方程式は、球と平面の交線で表せますから、
二球の共通平面を求めることが必要ですね。

この場合、単純に二式を引くと、二次の項がすべて消えるので
二つの球の共通平面の式が得られます。
よって、求めたい二球の交線からなる円の式は、

・平面の式
・どちらか一方の球の式

の二式を同時に満たす関数ということになりま...続きを読む

Q空間上の円の方程式について

空間上にある、3点P1(x1,y1,z1),P2(x2,y2,z2)
P3(x3,y3,z3)を通る円の方程式を求めよ。

平面の方程式は、法線ベクトルにより
求められる所までは分かっています。
空間における円の方程式は、球と平面の
交線で表せるというのは、わかったのですが、
この後、どーすれば良いのかが分かりません。

どなたか、よろしくお願いします。

Aベストアンサー

3点を通る円の方程式でしょ?球じゃなくて。
適当な座標変換
(X,Y,Z)' = A (x,y,z)'
('は転置、Aは実数値の3×3行列で、AA' = I (単位行列))を使って、与えられた3点が
(X1,Y1,0), (X2,Y2,0), (X3,Y3,0)
に変換されるようにすれば、(このようなAは何通りもあります。)
Z=0の平面上の3点を通る円を決める問題になります。

 円の方程式
(X-B)^2 + (Y-C)^2 = R^2
は、3次元で見るとZが出てこない訳ですから、(球ではなく)軸がZ軸と平行な円柱を表しています。この方程式(つまりB,C,Rの値)が得られたら、これと、方程式
(X,Y,0)' = A (x,y,z)'
(Z=0の平面を表します。)とを連立させれば、X,Yが直ちに消去でき、x,y,zを含む2本の方程式が得られます。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q3次元ベクトルをある軸ベクトルで回転させたい

3次元ベクトルの求め方を教えてください。

下記図のように始点を軸ベクトルでθ(度)だけ回転したときの?の位置を求めたいのです。
これはどのような計算方法になるのでしょうか?なかなか思いつかなくて非常に悩んでいます。
アドバイスや回答をいただけたら助かります。よろしくお願いします。

Aベストアンサー

先ず、中心点(Sx,Sy,Sz)が原点にくるよう全体を平行移動させます。
(一番最後に元に戻します)
始点(Px,Py,Pz)は、(Px-Sx,Py-Sy,Pz-Sz)に移ります。この座標を(Px',Py',Pz')とします。

次に、回転軸ベクトル(Ax Ay Az)を回転させ、x軸に合致させます。それには二回の
回転変換が必要です。
最初に、ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルが
z軸に合うよう、x軸を回転させます(その角度をφとします)。
すると、回転軸ベクトルはx-y平面上に乗るので、それがx軸に合うよう、z軸を回転させます
(その角度をψとします)。

ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルは、(0 Az -Ay)。
x軸周りにφ回転させると、このベクトルは、
「1  0    0   「 0  =「      0
0 cosφ -sinφ   Az   Az・cosφ+Ay・sinφ
0 sinφ  cosφ」 -Ay」  Az・sinφ-Ay・cosφ」
で、z軸ベクトルに合うので
「      0      =「0
Az・cosφ+Ay・sinφ  0 
Az・sinφ-Ay・cosφ」  1」
これから、cosφ=-Ay/(Ay^2+Az^2)、sinφ=Az/(Ay^2+Az^2)
∴ φ=Arctan(-Az/Ay)

回転軸ベクトル(Ax Ay Az)は、
「1  0    0   「Ax =「      Ax      =「       Ax                   =「Ax 
0 cosφ -sinφ   Ay   Ay・cosφ-Az・sinφ   Ay・{-Ay/(Ay^2+Az^2)}-Az・{Az/(Ay^2+Az^2)}   -1
0 sinφ  cosφ」  Az」   Ay・sinφ+Az・cosφ」  Ay・{Az/(Ay^2+Az^2)}+Az・{-Ay/(Ay^2+Az^2)}」  0」
に変換され、x-y平面上に乗ります。これを(Ax' Ay' Az') とします。
つまり、(Ax' Ay' Az')=(Ax -1 0)

始点(Px',Py',Pz')もこの変換を受けるのですが、変換を全部纏めて後、一括変換させます。

今度は、x-y平面上に乗った回転軸ベクトル(Ax' Ay' Az')を、z軸の周りにψ回転させます。
「cosψ -sinψ 0 「Ax'  =「Ax'・cosψ-Ay'・sinψ =「Ax・cosψ+sinψ
sinψ  cosψ 0   Ay'   Ax'・sinψ+Ay'・cosψ   Ax・sinψ-cosψ
  0    0   1」  Az'」       Az'      」     0      」
これが、x軸ベクトルに合うので、
Ax・cosψ+sinψ=1
Ax・sinψ-cosψ=0
これから、cosψ=Ax/(Ax^2+1)、sinψ=1/(Ax^2+1)
∴ ψ=Arctan(1/Ax)

以上の回転の変換の積は、
「cosψ -sinψ 0 「1  0    0   =「cosψ -sinψ・cosφ  sinψ・sinφ
sinψ  cosψ 0   0 cosφ -sinφ   sinψ  cosψ・cosφ -cosψ・sinφ
  0    0   1」  0 sinφ  cosφ」   0     sinφ      cosφ   」

この変換を始点(Px',Py',Pz')に施します。
「cosψ -sinψ・cosφ  sinψ・sinφ  「Px' = 「Px'・cosψ-Py'・sinψ・cosφ+Pz'・sinψ・sinφ
sinψ  cosψ・cosφ -cosψ・sinφ  Py'   Px'・sinψ+Py'・cosψ・cosφ-Pz'・cosψ・sinφ
  0     sinφ      cosφ   」 Pz'」  Py'・sinφ+Pz'・cosφ               」 

この点を(Px”,Py”,Pz”)とします。

さて、ここでx軸に合った回転軸ベクトル(1 0 0)周りに(Px”,Py”,Pz”)を角度θ、回転させます。
「1  0    0   「Px” =「     Px”   
0 cosθ -sinθ   Py”  Py”・cosθ-Pz”・sinθ 
0 sinθ  cosθ」  Pz”」  Py”・sinθ+Pz”・cosθ」

これを(P_x, P_y, P_z)とします。

今度は、回転させた回転軸を元に戻す変換です。
回転の変換の逆行列は、行列各要素の余因子の行と列を入れ替えたものを行列式で割ったもので、
行列式は、(cosψ)^2+(sinψ)^2=1 なので、逆行列は
「 cosψ      sinψ        0  
-sinψ・cosφ  cosψ・cosφ   sinφ
sinψ・sinφ   -cosψ・sinφ  cosφ」

これを、(P_x, P_y, P_z)に施します。
「 cosψ      sinψ        0   「P_x =「P_x・cosψ+P_y・sinψ
-sinψ・cosφ  cosψ・cosφ   sinφ  P_y   -P_x・sinψ・cosφ+P_y・cosψ・cosφ+P_z・sinφ
sinψ・sinφ   -cosψ・sinφ  cosφ」 P_z」  P_x・sinψ・sinφ-P_y・cosψ・sinφ+P_z・cosφ」

結局、θ回転後のP点の座標は、
x座標 : P_x・cosψ+P_y・sinψ
y座標 : -P_x・sinψ・cosφ+P_y・cosψ・cosφ+P_z・sinφ
z座標 : P_x・sinψ・sinφ-P_y・cosψ・sinφ+P_z・cosφ
となります。

ここで、置き換えた変数を順次、元に戻します。
P_x、P_y、P_z を Px”、Py”、Pz” に、
Px”、Py”、Pz” を Px’、Py’、Pz’ に、
最後に、平行移動を戻して Px’、Py’、Pz’ を Px、Py、Pz に直します。

先ず、中心点(Sx,Sy,Sz)が原点にくるよう全体を平行移動させます。
(一番最後に元に戻します)
始点(Px,Py,Pz)は、(Px-Sx,Py-Sy,Pz-Sz)に移ります。この座標を(Px',Py',Pz')とします。

次に、回転軸ベクトル(Ax Ay Az)を回転させ、x軸に合致させます。それには二回の
回転変換が必要です。
最初に、ベクトル(Ax Ay Az)と、x軸方向単位ベクトル(1 0 0)のなす平面の法線ベクトルが
z軸に合うよう、x軸を回転させます(その角度をφとします)。
すると、回転軸ベクトルはx-y平面上に乗るので、それがx軸...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング