|
lark12_longさんへのお返事です。
!動くように補修しただけで、ごめんください。
!十進BASICの書式になっています。
!--------------------------------------------------------------
!lark12_long
!
! 反射.bas
!
! 各球の質量は1、接触摩擦はなし
!
! H26-07-10
!
!
LET width=641 !1260
LET HEIGHT=641 !640
SET BITMAP SIZE width, HEIGHT
!
LET left=0
LET right=width
LET bottom=0
LET top=HEIGHT
!
!左端,右端,下端,上端
SET WINDOW left,right, bottom,top
!
!描画エリアの背景色着色範囲設定
SET AREA COLOR 1 !黒
PLOT AREA : left,bottom; left,top; right,top; right,bottom
!--------------------------------------------------------------
LET xbase=100 !画面表示x起点
LET ybase=100 !画面表示y起点
!
RANDOMIZE
!
LET n=8 !球の数
OPTION BASE 0
DIM x(n),y(n), en(6,6),xb(n),yb(n) !球のx、y座標
DIM vx(n),vy(n) !球のx、y成分速度
!
LET wb=400 !枠の幅
LET hb=400 !枠の高さ
!
LET r=30 !球の半径
LET dt=0.2 !サンプリングタイム
!
!初期位置設定
LET i=0
DO
LET u=INT(6*RND)
LET v=INT(6*RND)
IF en(u,v)=0 THEN
LET x(i)=r*(1.15+2.2*u)
LET y(i)=r*(1.15+2.2*v)
LET en(u,v)=1
LET i=i+1
END IF
LOOP UNTIL n<=i
!
!初期速度設定
FOR i=0 TO n-1
LET vx(i)=(RND-0.5)*20*2
LET vy(i)=(RND-0.5)*20*2
NEXT i
!
!位置の更新
DO
FOR i=0 TO n-1
LET xb(i)=x(i)
LET yb(i)=y(i)
LET x(i)=x(i)+vx(i)*dt
LET y(i)=y(i)+vy(i)*dt
!
!枠との衝突処理
IF x(i)< 0+r THEN !左の枠に衝突
LET vx(i)=-vx(i)
LET x(i)=r
END IF
IF x(i)> wb-r THEN
LET vx(i)=-vx(i) !右の枠に衝突
LET x(i)=wb-r
END IF
IF y(i)< 0+r THEN !下の枠に衝突
LET vy(i)=-vy(i)
LET y(i)=r
END IF
IF y(i)> hb-r THEN !上の枠に衝突
LET vy(i)=-vy(i)
LET y(i)=hb-r
END IF
!
!球同士の衝突
CALL cal1
NEXT i
SET DRAW mode hidden
!
!画面消去
!line(0,0)-(width,height),1,bf
SET AREA COLOR 1
PLOT AREA :0,0; width,0; width,HEIGHT; 0,HEIGHT
!
!球の表示
FOR i=0 TO n-1
!col=mod(i,6)+2
!circle(xbase+x(i),ybase+y(i)),r,col,,,,f
SET AREA COLOR MOD(i,6)+2
DRAW disk WITH SCALE(r)*SHIFT(xbase+x(i),ybase+y(i))
NEXT i
!
!枠の表示
SET LINE width 4
!line(xbase,ybase)-(xbase+wb,ybase+hb),6,b
SET LINE COLOR 6
PLOT LINES: xbase,ybase; xbase+wb,ybase; xbase+wb,ybase+hb; xbase,ybase+hb; xbase,ybase
!
SET DRAW mode explicit
WAIT DELAY .01
mouse poll mox,moy,mlb,mrb
LOOP UNTIL 0< mrb
!----------------------------------
! 球同士の衝突( 球表面の摩擦係数0)
!----------------------------------
SUB cal1
IF n>=2 THEN
FOR j=0 TO n-1
IF i<>j THEN
LET lb=SQR( (xb(i)-xb(j))^2+(yb(i)-yb(j))^2) !過去の球(i)(j)間距離
LET l=SQR( ( x(i) -x(j))^2+( y(i) -y(j))^2) !現在の球(i)(j)間距離
IF l<=2*r AND l< lb THEN !距離と、その増減で、衝突判定
LET vi=SQR( vx(i)^2+vy(i)^2 ) !球(i)の速度の絶対値
LET vj=SQR( vx(j)^2+vy(j)^2 ) !球(j)の速度の絶対値
LET cosnx=(x(j)-x(i))/l !球(i)中心を始点とする接触点法線ベクトルの角度 nx のcos 値
LET sinnx=(y(j)-y(i))/l !球(i)中心を始点とする接触点法線ベクトルの角度 nx のsin 値
!--
LET cosix=vx(i)/vi !球(i)速度ベクトルの角度 ix の cos 値
LET sinix=vy(i)/vi !球(i)速度ベクトルの角度 ix の sin 値
LET cosjx=vx(j)/vj !球(j)速度ベクトルの角度 jx の cos 値
LET sinjx=vy(j)/vj !球(j)速度ベクトルの角度 jx の sin 値
LET cos_in=cosix*cosnx+sinix*sinnx !cos(ix-nx)
LET sin_in=sinix*cosnx-cosix*sinnx !sin(ix-nx)
LET cos_jn=cosjx*cosnx+sinjx*sinnx !cos(jx-nx)
LET sin_jn=sinjx*cosnx-cosjx*sinnx !sin(jx-nx)
!--
LET v_in=vi*cos_in !vi*cos(ix-nx) 接触点法線方向の、球(i)速度ベクトル
LET v_jn=vj*cos_jn !vj*cos(jx-nx) 接触点法線方向の、球(j)速度ベクトル
swap v_in, v_jn !接触点法線方向の、球(i)(j)速度ベクトル入替り
LET v_it=vi*sin_in !vi*sin(ix-nx) 接触点接線方向の、球(i)速度ベクトル
LET v_jt=vj*sin_jn !vj*sin(jx-nx) 接触点接線方向の、球(j)速度ベクトル
!--
LET vx(i)= v_in*cosnx -v_it*sinnx !球(i)速度ベクトルの x 成分速度
LET vy(i)= v_in*sinnx +v_it*cosnx !球(i)速度ベクトルの y 成分速度
LET vx(j)= v_jn*cosnx -v_jt*sinnx !球(j)速度ベクトルの x 成分速度
LET vy(j)= v_jn*sinnx +v_jt*cosnx !球(j)速度ベクトルの y 成分速度
END IF
END IF
NEXT j
END IF
END SUB
END
|
|