OBAQで「ニュートンのゆりかご」

調整が良くないのか長く続きません。

調整が良くないのか長く続きません。

;
; OBAQ
;
;
; 調
;
#include "obaq.as"
;
#define global ctype DotProduct2D(%1,%2,%3,%4) (double(%1)*(%3) + double(%2)*(%4))
#module
; pendulum
; num : ID
; x,y :
; distance :
; const_k :
; damping :
#deffunc qAttach int p_num, double p_x, double p_y, double p_distance, double p_const_k, double p_damping
qgetreq@ rpr, REQ_PHYSICS_RATE ; 1
;
qgetpos@ p_num, hx1, hy1, hr1
qgetspeed@ p_num, vx, vy, vr
qgetweight@ p_num, weiht, mt
;
dx = p_x - hx1
dy = p_y - hy1
;cos -(dx,dy)(vx,vy)cos
dd = sqrt(dx*dx + dy*dy)
vv = sqrt(vx*vx + vy*vy)
if (dd=0.0) | (vv=0.0) {
c = 1.0
} else {
c = DotProduct2D( vx, vy, -dx, -dy ) / vv / dd
}
;
ix = dx / dd
iy = dy / dd
;
v = vv * c
bvx = ix * -v
bvy = iy * -v
cvx = 0.0
cvy = 0.0
if bvx>0 {
cvx = -p_damping
if (bvx - p_damping)<0 : cvx = -bvx
} else {
if bvx<0 {
cvx = p_damping
if (bvx + p_damping)>0 : cvx = -bvx
}
}
if bvy>0 {
cvy = -p_damping
if (bvy - p_damping)<0 : cvy = -bvy
} else {
if bvy<0 {
cvy = p_damping
if (bvy + p_damping)>0 : cvy = -bvy
}
}
;
;
dl = sqrt(dx*dx + dy*dy) - p_distance
; a = x * k / m
vx = ix * dl * p_const_k / weiht
vy = iy * dl * p_const_k / weiht
vx *= rpr ;
vy *= rpr
qspeed@ p_num, vx + cvx, vy + cvy, 0.0
return
#global
qreset ; OBAQ
;
dim myball, 5
repeat 5
qaddpoly myball(cnt), 100, 60.0+10.0*cnt, 60.0, 0, 5.0,5.0, 0
qweight myball(cnt), 6.0
qdamper myball(cnt), 0.0, 0.0
qinertia myball(cnt), 1.0
qtype myball(cnt), 0x100
loop
;----------
;
;----------
;
;
lg = 30.0
;
;
;k = 0.01
k = 0.4
;
;
;cv = 0.0001
cv = 0.2
;----------
;
;----------
qgravity 0, 0.005
;
qgetpos mybox, px,py,pr
*main
redraw 0 ;
color 0,0,0:boxf ;
qexec ; OBAQ
;
stick key
if key&16 : qspeed myball(0), -0.5
color 255,255,255
pos 50,50
mes ""
;----------
;
;----------
repeat 5
qAttach myball(cnt), 60.0+10.0*cnt, 30.0, lg, k, cv
loop
;
color 255,255,255
repeat 5
qgetpos myball(cnt), px,py,pa
qcnvaxis lpx, lpy, px, py, 0
x = 60.0+10.0*cnt
y = 30.0
qcnvaxis lx, ly, x, y, 0
line lx, ly, lpx, lpy
loop
qdraw ;
redraw 1 ;
await 12 ;
goto *main
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX