HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0819
physicslab初速度で設定して飛ばしたのを跳ね返るようにするにはどうすればいいでしょうか?4解決


physicslab

リンク

2011/8/19(Fri) 17:37:42|NO.40694

;物理シミュレーター
;<仕様> ;x軸は右を正に、y軸は上を正にとっている ;時間はtの増加分の値を微調整してあわせたもの #packopt name "物理シミュレーター" px=0 : py=0 ;画面上の座標 scl=1 ;スケール(1のとき 10ドット=1メートル、10のとき 1ドット=1メートル) sclzm=0 ;スケール拡大フラグ Wplus=0 ;重力合成フラグ ;物理量 t=double (0) : tm=double (0) ;時間 x=double (0) : y=double (0) : x0=double (0) : y0=double (0) ;位置 m=double (0) ;質量 v=double (0) : v0=double (0) ;速度 vx=double (0) : v0x=double (0) : vy=double (0) : v0y=double (0) a=double (0) : ax=double (0) : ay=double (0) : g=double (9.8) ;加速度 F=double (0) : Fx=double (0) : Fy=double (0) : W=double (0) ;力 F1=double (0) : Fx1=double (0) : Fy1=double (0) theta=double (0) : vtheta=double (0) : Ftheta=double (0) ;平面角 title "物理シミュレーター" color 0,0,0 boxf color 255,255,255 objsize 128 mes "質量[kg]" ;0のままだと1を自動的に代入 mes "※0のままだと自動的に1になる" input m mes "初期x座標[m]" input x0 mes "初期y座標[m]" input y0 mes "初速度[m/s]" input v0 mes "推進力[N]" input F1 mes "水平方向となす角(反時計回り)[°]" input theta chkbox "スケール拡大",sclzm chkbox "重力OFF",goff ;重力OFFフラグ button "start",*hajime stop *hajime cls 4 if m=0 :m=double (1) if sclzm=1 :scl=10 if goff=1 :g=double (0) W=m*g ;重力(公式) v0x=v0*cos (deg2rad (theta)) :v0y=v0*sin (deg2rad (theta)) repeat gosub *Wgosei ;計算 ax=Fx/m :ay=Fy/m ;運動方程式(公式) a=F/m ;運動方程式(公式) x=v0x*(t-tm)+0.5*ax*((t-tm)*(t-tm))+x0 ;等加速度直線運動(公式) y=v0y*(t-tm)+0.5*ay*((t-tm)*(t-tm))+y0 ;等加速度直線運動(公式) px=int (x*(10/scl)) py=int (-y*(10/scl)+(479-10/scl)) vx=v0x+ax*(t-tm) ;等加速度直線運動(公式) vy=v0y+ay*(t-tm) ;等加速度直線運動(公式) if px<0 :gosub *xhane if px>630 :gosub *xhane if py>469 :gosub *yhane if py<0 :gosub *yhane v=sqrt (vx*vx+vy*vy) if vx>0 :if vy>=0 :vtheta=rad2deg (atan (vy,vx)) if vx<=0 :if vy>0 :vtheta=double (180)-rad2deg (atan (vy,-vx)) if vx<0 :if vy<=0 :vtheta=rad2deg (atan (-vy,-vx))+180 if vx>=0 :if vy<0 :vtheta=double (360)-rad2deg (atan (-vy,vx)) if v=0 :vtheta=double (0) redraw 0 ;描画処理 color 0,0,0 boxf color 255,255,255 pos 0,0 mes "t="+t+"s" mes "x="+x+"m" mes "y="+y+"m" mes "v="+v+"m/s" mes "θ="+vtheta+"°" mes "Fθ="+Ftheta+"°" mes "F="+F+"N" mes "a="+a+"m/s^2" color 255,0,0 boxf px,py,px+10/scl,py+10/scl redraw 1 ;処理完了 await 1 t+=0.01553 loop *Wgosei Fx1=F1*cos (deg2rad (theta)) :Fy1=F1*sin (deg2rad (theta)) Fx=Fx1 :Fy=Fy1-W :if py=469 :Fy+=W F=sqrt (Fx*Fx+Fy*Fy) if Fx>0 :if Fy>=0 :Ftheta=rad2deg (atan (Fy,Fx)) if Fx<=0 :if Fy>0 :Ftheta=double (180)-rad2deg (atan (Fy,-Fx)) if Fx<0 :if Fy<=0 :Ftheta=rad2deg (atan (-Fy,-Fx))+180 if Fx>=0 :if Fy<0 :Ftheta=double (360)-rad2deg (atan (-Fy,Fx)) if F=0 :Ftheta=double (0) return *xhane tm=t v0x=-vx x0=x return *yhane tm=t v0y=-vy y0=y return



この記事に返信する


who

リンク

2011/8/19(Fri) 18:38:58|NO.40696

いろいろ計算してるけどやりたいことはこういうことだと思いました。



buffer 1 color 1,0,0 boxf screen 0 px=0.0 py=100.0 vx=5.0 vy=-5.0 color 0,0,0 boxf *main redraw 1 await 20 redraw 0 gmode 3,,,10 pos 0,0 gcopy 1,0,0,640,480 if px<0 or px>640{vx*=-1.0} if py<0 or py>480{vy*=-1.0} vy+=0.1//重力w px+=vx py+=vy pos px,py color 255,255,255 mes "丸" goto*main



physicslab

リンク

2011/8/19(Fri) 19:25:25|NO.40697

まさにそれです!でもどうしたらそうなるのかいまいちわからないんですが。



who

リンク

2011/8/19(Fri) 19:46:26|NO.40698

単に左右の壁に当たったらX方向の速度を逆にし、
上下の壁に当たったら同じくY方向の速度を逆にしているだけです。



physicslab

リンク

2011/8/19(Fri) 23:19:43|NO.40703

色々いじってたら完成しました。whoさんありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.