名称 | ・・・・・・・ |
距離を指定してtパラメータを計算 |
|
ルーチン名 | ・・・・・・・ |
tParam |
|
スクリプトNo | ・・・・・・・ | sub_set01- 003 | |
file名 | ・・・・・・・ | ScriptSet01.lzh sub_set01のページからセットごとダウンロードしてください。 |
|
概略 | ・・・・・・・ |
'アンカーポイントからLtargetの距離にある曲線上の点のtパラメータを計算する |
|
使用前提 | ・・・・・・・ |
線形状(べジェ曲線)を選択して適切な引数を指定してから実行する。 |
|
依存関係 | ・・・・・・・ |
GetnVec |
ベジエ制御点P0〜P3の座標値の取得---sub_set01-012 |
引数説明 | ・・・・・・・ |
Vec3: |
(in)線型状の座標データ(3次元配列)が格納されている。 |
戻り値説明 | ・・・・・・・ |
Ltargetの距離にある曲線上の点のtパラメータ |
|
変数説明 | ・・・・・・・ |
XYZ0(2)〜XYZ3(2) |
階差 |
注意点 | ・・・・・・・ |
Ltargetに弧長(PtNo〜PtNo+1)よりも大きい数値を設定すると戻り値は1よりも大きくなります。 |
|
スクリプト | |||
'--------------tパラメータ算出(指定ポイントからの距離でtパラメーターを計算) Function tParam(Vec3,PtNo,Ltarget,n) 'アンカーポイントからLtargetの距離にある曲線上の点のtパラメータを計算する '戻値---tパラメーター '引数--- ' Vec3 :(in)対象となる線形状の座標データ(3次元) ' PtNo :(in)PtNo番目のアンカーポイント〜PtNo+1番目のアンカーポイントまでが計算の対象となる。 ' Ltarget:(in)アンカーポイントからの距離(指定値) ' n :(in)分割数 弧長計算(SimpLength)で使用する。(精度に影響する) XShade.Message"Ltarget="&Ltarget Dim XYZ0(2),XYZ1(2),XYZ2(2),XYZ3(2) '階差 Dim ta,tb 'ta:開始tパラメータ tb:終了tパラメータ Dim dLnew 'dLnew:計算値と目標値との差(長さ) Dim flag,alpha 'flag:判定用フラグ alpha:収束判定値(許容誤差範囲) Dim P '3次のベジエ制御点P0〜P3の座標値 Dim Pos(2) 'ベジェ曲線上の点の座標値 Dim dPos(2) 'Posの微分 Dim ddPos(2) 'Posの二階微分 ta=0:tb=1:alpha=0.0001 P=GetnVec(Vec3,PtNo) '3次のベジエ制御点P0〜P3の座標値を取得する tb=LTarget/SimpLength(Vec3,n,ta,tb,PtNo) '弧長を求める ' if abs((SimpLength(Vec3,n,ta,tb,PtNo)-Ltarget))/Ltarget>alpha then Flag=0 '---収束条件に当てはまるまで逐次計算 Do Call kaisa(P,XYZ0,XYZ1,XYZ2,XYZ3) '階差を求める Call tBibun(XYZ0,XYZ1,XYZ2,XYZ3,tb,Pos,dPos,ddPos) 'Pos,Posの微分,二階微分を求める dLnew=SQR(dPos(0)^2+dPos(1)^2+dPos(2)^2) tb=tb+(Ltarget-SimpLength(Vec3,n,ta,tb,PtNo))/dLnew if abs(SimpLength(Vec3,n,ta,tb,PtNo)-LTarget)/LTarget < alpha then flag=1 Loop until Flag end if tParam=tb Call tBibun(XYZ0,XYZ1,XYZ2,XYZ3,tb,Pos,dPos,ddPos) End function |
|||
使用例 | |||
Dim NA,Vec3,PtNo Dim Ltarget,n,tb 'アンカーポイントの数を取得 NA=XShade.NumberOfAnchorPoints() 'アンカーポイントの座標値を取得 Vec3=GetVec3(NA) '--------------------ベジェ曲線上の距離を指定してtパラメータを計算する ' (アンカーポイント番号PtNo〜PtNo+1の部分が対象) PtNo=0: Ltarget=3000: n=10 tb=tParam(Vec3,PtNo,Ltarget,n) if tb>=0 and tb<=1 then XShade.Message"アンカーポイント番号="&PtNo&"から"&_ Ltarget&"mmの地点のtパラメータは"&round(tb*10000)/10000&"です。" end if |