Plasmatic - plasma in motion

Started by bplus, January 21, 2020, 18:44:04

Previous topic - Next topic

bplus


'Plasmatic.bas 2020-01-21 b+ translated back to SmallBASIC after modifications to
'QB64 Plasmatic.bas b+ 2020-01-20 translated and modified from SmallBASIC
'Plasma Magnifico - updated 2015-11-26 for Android modified
'SmallBASIC Library > Graphics 1 > plasmajvsh.bas
'  "This program creates a plasma surface, which looks oily or silky."
'===========================================================================================================
'
'                                   Plasmatic - plasma in motion
'
'===========================================================================================================
const xxmax = 500
const yymax = 500
const xoff = (xmax - xxmax) \ 2
const yoff = (ymax - yymax) \ 2
DIM c(360), p(6), f(6)
at xoff, yoff + yymax + 20 : print "Press spacebar for new color set, esc or q to quit."
label restart
r = RND: g = RND: b = RND: i = 0
FOR n = 1 TO 5
    r1 = r: g1 = g: b1 = b
    repeat: r = RND: UNTIL ABS(r - r1) > .2
    repeat: g = RND: UNTIL ABS(g - g1) > .2
    repeat: b = RND: UNTIL ABS(g - g1) > .2
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m * r) / 18: f2 = (m * g) / 18: f3 = (m * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m + m1 * r) / 18: f2 = (m + m1 * g) / 18: f3 = (m + m1 * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m1 + m * r) / 18: f2 = (m1 + m * g) / 18: f3 = (m1 + m * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m1 * r) / 18: f2 = (m1 * g) / 18: f3 = (m1 * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
NEXT

FOR n = 0 TO 5
    p(n).x = RND * xxmax: p(n).y = RND * yymax: p(n).dx = RND * 2 - 1: p(n).dy = RND * 2 - 1
    f(n) = RND * .1
NEXT

WHILE 1
    k = inkey
    if k = " " then goto restart
    if k = "q" or asc(k) = 27 then end
    FOR i = 0 TO 5
        p(i).x = p(i).x + p(i).dx
        IF p(i).x > xxmax OR p(i).x < 0 THEN p(i).dx = -1*p(i).dx
        p(i).y = p(i).y + p(i).dy
        IF p(i).y > yymax OR p(i).y < 0 THEN p(i).dy = -1*p(i).dy
    NEXT
    FOR y = 0 TO yymax - 1 STEP 3
        FOR x = 0 TO xxmax - 1 STEP 3
            d = 0
            FOR n = 0 TO 5
                dx = x - p(n).x: dy = y - p(n).y
                k = SQR(dx * dx + dy * dy)
                d = d + (SIN(k * f(n)) + 1) / 2
            NEXT n: d = d * 60
            rect x + xoff, y + yoff STEP 3, 3, c(d) filled
        NEXT
    NEXT
    showpage
WEND
1 person likes this

johnno56

Cool... I even like the colours... Nicely done!
May your journey be free of incident.

Live long and prosper.

bplus

Thanks Johnno, here's a clock:

'Plasmatic Digital Clock for SmallBASIC 64 bit b+ 2020-01-21 from
' from Digital Plasmatic Clock.bas  b+ 2020-01-20 QB64
'=======================================================================
'
'                        press spacebar for new coloring set
'
'=======================================================================

CONST xxmax = 850
const yymax = 200
const sq = 25
CONST dat = "1110111000001101111100011111100101110111011101101001001111111111011011"
const xoffset = (xmax - xxmax) \ 2
const yoffset = (ymax - yymax) \ 2
DIM c(360), p(6), f(6)
label restart
r = RND: g = RND: b = RND: i = 0
FOR n = 1 TO 5
    r1 = r: g1 = g: b1 = b
    repeat: r = RND: UNTIL ABS(r - r1) > .2
    repeat: g = RND: UNTIL ABS(g - g1) > .2
    repeat: b = RND: UNTIL ABS(g - g1) > .2
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m * r) / 18: f2 = (m * g) / 18: f3 = (m * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m + m1 * r) / 18: f2 = (m + m1 * g) / 18: f3 = (m + m1 * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m1 + m * r) / 18: f2 = (m1 + m * g) / 18: f3 = (m1 + m * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
    FOR m = 0 TO 17: m1 = 17 - m
        f1 = (m1 * r) / 18: f2 = (m1 * g) / 18: f3 = (m1 * b) / 18: c(i) = rgbf(f1, f2, f3): i = i + 1
    NEXT
NEXT

FOR n = 0 TO 5
    p(n).x = RND * xxmax: p(n).y = RND * xymax: p(n).dx = RND * 2 - 1: p(n).dy = RND * 2 - 1
    f(n) = RND * .1
NEXT

WHILE 1
    k = inkey
    IF k = " " THEN GOTO restart
    if k = "q" or asc(k) = 27 then end
    FOR i = 0 TO 5
        p(i).x = p(i).x + p(i).dx
        IF p(i).x > xxmax OR p(i).x < 0 THEN p(i).dx = -p(i).dx
        p(i).y = p(i).y + p(i).dy
        IF p(i).y > yymax OR p(i).y < 0 THEN p(i).dy = -p(i).dy
    NEXT
    FOR y = 0 TO yymax - 1 STEP 4
        FOR x = 0 TO xxmax - 1 STEP 4
            d = 0
            FOR n = 0 TO 5
                dx = x - p(n).x: dy = y - p(n).y
                k = SQR(dx * dx + dy * dy)
                d = d + (SIN(k * f(n)) + 1) / 2
            NEXT n: d = d * 60
            rect x + xoffset, y + yoffset STEP 4, 4, c(d) filled
        NEXT
    NEXT
    FOR j = 1 TO 3
        IF j = 1 THEN
            klr = 15: offset = -2
        ELSEIF j = 2 THEN
            klr = rgb(34, 34, 34): offset = 2
        ELSE
            klr = rgb(190, 190, 190): offset = 0
        END IF
        FOR n = 1 TO 8 'clock digits over background
            IF MID(TIME, n, 1) = ":" THEN
                rect (n - 1) * 4 * sq + 2 * sq + xoffset + offset, sq + sq + yoffset + offset STEP sq, sq, klr filled
                rect (n - 1) * 4 * sq + 2 * sq + xoffset + offset, sq + 4 * sq + yoffset + offset STEP sq, sq, klr filled
            ELSE
                drawC (n - 1) * 4 * sq + sq + xoffset + offset, sq + yoffset + offset, MID(dat, VAL(MID(TIME, n, 1)) * 7 + 1, 7), klr
            END IF
        NEXT
    NEXT
    showpage
WEND

SUB drawC (x, y, c, cr)
    FOR m = 1 TO 7
        IF VAL(MID(c, m, 1)) THEN
            SELECT CASE m
                CASE 1: rect x, y STEP sq, 3 * sq, cr filled
                CASE 2: rect x, y + 2 * sq STEP sq, 4 * sq, cr filled
                CASE 3: rect x, y STEP 3 * sq, sq , cr filled
                CASE 4: rect x, y + 2 * sq STEP 3 * sq, sq , cr filled
                CASE 5: rect x, y + 5 * sq  STEP 3 * sq, sq , cr filled
                CASE 6: rect x + 2 * sq, y  STEP sq, 3 * sq , cr filled
                CASE 7: rect x + 2 * sq, y + 2 * sq STEP sq, 4 * sq , cr filled
            END SELECT
        END IF
    NEXT
END SUB

1 person likes this

johnno56

Cool... Watching the seconds tick by, with the background moving, is almost hypnotic... I watched it for almost a minute and it didn't effect me effect me effect me
May your journey be free of incident.

Live long and prosper.

chrisws

You won the internet for the day with that one, amazing :)

Aurel [banned]

(Y)

bplus

Thanks guys, we are continuing experiments and learning to get some control over the stuff we call plasma. :)
1 person likes this

bplus

#7
And the results of study are in:

A new updated Plasmatic with (255^3) ^ 2 more color options! Plus color palette creation demystified (I hope) and code more completely documented with comments. This demo contrasts the Traditional high contrast Black and White Plasma palette with the newly updated full color range options for color palette creation for plasma.


'Updated Plasmatic with Full Color Mixing.bas translated to SmallBASIC b+ 2020-01-24
' from QB64 "Color Mixing 4 Plasmatic" ' b+ 2020-01-23
' continued study of what makes Plasmatic tick,
' here the color palette is updated for full range of color mixing options,
' PLUS I think color band creation for palette has been a little demystified,
' PLUS more fully commented code.

' common shared unchanging variables and static arrays
const xxmax = 500 'need smaller screen for interpreted Basic
const yymax = 400
const xoff = (xmax - xxmax) \ 2
const yoff = (ymax - yymax) \ 2
dim c(360), p(6), f(6)

'start program
randomize timer

label restart 'select rgb1 and rgb2 based on mode of color mixing
IF mode = 0 THEN 'new plasma option ANY color for border and ANY color for middle
    r1 = RND * 255: g1 = RND * 255: b1 = RND * 255: r2 = RND * 255: g2 = RND * 255: b2 = RND * 255
ELSE ' traditional high contrast plasma black borders, white centers
    r1 = 0: g1 = 0: b1 = 0: r2 = 255: g2 = 255: b2 = 255 'regular Plasma
END IF

'create 6 x 60 bands of color palette based on coloring mode (rgb1 set and rgb2 set)
FOR i = 0 TO 360
    IF i MOD 60 = 0 THEN r = RND * 255: g = RND * 255: b = RND * 255 'start new color band
    m = i MOD 60 'color bands have width of 60, 4 stages
    if m < 15 then ' 1st stage increase rgb1 towards rgb color in 15 steps
       c(i) = midInk(r1, g1, b1, r, g, b, m / 15)
    elif m < 30 ' 2nd stage increase rgb color towards rgb2 set in 15 steps
       c(i) = midInk(r, g, b, r2, g2, b2, (m - 15) / 15)
    elif m < 45 ' 3rd stage decrease rgb2 color back to rgb color in 15 steps
       c(i) = midInk(r2, g2, b2, r, g, b, (m - 30) / 15)
    elif m < 60 ' 4th and finally decrease rgb back to starting rgb1 set in 15 steps
      c(i) = midInk(r, g, b, r1, g1, b1, (m - 45) / 15)
    END if
NEXT

' behind the scenes variables for motion, weighting and shaping color mixing
FOR n = 0 TO 5
    p(n).x = RND * xxmax: p(n).y = RND * yymax: p(n).dx = RND * 2 - 1: p(n).dy = RND * 2 - 1 'create points
    f(n) = .1 * RND ' create the inverse size and weight factor, large f = small globs but carry weight
NEXT

'screen labeling 3 lines for title above, 2 lines instruction below
cls
at xoff, yoff - 60
if mode = 0 then
  CP yoff - 60, "New Color Options for Plasma:"
else
  CP yoff - 60, "Traditional High Contrast Plasma: Black Borders and White Centers"
end if
CP yoff - 40, "Borders: RGB(" + str(r1 \ 1) + ", " + str(g1 \ 1) + ", " + str(b1 \ 1) + ")"
CP yoff - 20, "Centers: RGB(" + str(r2 \ 1) + ", " + str(g2 \ 1) + ", " + str(b2 \ 1) + ")"
CP yoff + yymax + 10, "Press t to toggle between Traditional and New Color Options Plasma"
CP yoff + yymax + 30, "Press spacebar to get a new color set."

'plasma in motion   
WHILE 1
    'get user input choices
    k = INKEY
    IF k = " " THEN GOTO restart
    if k = "q" or asc(k) = 27 then end
    IF k = "t" THEN mode = 1 - mode: GOTO restart
   
    'move points
    FOR i = 0 TO 5
        p(i).x = p(i).x + p(i).dx
        IF p(i).x > xxmax OR p(i).x < 0 THEN p(i).dx = -p(i).dx
        p(i).y = p(i).y + p(i).dy
        IF p(i).y > yymax OR p(i).y < 0 THEN p(i).dy = -p(i).dy
    NEXT

    'calculate each screen x, y color based on distance to 6 points
    FOR y = 0 TO yymax - 1 STEP 3
        FOR x = 0 TO xxmax - 1 STEP 3
            d = 0
            FOR n = 0 TO 5
                dx = x - p(n).x: dy = y - p(n).y
                k = SQR(dx * dx + dy * dy)
                d = d + (SIN(k * f(n)) + 1) / 2
            NEXT n: d = d * 60
            rect x + xoff, y + yoff STEP 3, 3, c(d) filled
        NEXT
    NEXT
    showpage
WEND

'report the color number between rgb1 and rgb2 at fraction fr from rgb1
func midInk(r1, g1, b1, r2, g2, b2, fr)
  midInk = rgb(r1+(r2-r1)*fr, g1+(g2-g1)*fr, b1+(b2-b1)*fr)
end

'Center Print at topYpixel down from top
sub CP(topYpixel, stringg)
  at (xmax - txtw(stringg))/2, topYpixel :print stringg
end sub



1 person likes this

Aurel [banned]

Markl...why this program work very slowly somehow?
(Y)

bplus

#9
Quote from: Aurel on January 31, 2020, 09:08:51
Markl...why this program work very slowly somehow?
I mentioned it was meant for SmallBASIC 64 bit, perhaps I should have emphasized it:

Plasmatic stuff meant for SmallBASIC 64 BIT  :))

I look forward to day someone else posts code for SmallBASIC here at this forum.

Anybody know the Moody Blues song, Watching and Waiting?
1 person likes this

Aurel [banned]

Wait a moment ...dude
I tried both ...32bit and 64 bit versions on both
win7 . 32/64 bit
win10 32/64 systems
yes I have all of them
and still work slowly...soo please without patronizing .. ;)
(Y)

Aurel [banned]

(Y)

bplus

#12
Well that's funny, I checked out the code posted running it in SmallBASIC version 12.17 64 bit and it was not recognizing key presses??? The code runs slowish but not bad for interpreter.

So I check it out in version 12.13, yep! works fine with key presses.

So I check it out in new editor, there it runs slow as the dickens but key presses are recognized.

So pick your poison ;-)) https://www.youtube.com/watch?v=g-myiQRFaN0
1 person likes this

chrisws

Quote from: bplus on February 01, 2020, 00:21:56
Well that's funny, I checked out the code posted running it in SmallBASIC version 12.17 64 bit and it was not recognizing key presses??? The code runs slowish but not bad for interpreter.
Oh snap it works fine in the linux version :)  I will fix and push another update.
I will see what can be done to make the FLTK version a bit faster.

https://youtu.be/NhFXjzRRv4w

(stick around for the epic guitar solo towards the end)




bplus

Thanks Chris, great song yeah nice guitar hope you can do something with Editor speed but I'm not worried.

https://www.youtube.com/watch?v=_03uXQiz6eY

stick around for whole album ;-))
1 person likes this