sub_set01へ戻る

名称 ・・・・・・・

距離を指定してtパラメータを計算

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

tParam

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

'アンカーポイントからLtargetの距離にある曲線上の点のtパラメータを計算する

使用前提 ・・・・・・・

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

依存関係 ・・・・・・・

GetnVec
SimpLength
kaisa
tBibun

ベジエ制御点P0〜P3の座標値の取得---sub_set01-012
t=ta(始点)〜tb(終点)までの長さ計算---sub_set01-002
階差の計算(ベジエ制御点Pから階差を計算)---sub_set01-016
座標値,微分,2階微分の計算---sub_set01-010

引数説明 ・・・・・・・

Vec3:
PtNo:
Ltarget:
n:

(in)線型状の座標データ(3次元配列)が格納されている。
(in)PtNo番目〜PtNo+1番目のアンカーポイントまで計算される。
(in)アンカーポイントからの距離(指定値)
(in)分割数(精度に関係する)

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

Ltargetの距離にある曲線上の点のtパラメータ

変数説明 ・・・・・・・

XYZ0(2)〜XYZ3(2)
ta,tb
dLnew
flag
alpha
P
Pos(2)
dPos(2)
ddPos(2)

階差
ta:開始点のtパラメータ、tb:終了店のtパラメータ
計算値と目標値との差(長さ)
判定用フラグ
収束判定値(許容誤差範囲)
ベジエ制御点P0〜P3の座標値
ベジェ曲線上の点の座標値
Posの微分
Posの二階微分

注意点 ・・・・・・・

Ltargetに弧長(PtNo〜PtNo+1)よりも大きい数値を設定すると戻り値は1よりも大きくなります。
この結果はShade上で考えた場合、次のアンカーポイント区間にかかってしまうということになり,別の処理が必要となることを意味します。
実際に利用する場合は次のアンカーポイントも含めた処理を考えてください。

 
スクリプト

'--------------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

sub_set01へ戻る