sub_set03へ戻る

名称 ・・・・・・・

平面と直線の交点

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

LinePlanePtCross

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

3点で指定した平面と、直線上の点(位置ベクトル)と方向余弦とで指定した直線の交点を求めます。

使用例実行結果

これはスクリプトのtest()にある機能確認スクリプトを実行して「LinePlanePtCross」ルーチンの結果を描画させたものです。
左図の黄色がLeVec1,Lpos1で指定した直線、Vecこの2つの和が赤いベクトルとなる。 紫の矢印はベクトルの向きを示しています。
使用前提 ・・・・・・・

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

依存関係 ・・・・・・・

addVec3
subVec3
realVec3
innerProduct3
crossProduct3

ベクトルの加法(sub_set03-001)
ベクトルの減法(sub_set03-002)
ベクトルの整数倍(sub_set03-003)
ベクトルの内積(sub_set03-004)
ベクトルの外積(sub_set03-005)

引数説明 ・・・・・・・

Lpos
LeVec
Ppos1
Ppos2
Ppos3

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

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

交点の座標(位置ベクトル)が戻ります。  [vec(2)形式]
但し,平面と直線が平行の時(交差しない時)はfalseが戻ります。
正しい処理が行われたかどうかの判定にはIsArray関数を使ってください。正しく処理された時は配列が戻りますのでIsArray関数で判断できます。

変数説明 ・・・・・・・

変数説明の記述

記述

注意点 ・・・・・・・

本来、平行でfalseを返すべき時に誤差によりfalseを返さないことがありえます。そのためにclearanceを設定するようになっていますので,使用状況に合わせて最適化してください。
できるだけ戻り値はIsArray関数を使って判定するようにして下さい。

 
スクリプト
'---平面と直線の交点(面と線が交差する時のみ存在)-------
'(注)変換の繰り返しなどで元データの誤差が大いと判定漏れの可能性あり
'    有効桁数と相談してclearanceを決めてください。
Function LinePlanePtCross(Lpos,LeVec,Ppos1,Ppos2,Ppos3)
dim Nvec,t,clearance
  clearance=0.00001
  Nvec=normVec3(CrossProduct3(subVec3(Ppos2,Ppos1),subVec3(Ppos3,Ppos1)))
  if Not IsArray(Nvec) then
    LinePlanePtCross=false
    exit function
  end if
  if abs(innerProduct3(NVec,LeVec)) < clearance then
    LinePlanePtCross=false
    exit function
  end if
  t=-innerProduct3(Nvec,subVec3(Lpos,Ppos1))/innerProduct3(NVec,LeVec)
  LinePlanePtCross=addVec3(Lpos,realVec3(t,LeVec))
end function
使用例
call mainSub()
sub mainSub()
if StartMsg() then ExitSub
XShade.message("OKが押されました。")
end sub

sub_set03へ戻る