Morph Curve on Plasma



' Morph Curve on Plasma.bas SmallBASIC 0.12.8 [B+=MGA] 2017-04-11
'from SpecBAS version Paul Dunn Dec 2, 2015
'https://www.youtube.com/watch?v=j2rmBRLEVms
' mods draw lines segments with drawpoly, add plasma, play with numbers

pts = 1200 : interps = 30
dim p(pts + 1, 1), q(pts + 1, 1), s(pts + 1, 1), i(interps)
l = 0 : cx = xmax/2 : cy = ymax/2 : sc = cy*.5 : st = 2*pi/pts
for
n = 1 to interps
i(n) = sin(n/interps*(pi/2))
next
while 1
resetPlasma
n = int(rnd*75) + 2 : m = int(rnd*500) - 250 : c = 0
for t = 0 to 2*pi step st
q(c, 0) = cx + sc*(cos(t) + cos(n*t)/2 + sin(m*t)/3)
q(c, 1) = cy + sc*(sin(t) + sin(n*t)/2 + cos(m*t)/3)
setPlasma
if t > 0 then pline lastx, lasty, q(c, 0), q(c, 1), 10
lastx = q(c, 0) : lasty = q(c, 1)
c += 1
next
q(c, 0) = q(0, 0) : q(c, 1) = q(0, 1)
if l = 0 then
'drawpoly q
l += 1
showpage
'delay 2000
else
for t = 1 to interps
cls
for n = 0 to pts
s(n, 0) = q(n, 0) * i(t) + p(n, 0) *(1 - i(t))
s(n, 1) = q(n, 1) * i(t) + p(n, 1) *(1 - i(t))
setPlasma
if n > 0 then pline lastx, lasty, s(n, 0), s(n, 1), 10
lastx = s(n, 0) : lasty = s(n, 1)
next
s(n, 0) = s(0, 0)
s(n, 1) = s(0, 1)
'drawpoly s
showpage
'delay 40
next
fi
p = q
'drawpoly p
showpage
delay 3000
wend

'fast thick line!!!
sub pline(x1, y1, x2, y2, thick) 'this draws a little rectangle
local arr, r, dx, dy, perpA1, perpA2
dim arr()
r = thick/2
dx = x2 - x1
dy = y2 - y1
perpA1 = atan2(dy, dx) + pi/2
perpA2 = perpA1 - pi
arr << x1 + r * cos(perpA1) 'corner 1
arr << y1 + r * sin(perpA1)
arr << x2 + r * cos(perpA1) 'corner 2
arr << y2 + r * sin(perpA1)
arr << x2 + r * cos(perpA2) 'corner 3
arr << y2 + r * sin(perpA2)
arr << x1 + r * cos(perpA2) 'corner 4
arr << y1 + r * sin(perpA2)
arr << x1 + r * cos(perpA1) 'back to first corner
arr << y1 + r * sin(perpA1)
drawpoly arr 'filled 'filled or not ?
end

sub
resetPlasma() 'all globals
plasmaR = rnd ^ 2 : plasmaG = rnd ^ 2 : plasmaB = rnd ^ 2 : plasmaN = 0
end

sub
setPlasma() 'all globals
plasmaN += .37
color rgb(120+84*sin(plasmaR*plasmaN), 120+84*sin(plasmaG*plasmaN), 120+84*sin(plasmaB*plasmaN))
end



Also nice is drawpoly arr filled with thinner lines and more pts.

It is just B&W with normal line thickness but it's fun to watch a systematic increment of main variables and then random curves.

' Morph Curve.bas SmallBASIC 0.12.8 [B+=MGA] 2017-04-11
'from SpecBAS version Paul Dunn Dec 2, 2015
'https://www.youtube.com/watch?v=j2rmBRLEVms

'prep
def rand(lo, hi) = (rnd * (hi - lo + 1)) \ 1 + lo
pts = 12000 : interps = 20
dim p(pts + 1, 1), q(pts + 1, 1), s(pts + 1, 1), i(interps)
l = 0 : cx = xmax/2 : cy = ymax/2 : sc = cy*.5 : st = 2*pi/pts
for
n = 1 to interps
i(n) = sin(n/interps*(pi/2))
next

'main
n = 0 : m = 0 : rmode = 0
while 1
c = 0
if rmode = 0 then
n += 1
if n > 12 then n = 0 : m = m + 1
if m > 12 then rmode = 1
end if
if rmode then n = rand(1, 75) : m = rand(-250, 250)
for t = 0 to 2*pi step st
q(c, 0) = cx + sc*(cos(t) + cos(n*t)/2 + sin(m*t)/3)
q(c, 1) = cy + sc*(sin(t) + sin(n*t)/2 + cos(m*t)/3)
c += 1
next
q(c, 0) = q(0, 0) : q(c, 1) = q(0, 1)
cls
? "m = ";m;" n = ";n
if l = 0 then
drawpoly q : l += 1
showpage
delay 10
else
for t = 1 to interps
cls
? "m = ";m;" n = ";n
for nn = 0 to pts
s(nn, 0) = q(nn, 0) * i(t) + p(nn, 0) *(1 - i(t))
s(nn, 1) = q(nn, 1) * i(t) + p(nn, 1) *(1 - i(t))
next
s(nn, 0) = s(0, 0)
s(nn, 1) = s(0, 1)
drawpoly s
showpage
delay 10
next
fi
showpage
delay 100
p = q
wend