sub_set01へ戻る

名称 ・・・・・・・

tを指定し、その点の曲率、曲率半径を計算

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

Kyokuritu

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

tパラメータ=tbの地点の曲率(κ)を計算する。

使用前提 ・・・・・・・

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

依存関係 ・・・・・・・

GetnVec
kaisa
tBibun
sBibun

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

引数説明 ・・・・・・・

Vec3:
PtNo:
tb:

(in)線型状の座標データ【3次元配列】が格納されている。
(in)PtNo番目〜PtNo+1番目のアンカーポイントまで計算される。
(in)指定するtパラメータ(0〜1)

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

tパラメータ(=tb)の地点の曲率

変数説明 ・・・・・・・

XYZ0(2)〜XYZ3(2)
Kapper
Rou
Pos(2)
dPos(2)
ddPos(2)
P
sPos(2)
ssPos(2)

階差
曲率
曲率半径
ベジェ曲線のt地点の座標値
Posの微分(tで微分)
Posの2階微分(tで微分)
ベジエ制御点P0〜P3の座標値
Posの微分(s[弧長]で微分)
Posの2階微分(s[弧長]で微分)

注意点 ・・・・・・・

内部で使用するsBibunがfalseを戻したときの処理はしていません。
必要ならばsBibunの戻り値(bool値)を評価して処理を切り分けてください。

 
スクリプト
'--------------ベジェ曲線の曲率(κ)を求める
Function kyokuritu(Vec3,PtNo,tb)
'戻値---曲率κ
'引数---
' Vec3:(in)対象となる線形状の座標データ(3次元)
' PtNo:(in)PtNo番目のアンカーポイント〜PtNo+1番目のアンカーポイントまでが計算の対象となる。
' tb  :(in)tパラメータ(指定値)
  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弧長で微分)

  'ベジェ計算用の座標データを取り出す
  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)
  'κ(曲率)を求める公式
  kyokuritu=sqr(ssPos(0)^2+ssPos(1)^2+ssPos(2)^2)
  Rou=1/kyokuritu
  XShade.Message PtNo&"番目で、ベジェパラメータt="&tb&"のときの曲率κ="_
            &round(kyokuritu*1000000)/1000000
  XShade.Message PtNo&"番目で、ベジェパラメータt="&tb&"のときの曲率半径ρ="_
            &round(Rou*1000)/1000
End Function
使用例
  Dim NA,Vec3,PtNo
  Dim tb,a
  
  'アンカーポイントの数を取得
  NA=XShade.NumberOfAnchorPoints()
  'アンカーポイントの座標値を取得
  Vec3=GetVec3(NA)
  '-------------------ベジェ曲線でtを指定し、その点の曲率、曲率半径を計算
'    (アンカーポイント番号PtNo〜PtNo+1の部分が対象)
  PtNo=0: tb=0.55
  a=Kyokuritu(Vec3,PtNo,tb)

sub_set01へ戻る