sub_set03へ戻る

名称 ・・・・・・・

3次元ベクトルの正規化

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

normVec3

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

指定したベクトルを正規化(単位ベクトル化)したものを返します。

使用例実行結果

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

左図の黄色がvec1でこのベクトルを正規化したものが赤いベクトルです。
紫の矢印はベクトルの向きを示しています。

正規化したベクトルは大きさが1のベクトルなので左図は原点近くを拡大して見えるようにしたものです。

使用前提 ・・・・・・・

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

依存関係 ・・・・・・・

特になし

引数説明 ・・・・・・・

vec

:正規化したいベクトル [vec(2)形式]

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

正規化されたベクトル [vec(2)形式] 通常のバリアント変数で受け取る

変数説明 ・・・・・・・

D
newVec

:計算用一時変数
:計算用一時配列 [vec(2)形式]
:カウンタ用変数

注意点 ・・・・・・・

計算結果は戻り値で返ります。 
但し処理が正しく行われなかった場合にはfalseが戻ります。
間違った値が引数vecに与えられる可能性があるときは戻り値をIsArrayで確認して下さい。正しく処理された時は配列で戻るので判断できます。

 
スクリプト
'---ベクトルの正規化。----------------------------------
function normVec3(vec)
  dim D,j,newVec(2)
  D=0
  for j=0 to 2
    D=D+vec(j)^2
  next
  D=D^(1/2)
  if D=0.0 then
    normVec3=false
    exit function
  end if
  for j=0 to 2
    newVec(j)=Vec(j)/D
  next
  normVec3=newVec
end function

使用例
'ベクトルの正規化のテスト
'(注)正規化されたベクトルは非常に小さいので拡大してみてください。
'変数はスクリプトのtest()を参照
  dim vecResult
  vecResult=normVec3(vec1)
  if IsArray(vecResult) then
    for j=0 to 2
      XShade.Message"j="&j&"  ans="&vecResult(j)
    next
    drawVec pos0,vec1
    XShade.ObjectName="元のベクトル"
    drawVec pos0,vecResult
    ColorSet Red
    XShade.ObjectName="単位ベクトル"
  else
    XShade.Message"vec1には大きさがありません"
  end if
  XShade.SelectParent 1

sub_set03へ戻る