QB64.org Forum

Active Forums => Programs => Topic started by: RhoSigma on September 10, 2018, 06:41:39 pm

Title: Binary (BCD) Clock
Post by: RhoSigma on September 10, 2018, 06:41:39 pm
Hi all,
wasn't in the mood to work on my GuiTools project today, instead I created this one, enjoy....

NOTE: On Linux/MacOS you probably need to adjust the _LOADFONT line.

Code: QB64: [Select]
  1. '+---------------+---------------------------------------------------+
  2. '| ###### ###### |     .--. .         .-.                            |
  3. '| ##  ## ##   # |     |   )|        (   ) o                         |
  4. '| ##  ##  ##    |     |--' |--. .-.  `-.  .  .-...--.--. .-.        |
  5. '| ######   ##   |     |  \ |  |(   )(   ) | (   ||  |  |(   )       |
  6. '| ##      ##    |     '   `'  `-`-'  `-'-' `-`-`|'  '  `-`-'`-      |
  7. '| ##     ##   # |                            ._.'                   |
  8. '| ##     ###### |  Sources & Documents placed in the Public Domain. |
  9. '+---------------+---------------------------------------------------+
  10. '|                                                                   |
  11. '| === BinClock.bas ===                                              |
  12. '|                                                                   |
  13. '| == A simple binary (BCD) clock inspired by the alien countdown    |
  14. '| == from the movie "Mission to Mars".                              |
  15. '|                                                                   |
  16. '+-------------------------------------------------------------------+
  17. '| Done by RhoSigma, R.Heyder, provided AS IS, use at your own risk. |
  18. '| Find me in the QB64 Forum or mail to support&rhosigma-cw.net for  |
  19. '| any questions or suggestions. Thanx for your interest in my work. |
  20. '+-------------------------------------------------------------------+
  21.  
  22. 'setup screen
  23. SCREEN _NEWIMAGE(875, 395, 256)
  24. scrFont& = _LOADFONT("C:\Windows\Fonts\timesbd.ttf", 72)
  25. _FONT scrFont&
  26.  
  27. '3D space origin is on these screen coordinates
  28. DIM SHARED cx%: cx% = 30
  29. DIM SHARED cy%: cy% = 250
  30.  
  31. 'init BCD discs
  32. TYPE Disc
  33.     x AS INTEGER
  34.     y AS INTEGER
  35.     z AS INTEGER
  36.     r AS INTEGER
  37.     a AS INTEGER
  38. DIM SHARED Discs(23) AS Disc
  39. InitDiscs
  40. DIM SHARED curState&: curState& = 0
  41. DIM SHARED newState&: newState& = 0
  42.  
  43. 'draw hour/minute/seconds separators
  44. Line3D 175, 0, 0, 175, 440, 0, 2
  45. Line3D 175, 0, 0, 175, 0, -110, 2
  46. Line3D 425, 0, 0, 425, 440, 0, 2
  47. Line3D 425, 0, 0, 425, 0, -110, 2
  48.  
  49. 'main loop
  50.     _LIMIT 1
  51.     FlipDiscs
  52. _FREEFONT scrFont&
  53.  
  54. 'run the clock
  55. SUB FlipDiscs
  56. t$ = TIME$
  57. newState& = (VAL(MID$(t$, 1, 1)) * (2 ^ 20)) + (VAL(MID$(t$, 2, 1)) * (2 ^ 16)) +_
  58.             (VAL(MID$(t$, 4, 1)) * (2 ^ 12)) + (VAL(MID$(t$, 5, 1)) * (2 ^ 8)) +_
  59.             (VAL(MID$(t$, 7, 1)) * (2 ^ 4)) + (VAL(MID$(t$, 8, 1)) * (2 ^ 0))
  60. diff& = curState& XOR newState&
  61. curState& = newState&
  62. FOR rot% = 1 TO 90
  63.     FOR n% = 0 TO 23
  64.         IF (n% MOD 4) = 0 THEN AxisSegments Discs(n%).x
  65.         IF diff& AND (2 ^ n%) THEN
  66.             Circle3D Discs(n%).x, Discs(n%).y, Discs(n%).z, Discs(n%).r, Discs(n%).a, 0
  67.             Circle3D Discs(n%).x, Discs(n%).y, Discs(n%).z, Discs(n%).r, Discs(n%).a + 1, 15
  68.             Discs(n%).a = Discs(n%).a + 1
  69.             IF Discs(n%).a = 180 THEN Discs(n%).a = 0
  70.         ELSE
  71.             Circle3D Discs(n%).x, Discs(n%).y, Discs(n%).z, Discs(n%).r, Discs(n%).a, 15
  72.         END IF
  73.     NEXT n%
  74.     IF rot% = 60 THEN
  75.         COLOR 1
  76.         _PRINTSTRING (50, 280), MID$(t$, 1, 2)
  77.         _PRINTSTRING (300, 280), MID$(t$, 4, 2)
  78.         _PRINTSTRING (550, 280), MID$(t$, 7, 2)
  79.     END IF
  80.     _DISPLAY
  81. NEXT rot%
  82.  
  83. 'setup start values for all discs
  84. SUB InitDiscs
  85. n% = 0
  86. FOR i% = 600 TO 500 STEP -100
  87.     FOR j% = 70 TO 370 STEP 100
  88.         Discs(n%).x = i%
  89.         Discs(n%).y = j%
  90.         Discs(n%).z = 0
  91.         Discs(n%).r = 30
  92.         Discs(n%).a = 0
  93.         n% = n% + 1
  94.     NEXT j%
  95. NEXT i%
  96. FOR i% = 350 TO 250 STEP -100
  97.     FOR j% = 70 TO 370 STEP 100
  98.         Discs(n%).x = i%
  99.         Discs(n%).y = j%
  100.         Discs(n%).z = 0
  101.         Discs(n%).r = 30
  102.         Discs(n%).a = 0
  103.         n% = n% + 1
  104.     NEXT j%
  105. NEXT i%
  106. FOR i% = 100 TO 0 STEP -100
  107.     FOR j% = 70 TO 370 STEP 100
  108.         Discs(n%).x = i%
  109.         Discs(n%).y = j%
  110.         Discs(n%).z = 0
  111.         Discs(n%).r = 30
  112.         Discs(n%).a = 0
  113.         n% = n% + 1
  114.     NEXT j%
  115. NEXT i%
  116.  
  117. 'draw rotation axis segments between discs
  118. SUB AxisSegments (x%)
  119. Line3D x%, 0, 0, x%, 40, 0, 4
  120. Line3D x%, 100, 0, x%, 140, 0, 4
  121. Line3D x%, 200, 0, x%, 240, 0, 4
  122. Line3D x%, 300, 0, x%, 340, 0, 4
  123. Line3D x%, 400, 0, x%, 440, 0, 4
  124.  
  125. SUB Line3D (x1%, y1%, z1%, x2%, y2%, z2%, col%)
  126. 'x1%/y1%/z1% = start, x2%/y2%/z2% = end, col% = color pen
  127. x1# = (x1% + (y1% * 0.5)): z1# = (z1% + (y1% * 0.5))
  128. x2# = (x2% + (y2% * 0.5)): z2# = (z2% + (y2% * 0.5))
  129. LINE (x1# + cx% - 1, -z1# + cy%)-(x2# + cx% - 1, -z2# + cy%), col%
  130. LINE (x1# + cx%, -z1# + cy%)-(x2# + cx%, -z2# + cy%), col%
  131. LINE (x1# + cx% + 1, -z1# + cy%)-(x2# + cx% + 1, -z2# + cy%), col%
  132.  
  133. SUB Circle3D (x%, y%, z%, r%, ba%, col%)
  134. 'x%/y%/z% = center, r% = radius, ba% = B-Axis angle, col% = color pen
  135. mx# = (x% + (y% * 0.5)): mz# = (z% + (y% * 0.5))
  136. zx# = r% * COS(ba% * 0.01745329)
  137. zz# = r% * SIN(ba% * 0.01745329)
  138. FOR cir% = 0 TO 359 STEP 5
  139.     x# = zx# * COS(cir% * 0.01745329)
  140.     y# = r% * SIN(cir% * 0.01745329)
  141.     z# = zz# * COS(cir% * 0.01745329)
  142.     x# = (x# + (y# * 0.5)): z# = (z# + (y# * 0.5))
  143.     LINE (x# + mx# + cx% - 1, -z# + -mz# + cy% - 1)-(x# + mx# + cx% + 1, -z# + -mz# + cy% + 1), col%, BF
  144. NEXT cir%
  145.  
  146.  
Title: Re: Binary (BCD) Clock
Post by: TerryRitchie on September 10, 2018, 07:08:16 pm
Awesome! I remember where that was in the movie too.
Title: Re: Binary (BCD) Clock
Post by: RhoSigma on September 11, 2018, 01:47:47 am
Glad, that you like it.
Title: Re: Binary (BCD) Clock
Post by: TerryRitchie on September 11, 2018, 02:05:23 am
The wife saw it running and said, "Hey, isn't that like the clock on the floor from that Mars movie?" LOL