_TITLE "trivial 2D explosions B+ mod 2" 'STxAxTIC mod B+ 2019-02-03 ' 2019-02-03 use a bg& for background instead of redraws each loop, that should cool down CPU
' rounder rocks, more fiddle with numbers
np = 500 'number of particles
nr = 3500 'number of rocks
ry
(i
) = .5 * ymax
+ RND * .25 * ymax
+ rx
(i
) * .09 rw(i) = ry(i) * ry(i) * .00015
rh(i) = .3 * rw(i)
rc
(i
) = _RGB32(r
, .45 * r
, .2 * r
) ry
(i
) = .5 * ymax
+ RND * .75 * ymax
+ rx
(i
) * .09 rw(i) = ry(i) * ry(i) * .00015
rh(i) = .3 * rw(i)
rc
(i
) = _RGB32(r
, .45 * r
, .2 * r
)
no = 80 'number of rock bounce reflectors
DIM ox
(no
), oy
(no
), ow
(no
), oh
(no
) oy
(i
) = .5 * ymax
+ RND * .75 * ymax
+ ox
(i
) * .09 ow(i) = oy(i) * oy(i) * .00015
oh(i) = .3 * ow(i)
wallcol
= _RGB32(200, 100, 50)g = 95
xdamp = .07
ydamp = .07
exploderadius = 10
'draw background
'sky
LINE (0, y
)-(xmax
, y
), _RGB32(.1 * y
, .1 * y
, .15 * y
), BF
'rocks
EllipseFill rx(i), ry(i), rw(i), rh(i), rc(i)
'LINE (rx(i), ry(i))-STEP(rw(i), rh(i)), rc(i), BF
'Draw obstacles randomly
EllipseFill ox(i), oy(i), ow(i), oh(i), wallcol
'LINE (ox(i), oy(i))-STEP(ow(i), oh(i)), wallcol, BF
start:
iterations = 0
'Toggle for random starting position.
ang1
= RND * 2 * 3.141592653589793#
ang2
= RND * 2 * 3.141592653589793#
x
(i
) = xshift
+ RND * exploderadius
* COS(ang1
) y
(i
) = yshift
+ RND * exploderadius
* SIN(ang1
) v0x
(i
) = speed
* COS(ang2
) v0y
(i
) = speed
* SIN(ang2
) dotcol:
IF POINT(x
(i
), y
(i
)) = wallcol
OR x
(i
) < 0 OR x
(i
) > xmax
OR y
(i
) < 0 OR y
(i
) > ymax
THEN i
= i
- 1 dv
= SQR((v0x
(i
)) ^ 2 + (v0y
(i
)) ^ 2)dt = .995 / vmax
iterations = iterations + 1
smax = 0
xold(i) = x(i)
yold(i) = y(i)
v0x(i) = v0x(i) + .1 * dt
v0y(i) = v0y(i) + g * dt + .2 'more gravity
xtmp = x(i) + v0x(i) * dt
ytmp = y(i) + v0y(i) * dt
IF POINT(xtmp
, yold
(i
)) = wallcol
THEN v0x
(i
) = v0x
(i
) * -1 * xdamp
IF POINT(xold
(i
), ytmp
) = wallcol
THEN v0y
(i
) = v0y
(i
) * -1 * ydamp
x(i) = x(i) + v0x(i) * dt
y(i) = y(i) + v0y(i) * dt
EllipseFill x(i), y(i), 3, 3, col(i)
ds
= SQR((y
(i
) - yold
(i
)) ^ 2 + (x
(i
) - xold
(i
)) ^ 2) IF smax
> .95 THEN dt
= dt
* (1 - .01) IF smax
< .9 THEN dt
= dt
* (1 + .01)
' with Steve's EllipseFill, who needs CircleFill?
a = 2 * rx * rx
b = 2 * ry * ry
x = rx
xx = ry * ry * (1 - rx - rx)
yy = rx * rx
sx = b * rx
LINE (cx
- x
, cy
- y
)-(cx
+ x
, cy
- y
), c
, BF
IF y
<> 0 THEN LINE (cx
- x
, cy
+ y
)-(cx
+ x
, cy
+ y
), c
, BF
y = y + 1
sy = sy + a
e = e + yy
yy = yy + a
x = x - 1
sx = sx - b
e = e + xx
xx = xx + b
x = 0
y = ry
xx = rx * ry
yy = rx * rx * (1 - ry - ry)
e = 0
sx = 0
sy = a * ry
LINE (cx
- x
, cy
- y
)-(cx
+ x
, cy
- y
), c
, BF
LINE (cx
- x
, cy
+ y
)-(cx
+ x
, cy
+ y
), c
, BF
x = x + 1
sx = sx + b
e = e + xx
xx = xx + b
y = y - 1
sy = sy - a
e = e + yy
yy = yy + a