Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
A Little Challenge: Spin the Circle
#1
Can anyone make this program shorter and smoother? I played with it for a while and it's pretty good, but I'm wondering if there's a simpler, better approach to using the ASPECT value. (bplus, I'm looking at you.  Wink)

Code: (Select All)
Option _Explicit '                   A Spinning Circle
Screen _NewImage(600, 400, 32)
Dim As Integer b, c, counter '                  Playing with Aspects
Dim As Single aspect, adder
Dim As _Unsigned Long col
$Color:32
counter = 0: col = Red
Do
    aspect = 1: adder = .015 '                 initial values
    '                                                      ASPECTS 1 TO 70
    For c = 1 To 9
        For b = 1 To 10 '                           redraw circle 10 times adding to the aspect each loop
            Cls
            aspect = aspect + adder '          increase the aspect by adder
            Circle (_Width / 2, _Height / 2), 100, White, , , aspect
            Paint (_Width / 2, _Height / 2), col, White
            _Limit 110
            _Display
        Next b
        If aspect >= 70 Then Exit For '       @ ~90 degrees drop thru to reverse loops
        adder = adder * 2 '                        adder amounts have to double after each 10-loop cycle to look right-ish
    Next c
    '                                                       * now reverse the process *
    counter = counter + 1
    If counter Mod 2 <> 0 Then If col = Red Then col = Green Else col = Red '  flip colors on odd cycles

    For c = 1 To 9 '                                  ASPECTS 70 TO 1
        For b = 1 To 10
            Cls
            aspect = aspect - adder
            Circle (_Width / 2, _Height / 2), 100, White, , , aspect
            If aspect <= 1 Then Exit For
            Paint (_Width / 2, _Height / 2), col, White
            _Limit 110
            _Display
        Next b
        adder = adder / 2 '
    Next c

    counter = counter + 1
    If counter = 4 Then counter = 0
    If _KeyDown(27) Then System
Loop
System
Reply
#2
Yours is nice I think you can cut it in half by eliminating the 2nd loop, seems like you might be able to change aspect like I change xr below.

here is a different approach:

Code: (Select All)
_Title "Spinning Circle" ' b+ 2024-09-10  highlight front edge
Screen _NewImage(620, 620, 32)
_ScreenMove 300, 60
cx = 308: cy = 308: xr = 0: dxr = 1: dyr = 1: yr = 300: c1~& = &HFFFF0000
Do
Cls
FEllipse cx, cy, xr, 300, &HFFFFFFFF
FEllipse 310, 310, xr, 300, c1~&
xr = xr + dxr
If xr > 300 Then dxr = -dxr: xr = 299: cx = 312: cy = 312: _Delay .1
If xr < 0 Then
dxr = -dxr: xr = 1: cx = 308: cy = 308
If c1~& = &HFFFF0000 Then c1~& = &HFF008800 Else c1~& = &HFFFF0000
End If
_Display
_Limit 120
Loop Until _KeyDown(27)

Sub FEllipse (CX As Long, CY As Long, xr As Long, yr As Long, C As _Unsigned Long)
If xr = 0 Or yr = 0 Then Exit Sub
Dim h2 As _Integer64, w2 As _Integer64, h2w2 As _Integer64
Dim x As Long, y As Long
w2 = xr * xr: h2 = yr * yr: h2w2 = h2 * w2
Line (CX - xr, CY)-(CX + xr, CY), C, BF
Do While y < yr
y = y + 1
x = Sqr((h2w2 - y * y * w2) \ h2)
Line (CX - x, CY + y)-(CX + x, CY + y), C, BF
Line (CX - x, CY - y)-(CX + x, CY - y), C, BF
Loop
End Sub

Edit Correction: I was flipping colors too often sorry, should be OK now!
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#3
Can't you just draw your circles, and then use _PutImage to flip them in/out?  I swear, that's how somebody did it on here, or over at the old forums, for a coin toss, and the number of lines there were completely minimal.
Reply
#4
'Coin Obverse & Reverse
Code: (Select All)
_MAPTRIANGLE (Radius%, Radius%)-(MapFrom!(N%, 0), MapFrom!(N%, 1))-(MapFrom!(N%, 2), MapFrom!(N%, 3)), Obverse& TO(SpinMeRound!(0, 0, 0), SpinMeRound!(0, 0, 1), SpinMeRound!(0, 0, 2) + Offset%)-(SpinMeRound!(0, 1, 0), SpinMeRound!(0, 1, 1), ZTemp!)-(SpinMeRound!(0, 2, 0), SpinMeRound!(0, 2, 1), ZTemp2!)
_MAPTRIANGLE (Radius%, Radius%)-(MapFrom!(N%, 4), MapFrom!(N%, 5))-(MapFrom!(N%, 6), MapFrom!(N%, 7)), Reverse& TO(SpinMeRound!(1, 0, 0), SpinMeRound!(1, 0, 1), SpinMeRound!(1, 0, 2) + Offset%)-(SpinMeRound!(1, 1, 0), SpinMeRound!(1, 1, 1), ZTemp1!)-(SpinMeRound!(1, 2, 0), SpinMeRound!(1, 2, 1), ZTemp3!)
'Coin Edge
_MAPTRIANGLE (0, 0)-(0, EdgeLess1%)-(EdgingLess1%, EdgeLess1%), EdgePart& TO(SpinMeRound!(0, 1, 0), SpinMeRound!(0, 1, 1), ZTemp!)-(SpinMeRound!(1, 1, 0), SpinMeRound!(1, 1, 1), ZTemp1!)-(SpinMeRound!(1, 2, 0), SpinMeRound!(1, 2, 1), ZTemp3!)
_MAPTRIANGLE (0, 0)-(EdgingLess1%, 0)-(EdgingLess1%, EdgeLess1%), EdgePart& TO(SpinMeRound!(0, 1, 0), SpinMeRound!(0, 1, 1), ZTemp!)-(SpinMeRound!(0, 2, 0), SpinMeRound!(0, 2, 1), ZTemp2!)-(SpinMeRound!(1, 2, 0), SpinMeRound!(1, 2, 1), ZTemp3!)

Most of the program has disappeared into the ether (it was saved as a dropbox file and deleted in the passing of time), but this is basically the main flip process that was discussed.



Might ask Richard Notley aka QWERKY if he still has a copy of that coin toss demo.
Reply
#5
And here's another flip the coin type demo I dug up:

Code: (Select All)
'Flip The Coin - By SierraKen
'Made on July 16, 2020.
'Thanks to Dav for the ring around the coin idea.

Screen _NewImage(800, 600, 32)
_Title "Left Click the coin to flip it in the air. Right Click the coin to spin it."
_Limit 100
Cls
x = 400: y = 450
For sz = .25 To 40 Step .25
    Circle (x, y), sz, _RGB32(0, 100, 0)
Next sz
Circle (x, y), 41, _RGB32(0, 255, 0)
'Building
Line (380, 440)-(420, 455), _RGB32(0, 255, 0), B
Line (380, 455)-(370, 465), _RGB32(0, 255, 0)
Line (420, 455)-(430, 465), _RGB32(0, 255, 0)
'Stairs
For sty = 455 To 465 Step 2
    For stx = 369 To 381
        If Point(stx, sty) = _RGB32(0, 255, 0) Then
            For stx2 = stx To 430
                PSet (stx2, sty), _RGB32(0, 255, 0)
                If Point(stx2 + 1, sty) = _RGB32(0, 255, 0) Then GoTo nex:
            Next stx2
        End If
    Next stx
    nex:
Next sty
Line (370, 465)-(430, 465), _RGB32(0, 255, 0)
Line (385, 440)-(415, 435), _RGB32(0, 255, 0), B
'Columns
xc = 380
For columns = 1 To 12
    xc = xc + 3.33
    Line (xc, 440)-(xc, 455), _RGB32(0, 255, 0)
Next columns

start:
Do
    Do While _MouseInput
        mouseX = _MouseX
        mouseY = _MouseY
        mouseLeftButton = _MouseButton(1)
        mouseRightButton = _MouseButton(2)
    Loop
    If mouseRightButton Then
        If Point(mouseX, mouseY) <> _RGB32(0, 0, 0) Then mouseRightButton = 0: GoTo spin:
    End If

    If mouseLeftButton Then
        If Point(mouseX, mouseY) <> _RGB32(0, 0, 0) Then mouseLeftButton = 0: GoTo throw:
    End If
Loop

spin:

Cls
x = 400: y = 450
tt = 1
yy = 10
For cc = 1 To 2
    For c = 1 To 25
        t = t + tt
        If t > 2 Then tt = -.2
        If t < 1 Then tt = .2
        For sz = .25 To 40 Step .25
            Circle (x, y), sz, _RGB32(0, 100, 0), , , t
        Next sz
        Circle (x, y), 41, _RGB32(0, 255, 0), , , t
        x = x - yy
        _Delay .02
        Cls
    Next c
    yy = -10
Next cc
For cc = 1 To 2
    For c = 1 To 25
        t = t + tt
        If t > 2 Then tt = -.2
        If t < 1 Then tt = .2
        For sz = .25 To 40 Step .25
            Circle (x, y), sz, _RGB32(0, 100, 0), , , t
        Next sz
        Circle (x, y), 41, _RGB32(0, 255, 0), , , t
        x = x - yy
        _Delay .02
        Cls
    Next c
    yy = 10
Next cc



GoTo outcome:

throw:
Cls
x = 400: y = 450
tt = .2
yy = 10
yy2 = 1
For cc = 1 To 2
    For c = 1 To 30
        t = t + tt
        If t > 1 Then tt = -.3
        If t < .2 Then tt = .3
        For sz = .25 To 40 Step .25
            Circle (x, y), sz, _RGB32(0, 100, 0), , , t
        Next sz
        Circle (x, y), 41, _RGB32(0, 255, 0), , , t
        y = y - yy
        yy = yy + yy2
        _Delay .02
        Cls
    Next c
    yy2 = -1
    yy = -10
Next cc

'-------------- Draw the outcome -----------------

outcome:
Randomize Timer
side = Int(Rnd * 2) + 1

If side = 1 Then
    For sz = .25 To 40 Step .25
        Circle (x, y), sz, _RGB32(0, 100, 0)
    Next sz
    Circle (x, y), 41, _RGB32(0, 255, 0)
    'Head
    For sz = .25 To 20 Step .25
        Circle (400, 450), sz, _RGB32(0, 255, 0), , , 1.25
    Next sz
    'Eye
    For sz = .25 To 3 Step .25
        Circle (390, 445), sz, _RGB32(0, 100, 0)
    Next sz
    'Nose
    For sz = .25 To 5 Step .25
        Circle (382, 450), sz, _RGB32(0, 255, 0), , , .5
    Next sz
    'Mouth
    For sz = .25 To 5 Step .25
        Circle (388, 457), sz, _RGB32(0, 100, 0), , , .5
    Next sz
    'Hair
    For hy = 433 To 455 Step 3
        For hx = 400 To 420 Step 3
            If Point(hx, hy) = _RGB32(0, 255, 0) Then Circle (hx, hy), 2, _RGB32(0, 175, 0)
        Next hx
    Next hy
End If

If side = 2 Then
    For sz = .25 To 40 Step .25
        Circle (x, y), sz, _RGB32(0, 100, 0)
    Next sz
    Circle (x, y), 41, _RGB32(0, 255, 0)
    'Building
    Line (380, 440)-(420, 455), _RGB32(0, 255, 0), B
    Line (380, 455)-(370, 465), _RGB32(0, 255, 0)
    Line (420, 455)-(430, 465), _RGB32(0, 255, 0)
    'Stairs
    For sty = 455 To 465 Step 2
        For stx = 369 To 381
            If Point(stx, sty) = _RGB32(0, 255, 0) Then
                For stx2 = stx To 430
                    PSet (stx2, sty), _RGB32(0, 255, 0)
                    If Point(stx2 + 1, sty) = _RGB32(0, 255, 0) Then GoTo nex2:
                Next stx2
            End If
        Next stx
        nex2:
    Next sty
    Line (370, 465)-(430, 465), _RGB32(0, 255, 0)
    Line (385, 440)-(415, 435), _RGB32(0, 255, 0), B
    'Columns
    xc = 380
    For columns = 1 To 12
        xc = xc + 3.33
        Line (xc, 440)-(xc, 455), _RGB32(0, 255, 0)
    Next columns
End If
GoTo start:
Reply
#6
@NakedApe I modified your code but don't think it runs as smoothly:
Code: (Select All)
Option _Explicit
_Title " A Spinning Circle: bplus mod of NakedApe"
Screen _NewImage(600, 400, 32)
Dim As Integer i, x, start, fini, stepper ' Playing with Aspects
Dim As Single aspect
Dim As _Unsigned Long col
$Color:32
Dim asp(1 To 8)
i = 1: x = 1: asp(1) = 1 ' make an array of aspect values that double from 1
While x < 70
i = i + 1: x = x * 2: asp(i) = x
Wend
col = Red: start = 1: fini = 8: stepper = 1
Do
For i = start To fini Step stepper
Cls
Circle (_Width / 2, _Height / 2), 100, White, , , asp(i)
Paint (_Width / 2, _Height / 2), col, White
_Limit 5
_Display
Next
If start = 1 Then
start = 8: fini = 1: stepper = -1
If col = Red Then col = Green Else col = Red ' flip colors on odd cycles
Else
start = 1: fini = 8: stepper = 1
End If
Loop Until _KeyDown(27)
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#7
Yeah a Rotozoom can spin a disk in all kinds of directions.

It's getting late, I leave that to another genius Smile
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#8
Ah fresh morning, fresh mind!

@NakedApe I hope you find this as good as I do! I mod my mod of your code:
Code: (Select All)
Option _Explicit
_Title " A Spinning Circle: bplus mod 2 of NakedApe"
Screen _NewImage(600, 400, 32)
Dim As Integer i, x, start, fini, stepper, top ' Playing with Aspects
Dim As _Unsigned Long col
$Color:32
Dim asp(1 To 90)
i = 1: asp(1) = 1 ' make an array of aspect values Note: asp(i) = Cos(_D2R(i)) will spin on the other axis
While i < 90
i = i + 1: asp(i) = 1 / Cos(_D2R(i))
Wend
top = i: col = Red: start = 1: fini = top: stepper = 1
Do
For i = start To fini Step stepper
Cls
Circle (_Width / 2, _Height / 2), 100, White, , , asp(i)
Paint (_Width / 2, _Height / 2), col, White
_Limit 60
_Display
Next
If start = 1 Then
start = top: fini = 1: stepper = -1
If col = Red Then col = Green Else col = Red ' flip colors on odd cycles
Else
start = 1: fini = top: stepper = 1
End If
Loop Until _KeyDown(27)

All smoothed out nicely.
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#9
(09-11-2024, 01:20 AM)SMcNeill Wrote: 'Coin Obverse & Reverse           
Code: (Select All)
_MAPTRIANGLE (Radius%, Radius%)-(MapFrom!(N%, 0), MapFrom!(N%, 1))-(MapFrom!(N%, 2), MapFrom!(N%, 3)), Obverse& TO(SpinMeRound!(0, 0, 0), SpinMeRound!(0, 0, 1), SpinMeRound!(0, 0, 2) + Offset%)-(SpinMeRound!(0, 1, 0), SpinMeRound!(0, 1, 1), ZTemp!)-(SpinMeRound!(0, 2, 0), SpinMeRound!(0, 2, 1), ZTemp2!)
_MAPTRIANGLE (Radius%, Radius%)-(MapFrom!(N%, 4), MapFrom!(N%, 5))-(MapFrom!(N%, 6), MapFrom!(N%, 7)), Reverse& TO(SpinMeRound!(1, 0, 0), SpinMeRound!(1, 0, 1), SpinMeRound!(1, 0, 2) + Offset%)-(SpinMeRound!(1, 1, 0), SpinMeRound!(1, 1, 1), ZTemp1!)-(SpinMeRound!(1, 2, 0), SpinMeRound!(1, 2, 1), ZTemp3!)
'Coin Edge
_MAPTRIANGLE (0, 0)-(0, EdgeLess1%)-(EdgingLess1%, EdgeLess1%), EdgePart& TO(SpinMeRound!(0, 1, 0), SpinMeRound!(0, 1, 1), ZTemp!)-(SpinMeRound!(1, 1, 0), SpinMeRound!(1, 1, 1), ZTemp1!)-(SpinMeRound!(1, 2, 0), SpinMeRound!(1, 2, 1), ZTemp3!)
_MAPTRIANGLE (0, 0)-(EdgingLess1%, 0)-(EdgingLess1%, EdgeLess1%), EdgePart& TO(SpinMeRound!(0, 1, 0), SpinMeRound!(0, 1, 1), ZTemp!)-(SpinMeRound!(0, 2, 0), SpinMeRound!(0, 2, 1), ZTemp2!)-(SpinMeRound!(1, 2, 0), SpinMeRound!(1, 2, 1), ZTemp3!)

Most of the program has disappeared into the ether (it was saved as a dropbox file and deleted in the passing of time), but this is basically the main flip process that was discussed.



Might ask Richard Notley aka QWERKY if he still has a copy of that coin toss demo.
I still found it on my computer.  Big Grin Big Grin Big Grin


.zip   Flippin' Coin.zip (Size: 2.77 MB / Downloads: 156)
Reply
#10
Re:Coin flip Update: "Crikey$" over 400 LOC and 0 subroutines Crikey indeed!

I wonder if Qwerky still looking in on us? last I heard he was quite ill, awile ago...
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  blue circle isn't drawing and print isn't working? madscijr 12 2,302 09-21-2024, 06:13 PM
Last Post: madscijr
  Is there a faster way to do this glow circle effect? Dav 11 2,069 06-16-2024, 11:51 PM
Last Post: Dav

Forum Jump:


Users browsing this thread: 1 Guest(s)