座標A(x1,y1,z1)から座標B(x2,y2,z2)への線分ABと
座標C(x3,y3,z3)から座標B(x4,y4,z4)への線分CDがあり、
線分ABと線分CDが交点を持つかどうかのプログラムを作りたいです。

C言語かVBかFortranで記述され、DirectXやOpenGLのライブラリを使わない方法の
サンプルソースの載っているページを教えていただけませんか?
また、ご迷惑でなければソースコードを記述していただけると助かります。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

2線分の最短距離を求めてそれが0になる場合,交わっていると判断するのが良いと思います.


piyoは2線分の最短距離を求めるサブルーチンです.
2線分が平行なときは別の処理が必要ですね.

subroutine piyo(r1,r2,r3,r4,d)
implicit none
real(8),intent(in)::r1(3),r2(3),r3(3),r4(3)
real(8),intent(out)::d
real(8) r12(3),r34(3),b(2),a(2,2),s,t,rr(3),deta
r12(:)=r2(:)-r1(:)
r34(:)=r4(:)-r3(:)

!!! 2つの直線の距離の2乗をdとする
!!! d=|((r1+s*r12)-(r3+t*r34))|^2
!!! dの最小値を求める
!!! dをsについて偏微分
!!! r12・((r1+s*r12)-(r3+t*r34))=0
!!! dをtについて偏微分
!!! -r34・((r1+s*r12)-(r3+t*r34))=0
!!! sとtについてまとめると
!!! r12・r12 s - r12・r34 t = -r12・r1 +r12・r3
!!! -r34・r12 s + r34・r34 t = r34・r1 -r34・r3
a(1,1)=dot_product(r12,r12)
a(2,1)=-dot_product(r12,r34)
a(1,2)=a(2,1)
a(2,2)=dot_product(r34,r34)
b(1)=-dot_product(r12,r1)+dot_product(r12,r3)
b(2)=dot_product(r34,r1)-dot_product(r34,r3)
deta=a(1,1)*a(2,2)-a(1,2)*a(2,1)
!!! sとtについて解く
if(deta /=0.d0) then
s=(a(2,2)*b(1)-a(1,2)*b(2))/deta
t=(-a(2,1)*b(1)+a(1,1)*b(2))/deta
!!! elseif
!!! deta=0の場合は別途処理する必要あり.2つの線分が平行な場合deta=0となる.
end if

!!! この時点で0<s<1, 0<t<1でなければ,交わっていないことが分かる.
!!! if(s<0.d0.or.1.d0<s.or.t<0.d0.or.1.d0<t) then
!!! write(*,*) "交わってない"
!!! stop

if(s<0.d0) then
s=0.d0
elseif(1.d0<s)then
s=1.d0
end if
if(t<0.d0) then
t=0.d0
elseif(1.d0<t)then
t=1.d0
end if

!!! 最短距離の計算
rr(:)=r1(:)+s*r12(:)-(r3(:)+t*r34(:))
d=sqrt(dot_product(rr,rr))
end subroutine piyo

program hoge
implicit none
real(8) r1(3),r2(3),r3(3),r4(3),d
r1(:)=(/0.d0,0.d0,0.d0/)
r2(:)=(/1.d0,1.d0,1.d0/)
r3(:)=(/1.d0,0.d0,0.d0/)
r4(:)=(/1.d0,1.d0,0.d0/)
call piyo(r1,r2,r3,r4,d)
if(d<1.d-15) then
write(*,*) "交わる"
endif
end program

この回答への補足

質問者のGyustabです。

以下3点質問させてください。

(1)!!! 2つの直線の距離の2乗をdとする
 !!! d=|((r1+s*r12)-(r3+t*r34))|^2
 !!! dの最小値を求める
 の部分について 

 線分r1r2上の点を(r1+s*r12)
 線分r3r4上の点を(r3+t*r34) とすると
 
 2点間の距離は
 sqrt( ( (r3+t*r34)-(r1+s*r12) )^2 ) ⇒ (r3+t*r34)-(r1+s*r12) となり

 距離の2乗は ((r3+t*r34)-(r1+s*r12))^2 となるという理解で良いでしょうか?

(2)距離の2乗をdとしているのは、
 s,tについて微分出来る形にするためわざと2乗していると考えれば良いですか?

(3) a(1,1)=dot_product(r12,r12)
  a(2,1)=-dot_product(r12,r34)
  a(1,2)=a(2,1)
  a(2,2)=dot_product(r34,r34)
  b(1)=-dot_product(r12,r1)+dot_product(r12,r3)
  b(2)=dot_product(r34,r1)-dot_product(r34,r3)
  deta=a(1,1)*a(2,2)-a(1,2)*a(2,1)
  
  上記数式がわかりません、
  一連の流れは内積を使って何を計算しているのでしょうか?

補足日時:2011/04/21 10:15
    • good
    • 0
この回答へのお礼

わざわざFortranのプログラムを記述いただきありがとうございます。

本日、線分が半径を持つことが判明したため、
線分が衝突しないためには、
線分間で 半径*2 より大きい離隔距離が必要になりました
そのため nineexitさんのコードを解析し、理解したく思います。

まず、
!!! 2つの直線の距離の2乗をdとする
!!! d=|((r1+s*r12)-(r3+t*r34))|^2
の部分がわからず、なぜこのように定義できるのか現在ネットで調査しています。

dot_product はFortranの関数でベクトル間の内積を求めるということがわかりました、
以下のページを参考にエクセルVBAのコードに落とせるよう調べています。
http://homepage1.nifty.com/gfk/vector-naiseki.htm

まだまだ時間がかかりますが少しづつコードを解析していきます。

お礼日時:2011/04/20 20:00

> つまり、2直線間の距離の2乗であるdは、


> 2直線間の距離同士の内積と考えるということでしょうか?

2つの直線上にある"2つの点"の距離の自乗がdです.
「2直線間の距離同士の内積」ではありません.
内積は距離同士でとるものではなくベクトル同士でとるものです.
同じベクトル同士の内積を取ると長さの自乗が得られるので,内積を取っています.
    • good
    • 0
この回答へのお礼

>2つの直線上にある"2つの点"の距離の自乗がdです.
>「2直線間の距離同士の内積」ではありません。
>内積は距離同士でとるものではなくベクトル同士でとるものです。
>同じベクトル同士の内積を取ると長さの自乗が得られるので,内積を取っています.
ご指摘ありがとうございます、数学素人の回答ですいません、
ベクトルと距離がごちゃまぜになっていました、
ご指摘いただいた点および今まで教えていただいた点を
含めて一度ソースコードを納得できるところまでコーディングしてみます。

お礼日時:2011/04/25 22:48

回答に対する質問への回答です。



(1)
r1, r2, r3, r4, r12, r34はベクトルです。
ベクトルa=(a1,a2,a3)の長さの自乗はa同士の内積(a・a)になります。
サブルーチンの終わりに
rr(:)=r1(:)+s*r12(:)-(r3(:)+t*r34(:))
d=sqrt(dot_product(rr,rr))
とありますが、これが長さの自乗を計算しているところです。

(2)
微分しやすいように自乗しています。
2直線上の点の距離の最小値を求めるためには、2直線上の点の距離の自乗の最小値を求めればよいので、このようなことをしています。
最後に最短距離を算出するときは、きちんとルートを取っています。

(3)
!!! r12・r12 s - r12・r34 t = -r12・r1 +r12・r3
!!! -r34・r12 s + r34・r34 t = r34・r1 -r34・r3
を行列A、ベクトルbを用いて表記しました。
Ax=bの形でxはsとtからなるベクトルです。x=(s,t)
detaは行列A行列式です。
ただの連立一次方程式なので、行列やベクトルを持ち出す必要はありません。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。

>ベクトルa=(a1,a2,a3)の長さの自乗はa同士の内積(a・a)になります。
つまり、2直線間の距離の2乗であるdは、
2直線間の距離同士の内積と考えるということでしょうか?


>d=sqrt(dot_product(rr,rr))
>とありますが、これが長さの自乗を計算しているところです。
ベクトルa=(a1,a2,a3)の長さの自乗はa同士の内積(a・a)ということなので、
dot_product(rr,rr)はベクトルrrの長さの2乗と同じ意味ですね、
ということはベクトルrr同士の内積の平方根を求めるとベクトルrrの長さが出てくるという事ですね



>微分しやすいように自乗しています。
>2直線上の点の距離の最小値を求めるためには、
>2直線上の点の距離の自乗の最小値を求めればよいので、このようなことをしています。
>最後に最短距離を算出するときは、きちんとルートを取っています。
とてもわかりやすかったです、
紙上に数式を記述し、展開してs,tに対して微分したところ、
sとtについてまとめた数式まで辿り着けました。

お礼日時:2011/04/21 19:50

#1です。



>下記4つの数式の条件を満たすのは4点の座標の値が整数の場合のみでしょうか?
>座標の値が単精度浮動小数点や倍精度浮動小数点の場合は有効桁数の範囲内であれば成立しますか?

数学的には、実数の範囲で成立します。

コンピュータで単精度、倍精度で計算する場合は当然有効桁数の問題がでてきます。
特に、減算で有効桁数が桁落ちする可能性がでてくるので、十分考慮する必要があります。


前回の回答で、最初に「コードを書くのは面倒」と書いたのはそういう意味です。悪しからず。
    • good
    • 0
この回答へのお礼

ご返答いただきありがとうございます。


>前回の回答で、最初に「コードを書くのは面倒」と書いたのはそういう意味です。
>悪しからず。
いえいえ、疑問に対する答えがわかっただけで助かりました。

明日、会社にて数式の許容誤差や
計算上の有効桁数の桁落ちをどのようにすれば良いかを熟考してみます。

お礼日時:2011/04/19 21:01

学校の宿題か何かの回答をここに丸投げ質問してないですか。

そういうのは先般の大学入試問題にでも批判を浴びたはず。
もしそうなら、授業で先生に教えてもらえるのではないですか。それをここで教えるのは授業妨害とも言える。
Googleででも「空間 2直線 交点座標 」などで照会すれば記事はある。
ベクトルや行列の知識が必要な記事が多いが。そういうのは理解できるのか。
http://www.teu.ac.jp/aqua/GS/text/PDF/3DMath.pdf
    • good
    • 0
この回答へのお礼

>学校の宿題か何かの回答をここに丸投げ質問してないですか。そういうのは先般の大学入試問題にでも>批判を浴びたはず。
>もしそうなら、授業で先生に教えてもらえるのではないですか。それをここで教えるのは授業妨害とも>言える。
いいえ違います社会人です、仕事上必要であったため質問しました、
教えてくれる先生などいませんし、授業を妨害している暇はありません。

>Googleででも「空間 2直線 交点座標 」などで照会すれば記事はある。
「線分 交点 3次元」、「直線 衝突判定 3次元」、「直線 交点 サンプルプログラム」等で
検索しましたが、概念はたくさんあっても私の解読できるC言語・VisualBasic・Fortran・javaのソースが発見できなかったためここに質問しました。
客先にはエクセルで提供するのでDirectXやOpenGLのようなライブラリを要するものは使用したくないのです。

>ベクトルや行列の知識が必要な記事が多いが。そういうのは理解できるのか。
数学者でも教師でも数値解析エンジニアでもないのでベクトルや行列について1~100まで
理解する気はありません、客先の仕様を満たすために必要な概念と考え方、
ソースコードへ落とす事が必要なだけです。

以上、なにか返答があればどうぞ

お礼日時:2011/04/19 13:25

コードを書くのは面倒なので考え方だけ。



x12=x2-x1、y12=y2-y1、z12=z2-z1、
x34=x4-x3、y34=y4-y3、z34=z4-z3とすると、
線分AB上の点は(x1+s*x12, y1+s*y12, z1+s*z12) (0≦s≦1)
線分CD上の点は(x3+t*x34, y3+t*y34, z3+t*z34) (0≦t≦1)
と表現できます。

線分ABと線分CDが交点を持つとすると、
(1) x1+s*x12=x3+t*x34
(2) y1+s*y12=y3+t*y34
(3) z1+s*z12=z3+t*z34
が成り立ちます。

(1),(2)式からs,tを求めると、
s=((x3-x1)*y34-x34*(y3-y1))/(x12*y34-x34*y12)
t=((x1-x3)*y12-x12*(y1-y3))/(x34*y12-x12*y34)

このS,tが0≦s≦1 , 0≦t≦1 の条件を満たし、かつ、
このs,tを(3)式に代入して等号が成立するときに交点を持ちます。

あとは、これをコードにすればいいだけです。


補足
x12*y34=x34*y12 の場合、2直線は、同じか、並行か、ねじれ位置にあるので交差していないことになります。

この回答への補足

質問者のGyustabです。

コーディング中疑問に思ったため再度質問させてください。

下記4つの数式の条件を満たすのは4点の座標の値が整数の場合のみでしょうか?
座標の値が単精度浮動小数点や倍精度浮動小数点の場合は有効桁数の範囲内であれば成立しますか?

成立しないのであれば (x12*y34)/(x34*y12)≒1.00000 のように限りなく1に近づく誤差を
計算したり、s=・・・・やt=・・・の式の乗算・除算の順番を考え有効桁数の
精度を考慮した計算をする必要があるのではないかと思っています。


数式1:s=((x3-x1)*y34-x34*(y3-y1))/(x12*y34-x34*y12)
数式2:t=((x1-x3)*y12-x12*(y1-y3))/(x34*y12-x12*y34)
数式3:z1+s*z12=z3+t*z34
数式4:x12*y34=x34*y12

補足日時:2011/04/19 19:24
    • good
    • 0
この回答へのお礼

返信ありがとうございます、以下の部分が大変助かりました。

s=((x3-x1)*y34-x34*(y3-y1))/(x12*y34-x34*y12)
t=((x1-x3)*y12-x12*(y1-y3))/(x34*y12-x12*y34)

さまざまなホームページで紹介されている概念の通りにやれば紙の上では解けるのですが、
どうやって2線分の交点をソースコードに落とせば良いかで四苦八苦しておりました。

今よりコーディングしてみます。
補足もありがとうございます、この部分も条件に組み込みます。

お礼日時:2011/04/19 13:31

このQ&Aに関連する人気のQ&A

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

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

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

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

Q3次元空間内での線分の交差判定について

はじめまして。
3D関係のプログラムを組む上で、線分同士の判定を行う必要があるのですが
数学の知識が乏しく困っています。

3次元空間内の線分ABとCDが交差しているか判定し、
交差していればその交点を求めたいのです。
2次元の場合はできたのですが、3次元になるとどうやって計算すればよいのか
わかりません。(交差以外に、ねじれの位置関係があるんですよね?)
どなたか教えていただけると助かります。

Aベストアンサー

1)一般に「捩れの位置」になりますから、互いに最短の位置を求める問題に帰着します。a-kumaさんの言われるような連立一次方程式では未知数が2つ、式がx,y,z3つとなるので解けません。2次元ならyosizoさんの言われるように未知数と式の数が2つで簡単に解けます。

2)線分AB、CDの何れかの長さが<ε以下、または、線分AB、CDはほぼ平行ならゼロ割を起こすか答えが求まっても答えの精度が著しく低下します。このチェックも実際のプログラムでは絶対に必要です。

3)で、以下、2)のチェック済みであると仮定して.....。

4)たまたま最近3D-CAD用に作ったもので数式の求めた方を忘れてしまったが、

// t0:AB方向単位ベクトル、t1:CD方向単位ベクトル、として、
// float spd = <t0・t1>即ち、ベクトルt0とt1の内積

float det= spd*spd - 1.0f; // spd:AB方向単位ベクトル
v01 = C - A; //3Dベクトル (C-A)
u0 = (spd*<v01・t1> - <v01・t0>) / det;
u1 = (<v01・t0> - spd*<v01・t1>) / det;

として、パラメータ、u0,u1が求まります。ここに、
u0:AB方向パラメータ、u0=0の時、q0(u0)=Aで、u0はAからの距離を表わす。
■q0(u0)=A+u0*t0...............Equ.1)
u1:CD方向パラメータ、u1=0の時、q1(u1)=Cで、u1はCからの距離を表わす。
■q1(u1)=C+u1*t1...............Equ.2)

これで、捩れの位置に2点求まるのですが、

・2点が距離の許容誤差よりも離れていたら、エラーとする。
・2点が距離の許容誤差以内なら、2点の中点を取る。
・中点がいやなら、重みを掛ける(場合もある)。

この説明で不十分ならあとで補足します。

1)一般に「捩れの位置」になりますから、互いに最短の位置を求める問題に帰着します。a-kumaさんの言われるような連立一次方程式では未知数が2つ、式がx,y,z3つとなるので解けません。2次元ならyosizoさんの言われるように未知数と式の数が2つで簡単に解けます。

2)線分AB、CDの何れかの長さが<ε以下、または、線分AB、CDはほぼ平行ならゼロ割を起こすか答えが求まっても答えの精度が著しく低下します。このチェックも実際のプログラムでは絶対に必要です。

3)で、以下、2)のチェック済みである...続きを読む

Q3次元空間での2直線の交点の求め方

悩んでおります.御力添えを願います.

以下の条件下にて,2つの直線式を求め,その交点を求めようとしております.

1.点p(a0,b0,c0)と点q(a1,b1,c1)の座標は既知.

2.点s(d,e,f)は,座標は未知であるが,点p,点qへ向けて2つの直線を延ばしており,それぞれの直線の傾きが既知.

以上の条件をもとに,点s(d,e,f)の座標を求めようとしています.


私の考えた手法は,以下の物ですが上手くいきません.

1.点sから伸びる2つの直線の方向余弦を求める.
例)vx = r * cosα,vy = r * cosβ, vz = r * cosγ
(上記の様に2点へと伸びる直線の方向余弦をそれぞれ求める)

2.求めた方向余弦と,点p,点qを用いて2つの直線式を表す.
例)x = a0 + vx0 * t, y = b0 + vy0 * t, z = c0 + vz0 * t
x = a1 + vx1 * s, y = b1 + vy1 * s, z = c1 + vz1 * s
  
3.誤差を考慮し,2直線間の距離が1番小さくなる2点を求める.
例)(距離)^2 = {a0 + vx0 * t - a1 - vx1 * s}^2
= {b0 + vy0 * t - b1 - vy1 * s}^2
= {c0 + vz0 * t - c1 - vz1 * s}^2
 
  上記の式をs,tに関して偏微分してやり,それぞれを0として連立 方程式を解き,s,tを求める.

  求めたs,tを各直線式に代入してやり,2直線間の距離が最も短く なる2点を求める.

4.その2点の線分上の中点を求め,点s(d,e,f)とする.

上記手法で求めようとしましたが,どうも点sの座標が求まりません.

点sで方向余弦を求めるのが駄目なのでしょうか?
2直線間の距離が最も短くなる2点の求め方が駄目なのでしょうか?

幾何学初心者なため,混乱しております.
宜しくお願いいたします.

悩んでおります.御力添えを願います.

以下の条件下にて,2つの直線式を求め,その交点を求めようとしております.

1.点p(a0,b0,c0)と点q(a1,b1,c1)の座標は既知.

2.点s(d,e,f)は,座標は未知であるが,点p,点qへ向けて2つの直線を延ばしており,それぞれの直線の傾きが既知.

以上の条件をもとに,点s(d,e,f)の座標を求めようとしています.


私の考えた手法は,以下の物ですが上手くいきません.

1.点sから伸びる2つの直線の方向余弦を求める.
例)vx = r * cosα,vy = r *...続きを読む

Aベストアンサー

2直線の傾き s, t を勝手に与えると、交点があるとは限りませんね。
その場合は最小二乗解を求める、という作戦ですか。
ならば、一般化逆行列の手法を使えないものでしょうか ?

 http://www7.ocn.ne.jp/~kawa1/GIM.PDF
>一般逆行列

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二平面の交線の方程式

二平面の交線の方程式

(1)二平面 x+2y-z-4=0 と x-y+2z-4=0 の交線の方程式を求めよ。
(2)(1)の交線と点(0,1,0)とを通る平面の方程式を求めよ。

解答よろしくお願いいたします。

Aベストアンサー

(1)x+2y-z-4=0
x-y+2z-4=0
をx,yの連立方程式として解くと
x=-z+4 (z=-x+4)
y=z
よって-x+4=y=z

(2) (-1,1,1)はこの交線の方向ベクトル
   (4,0,0)はこの交線上にあり,これと(0,1,0)を結ぶベクトル(4,-1,0)
   2つのベクトル(-1,1,1),(4-1,0)に垂直なベクトル(1,4,-3)を求めて,これが求める平面の法線ベクトル。
求める平面上の任意の点を(x,y,z)とすると,これと(0,1,0)を結ぶベクトル(x,y-1,z)は
(1,4,-3)と垂直より
x+4(y-1)-3z=0
∴ x+4y-3z-4=0

Q3次元空間内の直線の方程式

3次元空間内の直線の方程式の一般形は何でしょうか?
私の考えでは、2つの平面が交わった線として表すのでは
ないかと思いますが、どうでしょうか?つまり

aX+bY+cZ+d=0
eX+fY+gZ+h=0

いかがでしょうか?

Aベストアンサー

2点A,Bを通る直線の式は、
Oを原点、直線上の任意の点をPとし、
OPベクトルをp,OAベクトルをa,ABベクトルをdで表したとき
p=a+td  (tは実数)
とかけます。

たとえば2点A(-1,-2,-3),B(4,5,6)を通る直線の式は
p=(x,y,z)としたとき
(x,y,z)=(-1,-2,-3)+t(5,7,9)
となります。x,y,zはtの1次式で表されているので
すべてをt= の形に直すと
(x+1)/5=(y+2)/7=(z+3)/9
となり、こんなふうに直線ABを表現することも可能です。

もちろんpromeさんの表現の仕方も直線を表す1つの方法です。

Q3次元空間にある2直線の再接近距離の求め方

3次元空間に仮に次のような2直線があった場合の、お互いが再接近した場合の距離を求めたいのですが、解法がさっぱり思いつきません。

x = ( x2 - x1 )t + x1
y = ( y2 - y1 )t + y1
z = ( z2 - z1 )t + z1

a = ( a2 - a1 )t + a1
b = ( yb - b1 )t + b1
c = ( c2 - c1 )t + c1

いったん平面に直して考えたりする必要があるのでしょうか?
それとも微積が絡むとか。。 何かしら公式があるとうれしいのですが(笑

解法をご存じの方いらっしゃいましたら、よろしくお願いします。

Aベストアンサー

> b = ( yb - b1 )t + b1

ん?これはミスタイプ?

b = ( b2 - b1 )t + b1

でしょうか。


2点
 <(x2-x1)t+x1, (y2-y1)t+y1,(z2-z1)t+z1>

 <(a2-a1)s+a1, (b2-b1)s+b1, (c2-c1)s+c1>
の距離の二乗をf(t,s)とすると

f(t,s) = ((x2-x1)t+x1-(a2-a1)s-a1)^2 +
     ((y2-y1)t+y1-(b2-b1)s-b1)^2 +
     ((z2-z1)t+z1-(c2-c1)s-c1)^2

です。で、連立方程式

∂f/∂t=0
∂f/∂s=0

を作ると、これはtとsに関する連立一次方程式になり、こいつを解いて、連立方程式を満たすt, sが決まります。これがfを最小にするt, sです。あとは√fを計算するだけ。

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軸...続きを読む

Q3次元空間上の2点を結ぶ線分の中点を知りたい

3次元空間上の点A(x1, y1, z1)と点B(x2, y2 z2)を結んで出来る線分の中点を知りたいのですが、
完全な文系出身であまり数学に詳しくないため、公式の見方がよくわかりません。

Wikipediaの中点のページにあるn次元ユークリッド空間上の中点の公式がそれのようですが、
「n 次元ユークリッド空間上の2点 A, B を直交座標系であらわし、それぞれを (a0, ..., an-1), (b0, ..., bn-1) とすると」
の時点ですでに理解できないので、単純な公式で教えて下さると助かります。

Aベストアンサー

中点座標を(x3,y3,z3)とすると
x3=(x1+x2)/2
y3=(y1+y2)/2
z3=(z1+z2)/2

QベクトルAとBに垂直なベクトルCを求めるには?

ベクトルAとBがあり、その両方に垂直なベクトルを求めたいのですが、
どうすれば良いのでしょうか?
内積を計算した結果で0になるものが直行しているというのはわかるのですが・・・

Aベストアンサー

rei00 です。先程の回答違ってますね。alfeim さんがお書きの様に A, B の外積が求めるものですね。

で,あえて内積で頑張るなら次の様になると思います。A, B を三次元ベクトル A (a1, a2, a3), B (b1, b2, b3) とし,求めるベクトルを X (x, y, z) とすると。

垂直=内積0より
 a1・x + a2・y + a3・z = 0
 b1・x + b2・y + b3・z = 0

これを解いて
 x = z・(b3・a2 - a3・b2)/(a1・b2 - b1・a2)
 y = z・(b3・a1 - a3・b1)/(a2・b1 - b2・a1)

今,求めるベクトルの大きさが決まっていませんので,x, y, z の比を使って,求めるベクトルは (a2・b3 - b2・a3, a3・b1 - b3・a1, a1・b2 - b1・a2) となります。

つまり A, B の外積になります。なお,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&Aランキング

おすすめ情報