sub_set01へ戻る

名称 ・・・・・・・

t=ta(始点)〜tb(終点)までの長さ計算

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

SimpLength

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

シンプソン法を使って指定したアンカーポイントPtNoとPtNo+1番目の区間の2つのtパラメータ(0〜1)間の弧の長さを計算する。

使用前提 ・・・・・・・

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

依存関係 ・・・・・・・

GetnVec:
kaisa :
tBibun :

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

引数説明 ・・・・・・・

Vec3 :
n :
ta :
tb :
PtNo :

(in)線型状の座標データ(3次元配列)が格納されている。
(in)分割数(精度に関係する)
(in)最初のポイントのベジェパラメータ
(in)終点のベジェパラメータ
(in)PtNo番目のアンカーポイント〜PtNo+1番目のアンカーポイントまで計算される

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

tベジェ曲線のtaからtb間の弧長

変数説明 ・・・・・・・

XYZ0(2)〜XYZ3(2)
Pos(2) :
P :
j,k :
Ft1 :
Ft2n :
Ft :
SFt1,SFt2 :
A,B,C,h,t() :

階差
ベジェ曲線上の点の座標値
ベジエ制御点P0〜P3の座標値
カウンタ用変数
級数の最初の項
級数の最後(2n)の項
級数の一般項
総和
シンプソンの公式のパラメータ

注意点 ・・・・・・・

例 NA=2 ta=0.2 tb=0.6を引数で指定すると

 
スクリプト
'--------------ベジェ曲線の弧長(S)を求める
'ベジェパラメーターtaからtb間での長さを求めるFunction
Function SimpLength(Vec3,n,ta,tb,PtNo)
'引数---
'  Vec3:(in)線型状の座標データ【2次元】が格納されている。
'  n   :(in)分割数(精度に関係する)
'  ta  :(in)最初のポイントのベジェパラメータ
'  tb  :(in)終点のベジェパラメータ
'  PtNo:(in)PtNo番目のアンカーポイント〜PtNo+1番目のアンカーポイントまで計算される
  dim XYZ0(3),XYZ1(3),XYZ2(3),XYZ3(3)
  Dim Pos(3), dPos(3), ddPos(3)
  Dim P
  Dim j,k,Ft1,Ft2n,Ft,SFt1,SFt2
  Dim A,B,C,h,t()
  '---引数nが決まったためtを動的に宣言
  Redim t(2*n)

  'ベジェ計算用の座標データを取り出す
  P=GetnVec(Vec3,PtNo)
  '---ベジェパラメータtを2n等分にしそれぞれのk番目のベジェパラメータを配列に割り付け
  for k=0 to 2*n
    t(k)=ta+k*(tb-ta)/(2*n)
  next

  '-----Simpson法で必要な各パラメータの算出-----
  Call kaisa(P,XYZ0,XYZ1,XYZ2,XYZ3)                     '階差の計算
  Call tBibun(XYZ0,XYZ1,XYZ2,XYZ3,t(0),Pos,dPos,ddPos)  'XYZ,1階微分,2階微分を計算
  Ft1=SQR(dPos(0)^2+dPos(1)^2+dPos(2)^2)
  Call kaisa(P,XYZ0,XYZ1,XYZ2,XYZ3)
  Call tBibun(XYZ0,XYZ1,XYZ2,XYZ3,t(2*n),Pos,dPos,ddPos)
  Ft2n=SQR(dPos(0)^2+dPos(1)^2+dPos(2)^2)

  SFt1=0
  for k=1 to n
    Call kaisa(P,XYZ0,XYZ1,XYZ2,XYZ3)
    Call tBibun(XYZ0,XYZ1,XYZ2,XYZ3,t(2*k-1),Pos,dPos,ddPos)
    Ft=SQR(dPos(0)^2+dPos(1)^2+dPos(2)^2)
    SFt1=SFt1+Ft
  next

  SFt2=0
  for k=1 to n-1
    Call kaisa(P,XYZ0,XYZ1,XYZ2,XYZ3)
    Call tBibun(XYZ0,XYZ1,XYZ2,XYZ3,t(2*k),Pos,dPos,ddPos)
    Ft=SQR(dPos(0)^2+dPos(1)^2+dPos(2)^2)
    SFt2=SFt2+Ft
  next

  'シンプソンの公式に必要なパラメータ
  A=Ft1+Ft2n	        'パラメータA
  h=(tb-ta)/(2*n)	'パラメータh
  B=4*SFt1		'パラメータB
  C=2*SFt2		'パラメータC

  'Simpsonの公式
  SimpLength=(h/3)*(A+B+C)
  XShade.Message PtNo&"番目のポイントと"&PtNo+1&"番目のポイントの長さ:S="&Round(SimpLength)
End function
使用例
  Dim NA,Vec3,PtNo
  Dim n,ta,tb

  'アンカーポイントの数を取得
  NA=XShade.NumberOfAnchorPoints()
  'アンカーポイントの座標値を取得
  Vec3=GetVec3(NA)

'--------------------ベジェ曲線でta(始点)からtb(終点)までの長さを計算
'    (アンカーポイント番号PtNo〜PtNo+1の部分が対象)
  n=20: ta=0: tb=1: PtNo=0
  b=SimpLength(Vec3,n,ta,tb,PtNo)
  XShade.Message"ta="&ta&"から tb="&tb&"までの距離は"&_
                 (round(b*1000)/1000)&"です。"

sub_set01へ戻る