名称 | ・・・・・・・ |
tを指定し、その点の法線の単位ベクトルを計算 |
|
ルーチン名 | ・・・・・・・ |
eVecHousen |
|
スクリプトNo | ・・・・・・・ | sub_set01- 007 | |
file名 | ・・・・・・・ | ScriptSet01.lzh sub_set01のページからセットごとダウンロードしてください。 |
|
概略 | ・・・・・・・ |
tパラメータ=tbを指定し、その地点の法線の方向ベクトルを計算する。 |
|
使用前提 | ・・・・・・・ |
線形状(べジェ曲線)を選択して適切な引数を指定してから実行する。 |
|
依存関係 | ・・・・・・・ |
GetnVec |
ベジエ制御点P0〜P3の座標値の取得---sub_set01-012 |
引数説明 | ・・・・・・・ |
Vec3: |
(in)線型状の座標データ【3次元配列】が格納されている。 |
戻り値説明 | ・・・・・・・ |
成功したときは法線方向ベクトルが配列が、失敗したときはfalseが返されます。 |
|
変数説明 | ・・・・・・・ |
XYZ0(2)〜XYZ3(2) |
階差 |
注意点 | ・・・・・・・ |
このサブルーチン自体には表示機能も描画機能もありませんので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) |