' ****** START INCLUDE Rgba Core:::RgbaBox(x1%, y1%, x2%, y2%, c&, a%b) ******
DIM r0%, g0%, b0%, a0%, r1%, g1%, b1%, a1%
DIM RgbaAreaBorder& = &h1

SUB SetRgb0(x#,y#)
    DIM c& = (POINT(x#,y#))
    r0% = _RED(c&)
    g0% = _GREEN(c&)
    b0% = _BLUE(c&)
END SUB

SUB SetRgb1(c&,a%b)
    r1% = _RED(c&)
    g1% = _GREEN(c&)
    b1% = _BLUE(c&)
    a0% = 255 - a%b
    a1% = a%b
END SUB

SUB RgbaCorePset(x#,y#)
    PSET(x#,y#), _RGB( [{ (r0%*a0%)+(r1%*a1%) }/255], [{ (g0%*a0%)+(g1%*a1%) }/255], [{ (b0%*a0%)+(b1%*a1%) }/255] )
END SUB



SUB RgbaBox(x1#, y1#, x2#, y2#, c&, a%b)
    DIM x#, y# : SetRgb1(c&, a%b)
    FOR x# = FIX(MAX(MIN(x1#,x2#),0)) TO FIX(MIN(MAX(x1#,x2#), xMAX))
      FOR y#  = FIX(MAX(MIN(y1#,y2#),0)) TO FIX(MIN(MAX(y1#,y2#), yMAX))
        SetRgb0(x#,y#) : RgbaCorePset(x#,y#)
    NEXT y# : NEXT x#
END SUB
'  ****** END INCLUDE Rgba Core:::RgbaBox(x1%, y1%, x2%, y2%, c&, a%b) ******

' 🟠 PROGRAM DESCRIPTION   

' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2023.12.16.16.28]) on 2024.03.17 at 02:04 (Coordinated Universal Time)
' Program by Charlie Veniot
' Using DRAW statements for a "Spirograph-ish" way of creating interesting patterns
' The DRAW statements are used to position the pen for drawing circles
' Each DRAW statement (two of them) is a bit like a limb, with a joint connecting them, and each limb is drawn at a varying angle
' Circle drawn at the end of the second limb
' Each rendered image uses a color that is a transition from a previous target colour to a future target colour
' All circles in a rendering are the same size; the radius of the circles increases every second rendering up to a maximum, then decreases to a minimum, back and forth
' Each rendering leaves a dim echo of the previous rendering


' 🟠 DECLARATIONS and INITIALIZATION                                                 

' f% affects the angle of the arm in the second DRAW statement

  maxf% = 500
  f% = INT( RND * ( maxf% - 1 ) ) + 1
  finc% = 1

' r% affects the radius of the circles

  maxr# = 21
  r# = INT( RND * 19 ) + 1
  rinc# = 0.25

' Length of the "arms"; a1% drawn from center of screen to every 1 degree; a2% at same angle as a1%, plus f%
  maxa% = 90        
  a1% = INT( RND * 45 ) + maxr# + 20
  a2% = INT( maxa% - a1% + 105 )

' R1#, G1#, and B1# are the components of the previous target colour (initialized to a starting colour at program start)
' R2#, G2#, and B2# are the components of the next target colour
' the animation slowly transitions from (r1#,g1#,b1#) to (r2#,g2#,b2#), a random target colour selected when the target is reached
' radj#, gadj#, and badj# used to calculate the transition increments

  r1# = RND * 206 + 50
  g1# = RND * 206 + 50
  b1# = RND * 206 + 50
  GOSUB 🎨100_NEXT_COLOR

' 🟠 MAIN PROGRAM

SCREEN _NEWIMAGE(611,611,27)

🏁🏁🏁LOOP_START:
  GOSUB 🖥300_DrawImage
  SLEEP 1.75 : WHILE _MOUSEBUTTON : WEND
  GOSUB 🎨200_ColorsForNextLoop
  GOSUB ⚙400_IncrementVariables
GOTO 🏁🏁🏁LOOP_START

END

' 🟠 SUBROUTINES

🎨100_NEXT_COLOR:
  r2# = INT( RND * 206 ) + 50
  g2# = INT( RND * 206 ) + 50
  b2# = INT( RND * 206 ) + 50
  radj# = ( r2# - r1# ) / 20
  gadj# = ( g2# - g1# ) / 20
  badj# = ( b2# - b1# ) / 20
RETURN

🎨200_ColorsForNextLoop:
  r1# = r1# + radj# : g1# = g1# + gadj# : b1# = b1# + badj#
  IF NOT ( BETWEEN( r1#, 0, 255 ) _
       AND BETWEEN( g1#, 0, 255) _
       AND BETWEEN( b1#, 0, 255) ) _
     THEN r1# = r2# : g1# = g2# : b1# = b2# : GOSUB 🎨100_NEXT_COLOR
RETURN

🖥300_DrawImage:
  RgbaBox( 0, 0, XMAX, YMAX, 0, 155 )
  COLOR _RGB( INT( r1# ), INT( g1# ), INT( b1# ) )
  FOR angle% = 0 TO 360
    DRAW "B M" + XMAX/2 + "," + YMAX/2
    DRAW "TA" + angle% + " B U" + ( a1% - INT( r# ) )
    DRAW "TA" + ( angle% * f% ) + "B U" + a2%
    CIRCLE ( POINT( 0 ), POINT( 1 ) ),INT( r# ), , , , , T
  NEXT angle%
RETURN

⚙400_IncrementVariables:
  f% = f% + finc%
    IF f% > maxf% THEN f% = maxf% : finc% = -finc%
    IF f% < 1 THEN f% = 1 : finc% = -finc%
  r# = r# + rinc#
    IF r# > maxr# THEN r# = maxr# : rinc# = -rinc#
    IF r# < 1 THEN r# = 1 : rinc# = -rinc#
RETURN