sub_set03へ戻る

名称 ・・・・・・・

二直線の交点

ルーチン名 ・・・・・・・

LinesPtCross

スクリプトNo ・・・・・・・ sub_set03- 010
file名 ・・・・・・・ ScriptSet03.lzh
sub_set03のページからセットごとダウンロードしてください。
概略 ・・・・・・・

2つの直線からその交点を求めます。
一つの直線は直線上の1点と方向余弦で表現します。

使用例実行結果

これはスクリプトのtest()にある機能確認スクリプトを実行して「LinesPtCross」ルーチンの結果を描画させたものです。

左図の黄色がpos1,eVec1で表現される直線と,pos2,eVec2で表現される直線です。この2つの直線の交点の位置ベクトルが赤いベクトルとなります。

紫の矢印はベクトルの向きを示しています。

平面とは違い空間ではかなり限定された条件でしか直線は交差することはありません。

使用前提 ・・・・・・・

戻り値を受け取る通常のバリアント変数(配列では無く)を宣言して用意しておく。

依存関係 ・・・・・・・

judgeLinesCross
addVec3
subVec3
realVec3
innerProduct3
crossProduct3

:直線の交差判定をします。(sub_set03-011)
:ベクトルの加法(sub_set03-001)
:ベクトルの減法(sub_set03-002)
:ベクトルの整数倍(sub_set03-003)
:ベクトルの内積(sub_set03-004)
:ベクトルの外積(sub_set03-005) ※judgeLinesCrossで使用する。

引数説明 ・・・・・・・

eVec1
eVec2
pos1
pos2

:直線1の方向余弦 [vec(2)形式]
:直線2の方向余弦 [vec(2)形式]
:直線1上の点の位置ベクトル [vec(2)形式]
:直線2上の点の位置ベクトル [vec(2)形式]

戻り値説明 ・・・・・・・

交点の位置ベクトルが戻ります。 通常のバリアント変数で受けてください。 [vec(2)形式]
判定の結果交差しない場合はfalseが返りますのでIsArray関数を使って戻り値を検証してください。交差して正しい処理が行われた時は配列が返りますのIsArray関数で検証をすることができます。

変数説明 ・・・・・・・

S1,S2,Q,dif,t

いずれも計算用の一時変数です。

注意点 ・・・・・・・

空間内で直線が交差する確立は非常に低く、コンピューターで計算する際には誤差を見越す必要があります。
このサブルーチンから呼び出すjudgeLinesCrossにおいてもclearanceという変数で許容値を設定していますので、使用する条件に合わせて判定の許容値を最適化してください。
このサブルーチンに渡す引数がいくつかの変換を経てきていた場合は誤差の大きさが無視できない場合がありますのでその場合にはこの許容値を見直してください。
平面との交差点に比べ、案外使いそうで使わないのがこのサブルーチンです。

 
スクリプト
'---2直線の交差点(2点が交差するときのみ存在)-----------
Function LinesPtCross(eVec1,eVec2,Pos1,Pos2)
dim S1,S2,Q,dif,t
if Not JudgeLinesCross(eVec1,eVec2,Pos1,Pos2) then
  LinesPtCross=false
  exit function
end if
dif=subVec3(Pos2,Pos1)
Q=innerProduct3(eVec1,eVec2)
S1=innerProduct3(eVec1,dif)
S2=-(innerProduct3(eVec2,Dif))
t=(S2*Q+S1)/(1-Q^2)
LinesPtCross=addVec3(Pos1,realVec3(t,eVec1))
End Function
使用例
'2直線の交差点のテスト
'(注)交差するのは特別な場合なので与えるデータを変更する時は注意が必要
'変数はスクリプトのtest()を参照
  dim vecResult,eVec1,eVec3
  eVec1=normVec3(vec1)
  eVec3=normVec3(vec3)
  vecResult=LinesPtCross(eVec1,eVec3,pos1,pos3)
  if IsArray(vecResult) then
    for j=0 to 2
      XShade.Message"j="&j&"  ans="&vecResult(j)
    next
     drawVec pos1,vec1
     drawVec pos3,vec3
     drawPos vecResult
     ColorSet Red
     XShade.ObjectName="交差点の位置ベクトル"
  else
    XShade.Message"交差しません"
  end if
  XShade.SelectParent 1

sub_set03へ戻る