連続引き摺リンク

 投稿者:lark12_long  投稿日:2014年 4月18日(金)07時39分56秒
  '
'  連続引き摺リンク.bas
'  (芋ずるリンク)
'
' 平面上に配置された、アームと関節にて接続される、リンクの端を、
'  引き摺った時の様子となってると思うのですが
'  如何でしょうか、ご意見等お聞かせください
'  平面とリンク、関節共に摩擦は無いものとします
'
'  H26-04-15   lark12_long
'
width=1260
height=640
set bitmap size width,height
reft=0
right=width*1.5
bottom=0
top=height*1.5
set window left,right,bottom,top

'---------------------------------------------------------------------------
xbase=100
ybase=200

n=10              'リンク関節数
rn=10             '関節の半径

dim x(n)          '関節のx座標
dim y(n)          '関節のx座標
dim r(n)          '各アームの長さ
dim q(n)          '各関節の角度


  '各アームの長さ
  for i=0 to n-1
    r(i)=100*(rnd+0.5)
  next i

  '各関節の角度
  for i=1 to n-1
    q(i)=rad(30)
  next i

  '各関節の初期位置計算
  px=0                        '原点(0,0)
  py=0
  qq=0                        'Σθ

  for i=0 to n-1              'n個の関節
     qq=qq+q(i)
     x(i)=px+r(i)*cos(qq)     'x=l1*cos(q1)+l2*cos(q1+q2)+l3*cos(q1+q2+q3)+....
     y(i)=py+r(i)*sin(qq)     'y=l1*sin(q1)+l2*sin(q1+q2)+l3*sin(q1+q2+q3)+...
     px=x(i)                  'px更新
     py=y(i)                  'py更新
  next i

'繰り返し計算
do
    call cal        'リンクの動作シミュレーション計算
    call draw       '状態描画
loop

'---------------------------------------------------------------------------

'リンクの動作シミュレーション計算
sub cal

  '端点の移動
   mouse poll xm,ym,left,right
   x(n-1)=xm-xbase
   y(n-1)=ym-ybase
   if right=1 then stop       'マウス右クリックで停止

   '連続アームの移動
   for i=1 to n-1
     l=sqr( (x(i)-x(i-1) )^2+(y(i)-y(i-1) )^2 )  '関節間アームの現在長さ
     cosc=(x(i)-x(i-1) )/l                       '現在のアームとx軸との余弦値
     sinc=(y(i)-y(i-1) )/l                       '現在のアームとy軸との正弦値
     x(i-1)=x(i)-r(i-1)*cosc  'x(i-1)をx(i)と真のアーム長さr(i-1)と余弦値を使って算出
     y(i-1)=y(i)-r(i-1)*sinc  'y(i-1)をy(i)と真のアーム長さr(i-1)と正弦値を使って算出
   next i

end sub
'---------------------------------------------------------------------------
'動作描画
sub draw
  set draw mode hidden
  set line width 4
  line(0,0)-(2000,960),1,bf    '画面クリヤ

  'アーム、関節表示更新
  for i=0 to n-2
   line(x(i)+xbase,y(i)+ybase)-(x(i+1)+xbase,y(i+1)+ybase),4
   circle (x(i)+xbase,y(i)+ybase),10,4,,,,f
  next i

  '移動端点の表示更新
  circle (x(n-1)+xbase,y(n-1)+ybase),10,5,,,,f

  set draw mode explicit

end sub
'---------------------------------------------------------------------------
 

Re: 連続引き摺リンク

 投稿者:山中和義  投稿日:2014年 4月19日(土)10時05分25秒
  > No.3362[元記事へ]

lark12_longさんへのお返事です。

> 連続引き摺リンク.bas
> 如何でしょうか、ご意見等お聞かせください

xbase,ybaseの意味が解りません。
平面nリンクなら、根元と考えられますが、
今回はへびなどが動く場合ですので、この場合は何でしょうか。

また、関節を扱っているのに、関節の角度Q(k)での制御が見えません。

 

Re: 連続引き摺リンク

 投稿者:lark12_long  投稿日:2014年 4月20日(日)07時37分17秒
  Re: 連続引き摺リンク

山中和義 様

ご意見ありがとうございます

xbase,ybaseは、表示するときの、画面上の基点を意味します
但し、本プログラムの場合、xbasse=0,ybase=0で
特に問題は無いので不要と言うことになりますね

>また、関節を扱っているのに、
>関節の角度Q(k)での制御が見えません。

x(i),y(i)の位置が変わったことにより、
x(i),y(i)とx(i-1),y(i-1)との距離は、真の長さr(i-1)より、
lに変わります

次にlに変わったことにより、
x(i),y(i)とx(i-1),y(i-1)との成す角度は変わり、
その余弦値はcosc、正弦値はsincとなります

角度が変わったので、x(i-1),y(i-1)の位置を、
x(i),y(i)を基点として、x(i-1),y(i-1)を、
x(i-1)=x(i)-r(i-1)*cosc
y(i-1)=y(i)-r(i-1)*sinc
と修正します

こうすることにより、l->r(i-1)に漸近し、角度cosc,sincも
cosc=(x(i)-x(i-1) )/r(i-1)
sinc=(y(i)-y(i-1) )/r(i-1)
に漸近します

動作としては、以上ですが、
これが物理現象と一致してるかどかは、理解できていません

lark12_long
 

戻る