sub_set01へ戻る

名称 ・・・・・・・

tを指定し、その点の法線の単位ベクトルを計算

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

eVecHousen

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

tパラメータ=tbを指定し、その地点の法線の方向ベクトルを計算する。

使用前提 ・・・・・・・

線形状(べジェ曲線)を選択して適切な引数を指定してから実行する。
引数に渡す Vec3,PtNo,tb を前もって用意しておく。

依存関係 ・・・・・・・

GetnVec
kaisa
tBibun
sBibun

ベジエ制御点P0〜P3の座標値の取得---sub_set01-012
階差の計算(ベジエ制御点Pから階差を計算)---sub_set01-016
座標値,微分,2階微分の計算---sub_set01-010
微分,2解微分(s弧長で微分)の計算---sub_set01-011

引数説明 ・・・・・・・

Vec3:
PtNo:
tb:

(in)線型状の座標データ【3次元配列】が格納されている。
(in)PtNo番目〜PtNo+1番目のアンカーポイントまで計算される。
(in)指定するtパラメータ(0〜1)

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

成功したときは法線方向ベクトルが配列が、失敗したときはfalseが返されます。
読み出し側ではIsArray関数を使って処理を切り分けてください。

変数説明 ・・・・・・・

XYZ0(2)〜XYZ3(2)
Kapper
Rou
Pos(2)
dPos(2)
ddPos(2)
P
sPos(2)
ssPos(2)

階差
曲率
曲率半径
ベジェ曲線のt地点の座標値
Posの微分(tで微分)
Posの2階微分(tで微分)
ベジエ制御点P0〜P3の座標値
Posの微分(s[弧長]で微分)
Posの2階微分(s[弧長]で微分)

注意点 ・・・・・・・

このサブルーチン自体には表示機能も描画機能もありませんのでtestDrawLineルーチンを使って確認テストをしてみてください。

 
スクリプト
'--------------ベジェ曲線の法線パラメーター
Function eVecHousen(Vec3,PtNo,tb)
'ベジェパラメータtでのベジェ曲線の法線のパラメータeVec(l,m,n)を算出する

'戻値---法線の方向ベクトル
'引数---
' PtNo:(in)PtNo番目のアンカーポイント〜PtNo+1番目のアンカーポイントまでが計算の対象となる。
' tb  :(in)tパラメータ(指定値)
' Vec3:(in)対象となる線形状の座標データ(3次元配列)
  Dim XYZ0(2),XYZ1(2),XYZ2(2),XYZ3(2)  '階差
  Dim Kapper,Rou          'Kapper:曲率  Rou:曲率半径
  Dim Pos(2), dPos(2), ddPos(2)  'Posの微分、Posの二階微分(tで微分)
  Dim P                       '3次のベジエ制御点P0〜P3の座標値
  Dim sPos(2),ssPos(2)   'Posの微分、Posの二階微分(s弧長で微分)
  Dim eVec(2)              '法線の方向(単位)ベクトル
  Dim j

  P=GetnVec(Vec3,PtNo)
  '階差を求めtの一階微分、二階微分を計算する
  Call kaisa(P,XYZ0,XYZ1,XYZ2,XYZ3)
  Call tBibun(XYZ0,XYZ1,XYZ2,XYZ3,tb,Pos,dPos,ddPos)
  'sの一階微分、二階微分を計算する
  Call sBibun(dPos,ddPos,sPos,ssPos)
  'κ(曲率)を求める公式
  Kapper=sqr(ssPos(0)^2+ssPos(1)^2+ssPos(2)^2)
  If Kapper=0 then
    eVecHousen=false:Exit Function
  end if
  if Kapper then
    Rou=1/Kapper
    for j=0 to 2
      eVec(j)=Rou*ssPos(j)	
    next
  end if
  eVecHousen=eVec
End Function 
使用例
  Dim NA,Vec3,PtNo
  Dim eVec,Pos,tb,L
  '-------------------ベジェ曲線でtを指定し、その点の接線の単位ベクトルを計算
'    (アンカーポイント番号PtNo〜PtNo+1の部分が対象)
  PtNo=0: tb=0.55: L=400
  eVec=eVecHousen(Vec3,PtNo,tb)
  if not IsArray(eVec) then exit sub
  Pos=calcPos(Vec3,PtNo,tb)
  Call testDrawLine(eVec,Pos,PtNo,tb,L)

sub_set01へ戻る