QB64 Phoenix Edition
Screen Savers - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: Prolific Programmers (https://qb64phoenix.com/forum/forumdisplay.php?fid=26)
+---- Forum: bplus (https://qb64phoenix.com/forum/forumdisplay.php?fid=36)
+---- Thread: Screen Savers (/showthread.php?tid=219)

Pages: 1 2 3 4 5


RE: Screen Savers - bplus - 02-01-2023

(02-01-2023, 07:27 AM)vince Wrote: looks like JB is 3rd after smallbasic and qb64pe but still good that's in the top 3

Probably 2nd, sb editor really sucks and JB's ain't a whole lot better. 

QB64 by far and away #1!


RE: Screen Savers - bplus - 03-13-2023

Hexagonal Star Tiling
Code: (Select All)
_Title "Hexagonal Star Tiling 3" 'B+ 2019-04-19
' Trying to duplicate results shown here by Daniel Shiffman
' https://www.youtube.com/watch?v=sJ6pMLp_IaI&list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH&index=70
' but using a completely different method for drawing the tile
' 2019-04-17 Yes! the star tile can be generalized to any N sided regular polygon!
' 2019-04-17 This version try Hexagonal Tiling.
' 2019-04-17 Hexagonal Star Tiling 2, prep one tile and rubber stamp the grid with image.
' 2019-04-18 Go for a dynamic tile, image constantly changing

Const xmax = 1380 'bigger than your screen can hold
Const ymax = 800
Screen _NewImage(xmax, ymax, 32)
'_SCREENMOVE _MIDDLE
_FullScreen
Randomize Timer

Dim Shared tile&, polyRadius, triColor As _Unsigned Long

polyRadius = 60
gridheight = polyRadius * Sqr(3) / 2
triColor = _RGB32(0, 0, 255)
rd = 10
dm = 20
prepTile polyRadius, rd, dm
rDir = 1: dDir = 1
While _KeyDown(27) = 0
    If rDir = 1 Then
        If rd + 1 <= polyRadius * .5 Then
            rd = rd + 1: prepTile polyRadius, rd, dm
        Else

            If Rnd > .8 Then
                polyRadius = rand(20, 200)
                triColor = _RGB32(128 * Rnd + 127, 128 * Rnd + 127, 128 * Rnd + 127)
                rDir = -1: dm = Rnd * polyRadius * .5: rd = Rnd * polyRadius * .5 \ 1
                Color , _RGB32(128 * Rnd, 128 * Rnd, 128 * Rnd)
            Else
                rDir = -1
            End If
        End If
    End If
    If rDir = -1 Then
        If rd - 1 >= 0 Then
            rd = rd - 1: prepTile polyRadius, rd, dm
        Else
            If Rnd > .8 Then
                triColor = _RGB32(128 * Rnd, 128 * Rnd, 128 * Rnd)
                polyRadius = rand(20, 200)
                rDir = 1: dm = Rnd * polyRadius * .5: rd = Rnd * polyRadius * .5 \ 1
                Color , _RGB32(128 * Rnd + 127, 128 * Rnd + 127, 128 * Rnd + 127)
            Else
                rDir = 1
            End If
        End If
    End If

    Cls
    gridheight = polyRadius * Sqr(3) / 2
    xoff = 0
    For y = -polyRadius To ymax + gridheight Step gridheight
        xoff = (xoff + 1) Mod 2
        For x = -polyRadius To xmax Step 3 * polyRadius
            _PutImage (x + xoff * 1.5 * polyRadius, y), tile&, 0
        Next
    Next
    _Display
    _Limit .1 * polyRadius
Wend
End

Sub prepTile (pRadius, innerStarRadius, midPtDist)
    If tile& Then _FreeImage tile&
    tile& = _NewImage(2 * pRadius, 2 * pRadius, 32)
    _Dest tile&
    drawRegPolyStar pRadius, pRadius, pRadius, 6, innerStarRadius, midPtDist, triColor
    _Dest 0
End Sub

Sub drawRegPolyStar (cx, cy, pRadius, nSides, innerStarRadius, midPtDist, c1 As _Unsigned Long)
    Dim tilePtsX(1 To nSides), tilePtsY(1 To nSides)
    Dim innerStarX(1 To nSides), innerStarY(1 To nSides)

    pA = _Pi(2 / nSides)
    For i = 1 To nSides
        tilePtsX(i) = cx + pRadius * Cos(pA * i)
        tilePtsY(i) = cy + pRadius * Sin(pA * i)
        'on the same line the innerStar pts
        innerStarX(i) = cx + innerStarRadius * Cos(pA * i)
        innerStarY(i) = cy + innerStarRadius * Sin(pA * i)
        'CIRCLE (innerStarX(i), innerStarY(i)), 3, _RGB32(255, 255, 0)
        'draw tile
        If i > 1 Then
            Line (tilePtsX(i), tilePtsY(i))-(tilePtsX(i - 1), tilePtsY(i - 1)), _RGB32(255, 0, 0, 200)
            If i = nSides Then
                Line (tilePtsX(i), tilePtsY(i))-(tilePtsX(1), tilePtsY(1)), _RGB32(255, 0, 0, 200)
            End If
        End If
        '_DELAY .5
    Next

    'from each innerStarPt 2 lines connect to side midpoints
    'lets calc all the midpoints +/- midPtDist
    Dim mpdX(1 To 2 * nSides), mpdY(1 To 2 * nSides)
    For i = 1 To nSides
        If i - 1 = 0 Then ei = nSides Else ei = i - 1
        mx = (tilePtsX(ei) + tilePtsX(i)) / 2
        my = (tilePtsY(ei) + tilePtsY(i)) / 2
        'check
        'CIRCLE (mx, my), 2, _RGB32(0, 0, 255)
        '_DELAY .5

        'from each mx, my we need a point midPtDist along the angle from mx, my to the ei index point
        a = _Atan2(tilePtsY(ei) - my, tilePtsX(ei) - mx)
        mdx = mx + midPtDist * Cos(a)
        mdy = my + midPtDist * Sin(a)
        'the other point is 180 degrees in opposite direction
        mdx2 = mx + midPtDist * Cos(a - _Pi)
        mdy2 = my + midPtDist * Sin(a - _Pi)
        'check
        'CIRCLE (mdx, mdy), 2, _RGB32(255, 255, 0)
        'CIRCLE (mdx2, mdy2), 2, _RGB32(255, 0, 255)

        'OK store all these points for drawing lines later
        mpdX(2 * i - 1) = mdx: mpdY(2 * i - 1) = mdy
        mpdX(2 * i) = mdx2: mpdY(2 * i) = mdy2

    Next
    Color c1
    'from each point in inner star Radius draw 2 lines to the poly edges
    For i = 1 To nSides
        'now figure the pattern: sequence maps are to 2*i +2 and to 2*i - 1
        If 2 * i + 2 > 2 * nSides Then map = 2 * i + 2 - 2 * nSides Else map = 2 * i + 2
        Line (innerStarX(i), innerStarY(i))-(mpdX(map), mpdY(map))

        If 2 * i - 1 < 1 Then map2 = 2 * i - 1 + 2 * nSides Else map2 = 2 * i - 1
        Line (innerStarX(i), innerStarY(i))-(mpdX(map2), mpdY(map2))

        ftri innerStarX(i), innerStarY(i), mpdX(map), mpdY(map), mpdX(map2), mpdY(map2), c1
        '_DELAY .5
    Next

End Sub

Function rand% (lo%, hi%)
    rand% = Int(Rnd * (hi% - lo% + 1)) + lo%
End Function

' found at QB64.net:    http://www.qb64.net/forum/index.php?topic=14425.0
Sub ftri (x1, y1, x2, y2, x3, y3, K As _Unsigned Long)
    a& = _NewImage(1, 1, 32)
    _Dest a&
    PSet (0, 0), K
    _Dest tile&
    _MapTriangle _Seamless(0, 0)-(0, 0)-(0, 0), a& To(x1, y1)-(x2, y2)-(x3, y3)
    _FreeImage a& '<<< this is important!
End Sub

   


RE: Screen Savers - vince - 03-31-2023

the hexagon is the most efficient shape, nice mod


RE: Screen Savers - bplus - 04-01-2023

All the bees agree.


RE: Screen Savers - bplus - 05-14-2024

Boid Watching

Code: (Select All)
Option _Explicit
_Title "Boids Remake 2022-03" ' b+ 2022-03-19
' from JB Boids Restart #6 Wings b+ 2022-03-19
Randomize Timer

Const xmax = 1200, ymax = 700, pi = _Pi, nb = 100, no = 7, np = 3
Const green = _RGB32(0, 160, 0), blue = _RGB32(0, 0, 160), black = _RGB32(0, 0, 0), brown = _RGB32(100, 80, 40)
Dim As Long done, headmode, centermode, i, j, testx, testy, iter
Dim As Single hf, cf, t1, s, ao, dist

Dim As Single px(np), py(np), pa(np) ' Predator radius is const 10 or so, twice a bird at least
Dim As Single ox(no), oy(no), ord(no) ' obstacle x, y, radius
Dim As Single bx(nb), by(nb), ba(nb), da(nb, nb) ' new  da = distance array
Dim As Long pw(np), bw(nb)
headmode = 1 ' on / off
hf = .3 ' % of 100 pixels distance .1 = 10

centermode = 0 ' on / off
cf = .2 'centering factor how strong a pull from 0 to 1  .01 is week .1 pretty strong!

Screen _NewImage(xmax, ymax, 32)
_ScreenMove 100, 20

For i = 1 To no ' in array for redraw
    ox(i) = rand(90, xmax - 90): oy(i) = rand(90, ymax - 90): ord(i) = rand(25, 90)
Next
For i = 1 To nb
    testAgain: ' don't start a bird inside an obstacle
    testx = rand(20, xmax - 20) ' start random screen x, y away from borders
    testy = rand(20, ymax - 20)
    j = 0
    While j < no ' note get strange results with For loop
        j = j + 1
        If distance(testx, testy, ox(j), oy(j)) < ord(j) + 10 Then GoTo testAgain
    Wend
    j = 0
    While j < i - 1 'no bird crowds please  note get strange results with For loop
        j = j + 1
        If distance(testx, testy, bx(j), by(j)) < 15 Then GoTo testAgain
    Wend
    bx(i) = testx: by(i) = testy: ba(i) = 2 * pi * Rnd: bw(i) = Int(3 * Rnd) ' random headings
Next
For i = 1 To np ' might be smarter to pack the smaller after the larger, ie do predators before birds
    testAgain2: ' don't start a predator inside an obstacle
    testx = rand(40, xmax - 40) ' start random screen x, y away from borders
    testy = rand(40, ymax - 40)
    j = 0
    While j < no ' note get strange results with For loop
        j = j + 1
        If distance(testx, testy, ox(j), oy(j)) < ord(j) + 10 Then GoTo testAgain2
    Wend
    j = 0
    While j < nb ' give birds some space from predators too
        j = j + 1
        If distance(testx, testy, bx(j), by(j)) < 30 Then GoTo testAgain2
    Wend
    px(i) = testx: py(i) = testy: pa(i) = 2 * pi * Rnd: pw(i) = Int(5 * Rnd)
Next
t1 = Timer(.001)

While _KeyDown(27) = 0
    Color , green
    Cls
    For i = 1 To no
        fcirc ox(i), oy(i), ord(i), brown
    Next
    For i = 1 To nb - 1 ' find all the distances between birds
        For j = i + 1 To nb ' fix bonehead error of doing this 2x's! thanks tsh73 for catch!
            da(i, j) = distance(bx(i), by(i), bx(j), by(j))
            da(j, i) = da(i, j) ' symetric relationship
        Next
    Next

    For i = 1 To np ' Predators are just like a birds
        pw(i) = (1 + pw(i)) Mod 5 ' flapper wings or not
        DrawBird px(i), py(i), 15, pa(i), pw(i), blue
        s = Rnd * 4 + 3 ' get some bird separation here?
        px(i) = px(i) + s * Cos(pa(i)): py(i) = py(i) + s * Sin(pa(i))
        j = 0
        While j < no ' note get strange results with For loop
            j = j + 1
            If distance(px(i), py(i), ox(j), oy(j)) < ord(j) + 23 Then
                ao = _Atan2(oy(j) - py(i), ox(j) - px(i))
                pa(i) = AngleAve(pa(i), ao - pi)
            End If
        Wend
        ' JB&LB have better Mod function! tsh73 pointed it to me
        px(i) = Mod2(px(i) + xmax, xmax)
        py(i) = Mod2(py(i) + ymax, ymax)
        ' except predators don't flock
    Next

    For i = 1 To nb 'draw then update positions of birds
        ' draw current
        bw(i) = (bw(i) + 1) Mod 4 ' flapper wings or not
        DrawBird bx(i), by(i), 8, ba(i), bw(i), black
        s = rand(3, 7) ' get some bird separation here?
        bx(i) = bx(i) + s * Cos(ba(i)): by(i) = by(i) + s * Sin(ba(i))
        j = 0
        While j < no ' note get strange results with For loop
            j = j + 1
            If distance(bx(i), by(i), ox(j), oy(j)) < ord(j) + 13 Then
                ao = _Atan2(oy(j) - by(i), ox(j) - bx(i))
                ba(i) = AngleAve(ba(i), ao - pi)
            End If
        Wend
        j = 0
        While j < np
            j = j + 1
            If distance(bx(i), by(i), px(j), py(j)) < 65 Then
                ao = _Atan2(py(j) - by(i), px(j) - bx(i))
                ba(i) = AngleAve(ba(i), ao - pi)
            End If
        Wend
        ' JB&LB have better Mod function! tsh73 pointed it to me
        bx(i) = Mod2(bx(i) + xmax, xmax)
        by(i) = Mod2(by(i) + ymax, ymax)

        For j = i + 1 To nb
            dist = da(i, j)
            If dist < 50 Then ' birds are close enough to influence each other by visual
                'sway the neighbors headings towards each other
                If headmode And Rnd < hf Then
                    ba(i) = AngleAve(ba(i), AngleAve(ba(i), ba(j)))
                    ba(j) = AngleAve(ba(j), AngleAve(ba(i), ba(j)))
                End If
            End If
            If dist > 30 And dist < 100 Then
                'stickiness stay close to neighbors, close distance between
                If centermode And Rnd < cf Then
                    bx(i) = bx(i) - cf / 10 * (bx(i) - bx(j))
                    bx(j) = bx(j) + cf / 10 * (bx(i) - bx(j))
                    by(i) = by(i) - cf / 10 * (by(i) - by(j))
                    by(j) = by(j) + cf / 10 * (by(i) - by(j))
                End If
            End If
            If dist < 20 Then ' too close!!!
                bx(i) = bx(i) + .1 * (bx(i) - bx(j))
                bx(j) = bx(j) - .1 * (bx(i) - bx(j))
                by(i) = by(i) + .1 * (by(i) - by(j))
                by(j) = by(j) - .1 * (by(i) - by(j))
            End If
        Next 'j
    Next ' i
    _Display
    _Limit 10
Wend

Function rand& (lo As Long, hi As Long) 'rand integer between lo and hi iclusive
    rand& = Int((hi - lo + 1) * Rnd + lo)
End Function

Function distance (x1, y1, x2, y2) ' default single OK
    distance = Sqr((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
End Function

Function AngleAve (ra1, ra2) ' default single OK
    Dim twoPi, ray1, ray2, rtn
    twoPi = pi * 2
    ray1 = Mod2(ra1 + twoPi, twoPi)
    ray2 = Mod2(ra2 + twoPi, twoPi)
    rtn = (ray1 + ray2) / 2
    If Abs(ray1 - ray2) > pi Then rtn = Mod2(rtn - pi + twoPi, twoPi)
    AngleAve = rtn
End Function

Sub DrawBird (xc, yc, rr, ra, wings As Integer, c As _Unsigned Long)
    Dim x1, y1, x2, y2, x3, y3
    x1 = xc + rr * Cos(ra)
    y1 = yc + rr * Sin(ra)
    x2 = xc + rr * Cos(ra - .83 * pi)
    y2 = yc + rr * Sin(ra - .83 * pi)
    x3 = xc + rr * Cos(ra + .83 * pi)
    y3 = yc + rr * Sin(ra + .83 * pi)
    ftri x1, y1, xc, yc, x2, y2, c
    ftri x1, y1, xc, yc, x3, y3, c
    If wings Then
        x2 = xc + 2 * rr * Cos(ra - 1.57 * pi)
        y2 = yc + 2 * rr * Sin(ra - 1.57 * pi)
        x3 = xc + 2 * rr * Cos(ra + 1.57 * pi)
        y3 = yc + 2 * rr * Sin(ra + 1.57 * pi)
        ftri xc, yc, x2, y2, x3, y3, c
    End If
End Sub

' this allows us to do floats including negative floats
Function Mod2# (n As Double, modulus As Double)
    Dim rtn As Double
    rtn = modulus * (Abs(n) / modulus - Int(Abs(n) / modulus))
    If n < 0 Then rtn = -rtn
    Mod2# = rtn
End Function

Sub fcirc (CX As Long, CY As Long, R As Long, C As _Unsigned Long)
    Dim Radius As Long, RadiusError As Long
    Dim X As Long, Y As Long
    Radius = Abs(R): RadiusError = -Radius: X = Radius: Y = 0
    If Radius = 0 Then PSet (CX, CY), C: Exit Sub
    Line (CX - X, CY)-(CX + X, CY), C, BF
    While X > Y
        RadiusError = RadiusError + Y * 2 + 1
        If RadiusError >= 0 Then
            If X <> Y + 1 Then
                Line (CX - Y, CY - X)-(CX + Y, CY - X), C, BF
                Line (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
            End If
            X = X - 1
            RadiusError = RadiusError - X * 2
        End If
        Y = Y + 1
        Line (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
        Line (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
    Wend
End Sub

Sub ftri (x1, y1, x2, y2, x3, y3, K As _Unsigned Long)
    Dim D As Long
    Static a&
    D = _Dest
    If a& = 0 Then a& = _NewImage(1, 1, 32)
    _Dest a&
    _DontBlend a& '  '<<<< new 2019-12-16 fix
    PSet (0, 0), K
    _Blend a& '<<<< new 2019-12-16 fix
    _Dest D
    _MapTriangle _Seamless(0, 0)-(0, 0)-(0, 0), a& To(x1, y1)-(x2, y2)-(x3, y3)
End Sub



RE: Screen Savers - PhilOfPerth - 05-15-2024

(05-14-2024, 03:00 PM)bplus Wrote:
Boid Watching

Code: (Select All)
Option _Explicit
_Title "Boids Remake 2022-03" ' b+ 2022-03-19
' from JB Boids Restart #6 Wings b+ 2022-03-19
Randomize Timer

Const xmax = 1200, ymax = 700, pi = _Pi, nb = 100, no = 7, np = 3
Const green = _RGB32(0, 160, 0), blue = _RGB32(0, 0, 160), black = _RGB32(0, 0, 0), brown = _RGB32(100, 80, 40)
Dim As Long done, headmode, centermode, i, j, testx, testy, iter
Dim As Single hf, cf, t1, s, ao, dist

Dim As Single px(np), py(np), pa(np) ' Predator radius is const 10 or so, twice a bird at least
Dim As Single ox(no), oy(no), ord(no) ' obstacle x, y, radius
Dim As Single bx(nb), by(nb), ba(nb), da(nb, nb) ' new  da = distance array
Dim As Long pw(np), bw(nb)
headmode = 1 ' on / off
hf = .3 ' % of 100 pixels distance .1 = 10

centermode = 0 ' on / off
cf = .2 'centering factor how strong a pull from 0 to 1  .01 is week .1 pretty strong!

Screen _NewImage(xmax, ymax, 32)
_ScreenMove 100, 20

For i = 1 To no ' in array for redraw
    ox(i) = rand(90, xmax - 90): oy(i) = rand(90, ymax - 90): ord(i) = rand(25, 90)
Next
For i = 1 To nb
    testAgain: ' don't start a bird inside an obstacle
    testx = rand(20, xmax - 20) ' start random screen x, y away from borders
    testy = rand(20, ymax - 20)
    j = 0
    While j < no ' note get strange results with For loop
        j = j + 1
        If distance(testx, testy, ox(j), oy(j)) < ord(j) + 10 Then GoTo testAgain
    Wend
    j = 0
    While j < i - 1 'no bird crowds please  note get strange results with For loop
        j = j + 1
        If distance(testx, testy, bx(j), by(j)) < 15 Then GoTo testAgain
    Wend
    bx(i) = testx: by(i) = testy: ba(i) = 2 * pi * Rnd: bw(i) = Int(3 * Rnd) ' random headings
Next
For i = 1 To np ' might be smarter to pack the smaller after the larger, ie do predators before birds
    testAgain2: ' don't start a predator inside an obstacle
    testx = rand(40, xmax - 40) ' start random screen x, y away from borders
    testy = rand(40, ymax - 40)
    j = 0
    While j < no ' note get strange results with For loop
        j = j + 1
        If distance(testx, testy, ox(j), oy(j)) < ord(j) + 10 Then GoTo testAgain2
    Wend
    j = 0
    While j < nb ' give birds some space from predators too
        j = j + 1
        If distance(testx, testy, bx(j), by(j)) < 30 Then GoTo testAgain2
    Wend
    px(i) = testx: py(i) = testy: pa(i) = 2 * pi * Rnd: pw(i) = Int(5 * Rnd)
Next
t1 = Timer(.001)

While _KeyDown(27) = 0
    Color , green
    Cls
    For i = 1 To no
        fcirc ox(i), oy(i), ord(i), brown
    Next
    For i = 1 To nb - 1 ' find all the distances between birds
        For j = i + 1 To nb ' fix bonehead error of doing this 2x's! thanks tsh73 for catch!
            da(i, j) = distance(bx(i), by(i), bx(j), by(j))
            da(j, i) = da(i, j) ' symetric relationship
        Next
    Next

    For i = 1 To np ' Predators are just like a birds
        pw(i) = (1 + pw(i)) Mod 5 ' flapper wings or not
        DrawBird px(i), py(i), 15, pa(i), pw(i), blue
        s = Rnd * 4 + 3 ' get some bird separation here?
        px(i) = px(i) + s * Cos(pa(i)): py(i) = py(i) + s * Sin(pa(i))
        j = 0
        While j < no ' note get strange results with For loop
            j = j + 1
            If distance(px(i), py(i), ox(j), oy(j)) < ord(j) + 23 Then
                ao = _Atan2(oy(j) - py(i), ox(j) - px(i))
                pa(i) = AngleAve(pa(i), ao - pi)
            End If
        Wend
        ' JB&LB have better Mod function! tsh73 pointed it to me
        px(i) = Mod2(px(i) + xmax, xmax)
        py(i) = Mod2(py(i) + ymax, ymax)
        ' except predators don't flock
    Next

    For i = 1 To nb 'draw then update positions of birds
        ' draw current
        bw(i) = (bw(i) + 1) Mod 4 ' flapper wings or not
        DrawBird bx(i), by(i), 8, ba(i), bw(i), black
        s = rand(3, 7) ' get some bird separation here?
        bx(i) = bx(i) + s * Cos(ba(i)): by(i) = by(i) + s * Sin(ba(i))
        j = 0
        While j < no ' note get strange results with For loop
            j = j + 1
            If distance(bx(i), by(i), ox(j), oy(j)) < ord(j) + 13 Then
                ao = _Atan2(oy(j) - by(i), ox(j) - bx(i))
                ba(i) = AngleAve(ba(i), ao - pi)
            End If
        Wend
        j = 0
        While j < np
            j = j + 1
            If distance(bx(i), by(i), px(j), py(j)) < 65 Then
                ao = _Atan2(py(j) - by(i), px(j) - bx(i))
                ba(i) = AngleAve(ba(i), ao - pi)
            End If
        Wend
        ' JB&LB have better Mod function! tsh73 pointed it to me
        bx(i) = Mod2(bx(i) + xmax, xmax)
        by(i) = Mod2(by(i) + ymax, ymax)

        For j = i + 1 To nb
            dist = da(i, j)
            If dist < 50 Then ' birds are close enough to influence each other by visual
                'sway the neighbors headings towards each other
                If headmode And Rnd < hf Then
                    ba(i) = AngleAve(ba(i), AngleAve(ba(i), ba(j)))
                    ba(j) = AngleAve(ba(j), AngleAve(ba(i), ba(j)))
                End If
            End If
            If dist > 30 And dist < 100 Then
                'stickiness stay close to neighbors, close distance between
                If centermode And Rnd < cf Then
                    bx(i) = bx(i) - cf / 10 * (bx(i) - bx(j))
                    bx(j) = bx(j) + cf / 10 * (bx(i) - bx(j))
                    by(i) = by(i) - cf / 10 * (by(i) - by(j))
                    by(j) = by(j) + cf / 10 * (by(i) - by(j))
                End If
            End If
            If dist < 20 Then ' too close!!!
                bx(i) = bx(i) + .1 * (bx(i) - bx(j))
                bx(j) = bx(j) - .1 * (bx(i) - bx(j))
                by(i) = by(i) + .1 * (by(i) - by(j))
                by(j) = by(j) - .1 * (by(i) - by(j))
            End If
        Next 'j
    Next ' i
    _Display
    _Limit 10
Wend

Function rand& (lo As Long, hi As Long) 'rand integer between lo and hi iclusive
    rand& = Int((hi - lo + 1) * Rnd + lo)
End Function

Function distance (x1, y1, x2, y2) ' default single OK
    distance = Sqr((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
End Function

Function AngleAve (ra1, ra2) ' default single OK
    Dim twoPi, ray1, ray2, rtn
    twoPi = pi * 2
    ray1 = Mod2(ra1 + twoPi, twoPi)
    ray2 = Mod2(ra2 + twoPi, twoPi)
    rtn = (ray1 + ray2) / 2
    If Abs(ray1 - ray2) > pi Then rtn = Mod2(rtn - pi + twoPi, twoPi)
    AngleAve = rtn
End Function

Sub DrawBird (xc, yc, rr, ra, wings As Integer, c As _Unsigned Long)
    Dim x1, y1, x2, y2, x3, y3
    x1 = xc + rr * Cos(ra)
    y1 = yc + rr * Sin(ra)
    x2 = xc + rr * Cos(ra - .83 * pi)
    y2 = yc + rr * Sin(ra - .83 * pi)
    x3 = xc + rr * Cos(ra + .83 * pi)
    y3 = yc + rr * Sin(ra + .83 * pi)
    ftri x1, y1, xc, yc, x2, y2, c
    ftri x1, y1, xc, yc, x3, y3, c
    If wings Then
        x2 = xc + 2 * rr * Cos(ra - 1.57 * pi)
        y2 = yc + 2 * rr * Sin(ra - 1.57 * pi)
        x3 = xc + 2 * rr * Cos(ra + 1.57 * pi)
        y3 = yc + 2 * rr * Sin(ra + 1.57 * pi)
        ftri xc, yc, x2, y2, x3, y3, c
    End If
End Sub

' this allows us to do floats including negative floats
Function Mod2# (n As Double, modulus As Double)
    Dim rtn As Double
    rtn = modulus * (Abs(n) / modulus - Int(Abs(n) / modulus))
    If n < 0 Then rtn = -rtn
    Mod2# = rtn
End Function

Sub fcirc (CX As Long, CY As Long, R As Long, C As _Unsigned Long)
    Dim Radius As Long, RadiusError As Long
    Dim X As Long, Y As Long
    Radius = Abs(R): RadiusError = -Radius: X = Radius: Y = 0
    If Radius = 0 Then PSet (CX, CY), C: Exit Sub
    Line (CX - X, CY)-(CX + X, CY), C, BF
    While X > Y
        RadiusError = RadiusError + Y * 2 + 1
        If RadiusError >= 0 Then
            If X <> Y + 1 Then
                Line (CX - Y, CY - X)-(CX + Y, CY - X), C, BF
                Line (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
            End If
            X = X - 1
            RadiusError = RadiusError - X * 2
        End If
        Y = Y + 1
        Line (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
        Line (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
    Wend
End Sub

Sub ftri (x1, y1, x2, y2, x3, y3, K As _Unsigned Long)
    Dim D As Long
    Static a&
    D = _Dest
    If a& = 0 Then a& = _NewImage(1, 1, 32)
    _Dest a&
    _DontBlend a& '  '<<<< new 2019-12-16 fix
    PSet (0, 0), K
    _Blend a& '<<<< new 2019-12-16 fix
    _Dest D
    _MapTriangle _Seamless(0, 0)-(0, 0)-(0, 0), a& To(x1, y1)-(x2, y2)-(x3, y3)
End Sub

Love the way those little swallows (?) avoid the blue hawk (?)   Big Grin


RE: Screen Savers - bplus - 05-15-2024

thanks Phil, yeah i've spent some time watching the flocks group and regroup themselves while avoiding predators and obstacles.


RE: Screen Savers - bplus - 08-20-2024

Ken's Spashes reminded of this:

Splats


Code: (Select All)
_Title "Splats" 'b+ 2020-01-12
' from eRATication/cheese wedge tests/ multiple explosions.bas 2018-07-28 translated from
'bomb.bas for SmallBASIC 0.12.2 [B+=MGA] 2016-05-09 from explosion study

Const xmax = 1300, ymax = 760, pi2 = 6.283185
Type particle
    x As Single
    y As Single
    dx As Single
    dy As Single
    size As Single
    spread As Single
    'tf AS INTEGER
End Type
ReDim Shared dots(1) As particle
Screen _NewImage(xmax, ymax, 32)
_FullScreen
Randomize Timer
Dim kolor As _Unsigned Long

While Not _KeyDown(27)
    Color , _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
    Cls
    stopit = (Rnd * 100) \ 1 + 15
    For i = 1 To stopit
        dx = Rnd * 60 - 30: dy = Rnd * 60 - 30: a = 7 * (Rnd * 10 - 5): b = 7 * (Rnd * 10 - 5)
        x = xmax * Rnd: y = ymax * Rnd
        r = Rnd * 255
        If InKey$ = " " Then toggle = 1 - toggle
        If toggle Then
            kolor = _RGB32(r, r, r)
        Else
            kolor = _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
        End If
        While x > -100 And x < xmax + 100 And y > -100 And y < ymax + 100
            splat x, y, kolor
            x = x + dx: y = y + dy
            dx = dx + a: dy = dy + b
            _Display
        Wend
    Next
    _Delay 5
Wend
System

Sub splat (x, y, kolor As _Unsigned Long)
    round = 5
    nRounds = (Rnd * 10) \ 1 + 1
    nDots = nRounds * round

    ReDim dots(1 To nDots) As particle
    For i = 1 To round
        NewDot i, x, y
    Next
    rounds = round
    For loopCount = 0 To 20
        If _KeyDown(27) Then End
        For i = 1 To rounds
            dots(i).x = dots(i).x + dots(i).dx
            dots(i).y = dots(i).y + dots(i).dy
            dots(i).dx = dots(i).dx * dots(i).spread
            dots(i).dy = dots(i).dy * dots(i).spread
            fcirc dots(i).x, dots(i).y, dots(i).size / 2, kolor
            dots(i).size = dots(i).size * dots(i).spread
        Next
        If rounds < nDots Then
            For i = 1 To round
                NewDot i, x, y
            Next
            rounds = rounds + round
        End If
        _Display
    Next
End Sub

Sub NewDot (i, x, y)
    angle = Rnd * pi2
    r = Rnd * 5
    dots(i).x = x + r * Cos(angle)
    dots(i).y = y + r * Sin(angle)
    dots(i).size = Rnd * 15 + 5
    r = Rnd * 3
    dots(i).dx = r * (15 - dots(i).size) * Cos(angle)
    dots(i).dy = r * (15 - dots(i).size) * Sin(angle)
    dots(i).spread = Rnd * .3 + .2
End Sub

Sub fcirc (CX As Integer, CY As Integer, R As Integer, C As _Unsigned Long)
    Dim Radius As Integer, RadiusError As Integer
    Dim X As Integer, Y As Integer
    Radius = Abs(R): RadiusError = -Radius: X = Radius: Y = 0
    If Radius = 0 Then PSet (CX, CY), C: Exit Sub
    Line (CX - X, CY)-(CX + X, CY), C, BF
    While X > Y
        RadiusError = RadiusError + Y * 2 + 1
        If RadiusError >= 0 Then
            If X <> Y + 1 Then
                Line (CX - Y, CY - X)-(CX + Y, CY - X), C, BF
                Line (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
            End If
            X = X - 1
            RadiusError = RadiusError - X * 2
        End If
        Y = Y + 1
        Line (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
        Line (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
    Wend
End Sub