名称 | ・・・・・・・ |
t=ta(始点)〜tb(終点)までの長さ計算 |
|
ルーチン名 | ・・・・・・・ |
SimpLength |
|
スクリプトNo | ・・・・・・・ | sub_set01- 002 | |
file名 | ・・・・・・・ | ScriptSet01.lzh sub_set01のページからセットごとダウンロードしてください。 |
|
概略 | ・・・・・・・ |
シンプソン法を使って指定したアンカーポイントPtNoとPtNo+1番目の区間の2つのtパラメータ(0〜1)間の弧の長さを計算する。 |
|
使用前提 | ・・・・・・・ |
線形状(べジェ曲線)を選択して適切な引数を指定してから実行する。 |
|
依存関係 | ・・・・・・・ |
GetnVec: |
ベジエ制御点P0〜P3の座標値の取得---sub_set01-012 |
引数説明 | ・・・・・・・ |
Vec3 : |
(in)線型状の座標データ(3次元配列)が格納されている。 |
戻り値説明 | ・・・・・・・ |
tベジェ曲線のtaからtb間の弧長 |
|
変数説明 | ・・・・・・・ |
XYZ0(2)〜XYZ3(2) |
階差 |
注意点 | ・・・・・・・ |
例 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)&"です。" |