sub_set01へ戻る

名称 ・・・・・・・

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

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

eVecSessen

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

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

使用前提 ・・・・・・・

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

依存関係 ・・・・・・・

GetnVec
kaisa
tBibun

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

引数説明 ・・・・・・・

Vec3
PtNo
tb

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

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

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

変数説明 ・・・・・・・

XYZ0(2)〜XYZ3(2)
Pos(2)
dPos(2)
ddPos(2)
P
eVec(2)
S

階差
ベジェ曲線のt地点の座標値
Posの微分(tで微分)
Posの2階微分(tで微分)
ベジエ制御点P0〜P3の座標値
接線方向ベクトルを保管する変数
計算途中で使用(ノルム)

注意点 ・・・・・・・

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

 
スクリプト
'--------------ベジェ曲線の接線パラメーター
Function eVecSessen(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 Pos(2), dPos(2), ddPos(2)  'Posの微分、Posの二階微分(tで微分)
  Dim P                       '3次のベジエ制御点P0〜P3の座標値
  Dim eVec(2)            '接線の方向(単位)ベクトル
  Dim j,S

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

sub_set01へ戻る