OBAQで振り子

OBAQで振り子を作るサンプル

OBAQで振り子を作るサンプル

#include "obaq.as"
;
#define ctype DotProduct2D(%1,%2,%3,%4) (double(%1)*(%3) + double(%2)*(%4))
qreset ; OBAQ
;
qaddpoly mybox, 4, 80,30,0, 3.0,3.0
qaddpoly myball, 20, 80,60,0, 3.0,3.0
;qgravity 0,0
qtype mybox, type_bind
qinertia myball, 1.0
qgetpos mybox, px,py,pr
*main
redraw 0 ;
color 0,0,0:boxf ;
qexec ; OBAQ
;
stick key,15 ;
if key&128 : end ; [ESC]
if key&1 : px -= 0.5
if key&4 : px += 0.5
if key&2 : py -= 0.5
if key&8 : py += 0.5
;
qpos mybox, px,py,0
;
qgetpos mybox, hx0, hy0, hr0
qgetpos myball, hx1, hy1, hr1
qgetspeed myball, vx,vy,vr
;ballbox
dx = hx0 - hx1
dy = hy0 - hy1
;cos
dd = sqrt(dx*dx + dy*dy)
vv = sqrt(vx*vx + vy*vy)
c = DotProduct2D( vx, vy, -dx, -dy ) / vv / dd
;
ix = dx / dd
iy = dy / dd
;
v = vv * c
bvx = ix * -v
bvy = iy * -v
cv = 0.1
cvx = 0.0
cvy = 0.0
if bvx>0 {
cvx = -cv
bvx -= cv
if bvx<0 : cvx = 0.0
} else {
if bvx<0 {
cvx = cv
bvx += cv
if bvx>0 : cvx = 0.0
}
}
if bvy>0 {
cvy = -cv
bvy -= cv
if bvy<0 : cvy = 0.0
} else {
if bvy<0 {
cvy = cv
bvy += cv
if bvy>0 : cvy = 0.0
}
}
qspeed myball, cvx, cvy, 0.0
;
;
dl = sqrt(dx*dx + dy*dy) - 10.0
vx = ix * dl / 4
vy = iy * dl / 4
qspeed myball, vx, vy
/*
pos 50,50
color 255,255,255
mes ""+dy
mes ""+vy
mes vv
mes c
mes "cvx = " + cvx
mes "cvy = " + cvy
*/
qdraw ;
redraw 1 ;
await 12 ;
goto *main
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX