QB64.org Forum

Active Forums => Programs => Topic started by: bplus on November 21, 2021, 01:32:26 pm

Title: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 21, 2021, 01:32:26 pm
Create this Pattern:
  [ This attachment cannot be displayed inline in 'Print Page' view ]  

Too easy? Here's 2 mods:
  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: johnno56 on November 21, 2021, 03:52:49 pm
My wife is of the opinion that I am certifiable.... Does that help?
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: OldMoses on November 21, 2021, 05:17:41 pm
While not certifiable, I'll content myself with getting in the ballpark.

Code: QB64: [Select]
  1. SCREEN _NEWIMAGE(400, 400, 32)
  2. s% = _WIDTH(0): bx% = 0: by% = 0: i% = 0: a& = &HFFFFFFFF: c& = &HFF000000
  3.     s% = _SHR(s%, 1)
  4.     DO
  5.         SWAP a&, c&
  6.         LINE (bx%, by%)-(bx% + s%, by% + s%), c&, BF
  7.         by% = by% + s%
  8.     LOOP UNTIL by% + s% >= _HEIGHT(0)
  9.     SWAP a&, c&
  10.     bx% = bx% + s%
  11.     by% = 0
  12. LOOP UNTIL bx% >= _WIDTH(0)
  13.  

Ok, given that I'm using _SHR it works better if I change to SCREEN _NEWIMAGE(512, 512, 32)

PS. Oh yeah, and silly me that last LOOP UNTIL should be s% = 1. Task manager told me so...
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 21, 2021, 06:23:14 pm
Oh you caught just as I was going to post with this:

  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 21, 2021, 06:33:40 pm
Could do in less lines (no colons) and not be dependent on powers of 2 for side widths or heights:

  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 21, 2021, 07:31:18 pm
Well I guess it better to do Shrinking Chess Pattern 2 like this:
  [ This attachment cannot be displayed inline in 'Print Page' view ]  

To get to this, Shrinking Pattern 3:
  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: SMcNeill on November 21, 2021, 08:43:27 pm
How about a different way to do these?

Code: QB64: [Select]
  1. Screen _NewImage(400, 400, 256)
  2. Line (0, 0)-Step(200, 200), 15, BF
  3. Copy
  4.  
  5.  
  6.  
  7. Sub Copy
  8.     t& = _NewImage(200, 200, 256)
  9.     _PutImage , 0, t&, (0, 0)-(199, 399)
  10.     x = 200: count = 1: s = 200
  11.     Do
  12.         Sleep
  13.         count = count * 2
  14.         Locate 1, 1
  15.         For i = 0 To count
  16.             _PutImage (x, i * s)-Step(s / 2, s), t&, 0
  17.         Next
  18.         s = s / 2: x = x + s
  19.     Loop Until x >= 400
  20.  
  21.  

At one point, there was a recursive glitch inside _PUTIMAGE itself that used to do images like this if the destination and source were the same, before I went in and fixed it, which is what made me think about doing something in this manner. 

From this point, you guys should be able to see that the mods are nothing more than just the same idea at work like this, right?  Just take a portion of the screen and then use _putimage to duplicate a portions of it and flip/reverse it as needed to make the other patterns.

What I find a little surprising is the actual number of screens that we reproduce with this.  We go multiple times at the end without seeing any visible change, so we must be drawing partial pixel screens before the total exceeds 400 for us.  LOL![/code]
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 21, 2021, 09:15:45 pm
Different definitely makes you certifiable!

Luv what Andy and Steve have presented.
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 22, 2021, 11:49:37 am
Here's the ordinary way I did it with comments:
Code: QB64: [Select]
  1. Screen _NewImage(1000, 600, 32) '     "Shrinking Chess Pattern tsh73" 'b+ 2021-11-21
  2. For p = 1 To 9 '                       for powers of 2
  3.     lx = _Width / 2 ^ p + lastlx '     left most x
  4.     dy = _Height / 2 ^ p '             change in y's  or the height of the boxes
  5.     For y = 0 To _Height - 2 Step dy ' width of boxes is lx - lastlx
  6.         If i Mod 2 Then Line (lastlx, y)-(lx, y + dy), &HFF000000, BF Else Line (lastlx, y)-(lx, y + dy), &HFFFFFFFF, B
  7.         i = i + 1 '                    this switches colors after each box
  8.     Next
  9.     lastlx = lx '                      before getting next power of 2 update lastlx  with lx the one we just used
  10. Sleep '                                don't ruin the shot with a black line that appears at end of program
  11.  
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: OldMoses on November 22, 2021, 01:21:47 pm
Your work is always educational (as is Steve's). That 2 power loop is a pretty cool method, and never would have occurred to me.

I originally was trying to use a MOD 2 routine for color picking, but the implementation was causing errors in my LINE statement for some reason. I couldn't figure out why and just went with SWAP.
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 22, 2021, 01:54:16 pm
Your work is always educational (as is Steve's). That 2 power loop is a pretty cool method, and never would have occurred to me.

I originally was trying to use a MOD 2 routine for color picking, but the implementation was causing errors in my LINE statement for some reason. I couldn't figure out why and just went with SWAP.

Either would work with one more box on each inner loop:
Code: QB64: [Select]
  1. Screen _NewImage(512, 512, 32)
  2. s% = _Width
  3. a& = &HFFFFFFFF: c& = &HFF000000
  4.     s% = _SHR(s%, 1)
  5.     Do
  6.         Swap a&, c& ' do an even number of swaps in this loop
  7.         Line (bx%, by%)-(bx% + s%, by% + s%), c&, BF
  8.         by% = by% + s%
  9.     Loop Until by% >= _Height(0) - 1 ' b+ changed to do one more box down y axis so that always start powers with even number
  10.     bx% = bx% + s%
  11.     by% = 0
  12. Loop Until bx% >= _Width(0) - 1 '<<< to actually end computations!
  13.  

Gives this box structure:
 
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 22, 2021, 02:09:50 pm
And one more line gets to 2nd part, from which 3rd screen might be made:
Code: QB64: [Select]
  1. Screen _NewImage(512, 512, 32)
  2. s% = _Width
  3. a& = &HFFFFFFFF: c& = &HFF000000
  4.     s% = _SHR(s%, 1)
  5.     Do
  6.         Swap a&, c& ' do an even number of swaps in this loop
  7.         Line (bx%, by%)-(bx% + s%, by% + s%), a&, BF
  8.         Line (_Width - 1 - bx%, _Height - 1 - by%)-(_Width - 1 - bx% - s%, -height - 1 - by% - s%), a&, BF
  9.         by% = by% + s%
  10.     Loop Until by% >= _Height(0) - 1 ' b+ changed to do one more box down y axis so that always start powers with even number
  11.     bx% = bx% + s%
  12.     by% = 0
  13. Loop Until bx% >= _Width(0) - 1
  14.  
  15.  

  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: TempodiBasic on November 22, 2021, 09:23:49 pm
Hy guys and gals

fine graphic task!
And see what different results changing the type of variable: Single  on the left versus Integer on the right.
  [ This attachment cannot be displayed inline in 'Print Page' view ]  

however attached there is my code, because it is not so schematich like that of OldMoses, not short like that of Bplus and not so good like that of Steve.

Very glad to observe your mind in action boys!
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: bplus on November 22, 2021, 10:10:07 pm
@TempodiBasic

I was wondering when your program ended so I put a Beep at the end, never heard it!

OK so maybe Sum never makes it to _Width but should to _Width -1, no? ! ???

WTH? is with Sum, Print, Print... Oh!!!

Needed a fix to quit when you expected it to.
Code: QB64: [Select]
  1.  
  2. Const white = _RGB32(255), black = _RGB32(0), Wscreen = 400, Hscreen = 400
  3. Dim As Single Wsquare, Hsquare, a, Repeat, Left, Top, Sum
  4. Screen _NewImage(Wscreen, Hscreen, 32)
  5. Wsquare = Wscreen / 2
  6.  
  7. Sum = Wsquare ' <<<<<<<<<<<<<<<<<<<<<<<<<<<< fix this to work as TempodiBasic thinks it should
  8. Hsquare = Hscreen / 2
  9. Repeat = 1
  10.     For a = 1 To Repeat
  11.         Line (Left, Top + (Hsquare * (a - 1)))-(Left + Wsquare, Top + (Hsquare * a)), white, BF
  12.         ' Line (Left, Top + (Hsquare * a))-(Left + Wsquare, Top + (Hsquare * (a + 1))), black, BF
  13.         Top = Top + Hsquare
  14.     Next a
  15.     Top = 0
  16.     Repeat = Repeat * 2
  17.     Left = Left + Wsquare
  18.     Wsquare = Wsquare / 2
  19.     Hsquare = Hsquare / 2
  20.     Sum = Sum + Wsquare
  21.     Print Sum ' >>>>>>>>>>>>>>>>>>>>>>>>>>>> what's going on
  22. Loop While Sum <= Wscreen - 1 ' ??? WTH no beep yet????
  23.  

Yeah @TempodiBasic nothing fancy but gets the job done, unless expecting to do something after... ha, ha!

Oh hey! There is a big difference along the right hand side of the graph depending whether you comment out the 2nd  Line statement or not, that draws the Black rectangles.  Check this side by side comparison:
 
Title: Re: Graphics Test #1 Are You Certifiable?
Post by: TempodiBasic on November 24, 2021, 09:58:28 am
Hi Bplus
thanks for giving a try to my code.

in it there is a Troy's horse: paradox of Zenone and mathematical concepts of limit and infinitesimal.
Here some explicative links:
https://en.wikipedia.org/wiki/Trojan_Horse (https://en.wikipedia.org/wiki/Trojan_Horse)
https://en.wikipedia.org/wiki/Zeno%27s_paradoxes#Dichotomy_paradox (https://en.wikipedia.org/wiki/Zeno%27s_paradoxes#Dichotomy_paradox)
https://en.wikipedia.org/wiki/Limit_(mathematics) (https://en.wikipedia.org/wiki/Limit_(mathematics))
https://en.wikipedia.org/wiki/Calculus (https://en.wikipedia.org/wiki/Calculus)

but yes it is too visible with my mistake to not initialize a first time
Code: QB64: [Select]
  1. Sum = Wsquare
instead with this your correction it would be more hidden to not mathematical eyes
If you introduce in the DO---LOOP a counter you can see that the loop runs 24 times... but  looking at image we can see not more than 9 kind of graphic column!
With my mistake of not initialize Sum before DO---LOOP it is still running while I have written this post!
LOL math is fantastic but very dangerouse!
  [ This attachment cannot be displayed inline in 'Print Page' view ]  
the difference between Integer and Single variable is gross and its cause is clear.
The difference between drawing only White squares and drawing white and black squares, probably, is in the fact that we cannot draw less than a pixel on the screen.