QB64.org Forum

Active Forums => Programs => Topic started by: Ashish on May 04, 2021, 02:01:02 am

Title: Colorful Triangle Geometry
Post by: Ashish on May 04, 2021, 02:01:02 am
Hi everyone!
I made a program which makes colorful and beautiful pattern full of triangles.
I hope you will like like it. :)

Code: QB64: [Select]
  1. 'Coded By Ashish
  2. '4 may, 2021
  3. 'edited : 9 may,2021
  4. _Title "Triangular Geometry"
  5. Screen _NewImage(800, 600, 32)
  6. 404 pattern 400, 0, 0, 600, 800, 600, 600, Int(Rnd * 255), 50 + Int(Rnd * 205)
  7. _Delay 0.25
  8. GoTo 404
  9. Sub pattern (x0, y0, x1, y1, x2, y2, d_max, s_min, s_width)
  10.     mx = (x1 + x2) / 2: my = (y1 + y2) / 2
  11.     d = Int(Sqr((mx - x0) ^ 2 + (my - y0) ^ 2))
  12.     drawTriangleSolid x0, y0, x1, y1, x2, y2, hsb(map(d, 10, d_max, s_min, (s_max + s_width) Mod 255), 255, 128, map(d, 10, d_max, 50, 255))
  13.     If d > 10 Then
  14.         If d >= d_max Then
  15.             pattern mx, my, x0, y0, x1, y1, d_max, s_min, s_width
  16.             pattern mx, my, x0, y0, x2, y2, d_max, s_min, s_width
  17.  
  18.         Else
  19.             If Rnd > 0.5 Then pattern mx, my, x0, y0, x1, y1, d_max, s_min, s_width Else pattern mx, my, x0, y0, x2, y2, d_max, s_min, s_width
  20.         End If
  21.     End If
  22.  
  23. Sub drawTriangleSolid (x1, y1, x2, y2, x3, y3, c~&)
  24.     Static temp_color_img As Long, drawTriangle_init As _Byte
  25.     If drawTriangle_init = 0 Then
  26.         temp_color_img = _NewImage(1, 1, 32)
  27.         drawTriangle_init = 1
  28.     End If
  29.     preDest = _Dest
  30.     _Dest temp_color_img
  31.     PSet (0, 0), c~&
  32.     _Dest preDest
  33.  
  34.     _MapTriangle (0, 0)-(0, 0)-(0, 0), temp_color_img To(x1, y1)-(x2, y2)-(x3, y3), 0, _Smooth
  35.  
  36.  
  37. Sub drawTriangle (x1, y1, x2, y2, x3, y3, c~&)
  38.     Line (x1, y1)-(x2, y2), c~&
  39.     Line (x2, y2)-(x3, y3), c~&
  40.     Line (x3, y3)-(x1, y1), c~&
  41.  
  42. 'method adapted form http://stackoverflow.com/questions/4106363/converting-rgb-to-hsb-colors
  43. Function hsb~& (__H As _Float, __S As _Float, __B As _Float, A As _Float)
  44.     Dim H As _Float, S As _Float, B As _Float
  45.  
  46.     H = map(__H, 0, 255, 0, 360)
  47.     S = map(__S, 0, 255, 0, 1)
  48.     B = map(__B, 0, 255, 0, 1)
  49.  
  50.     If S = 0 Then
  51.         hsb~& = _RGBA32(B * 255, B * 255, B * 255, A)
  52.         Exit Function
  53.     End If
  54.  
  55.     Dim fmx As _Float, fmn As _Float
  56.     Dim fmd As _Float, iSextant As Integer
  57.     Dim imx As Integer, imd As Integer, imn As Integer
  58.  
  59.     If B > .5 Then
  60.         fmx = B - (B * S) + S
  61.         fmn = B + (B * S) - S
  62.     Else
  63.         fmx = B + (B * S)
  64.         fmn = B - (B * S)
  65.     End If
  66.  
  67.     iSextant = Int(H / 60)
  68.  
  69.     If H >= 300 Then
  70.         H = H - 360
  71.     End If
  72.  
  73.     H = H / 60
  74.     H = H - (2 * Int(((iSextant + 1) Mod 6) / 2))
  75.  
  76.     If iSextant Mod 2 = 0 Then
  77.         fmd = (H * (fmx - fmn)) + fmn
  78.     Else
  79.         fmd = fmn - (H * (fmx - fmn))
  80.     End If
  81.  
  82.     imx = _Round(fmx * 255)
  83.     imd = _Round(fmd * 255)
  84.     imn = _Round(fmn * 255)
  85.  
  86.     Select Case Int(iSextant)
  87.         Case 1
  88.             hsb~& = _RGBA32(imd, imx, imn, A)
  89.         Case 2
  90.             hsb~& = _RGBA32(imn, imx, imd, A)
  91.         Case 3
  92.             hsb~& = _RGBA32(imn, imd, imx, A)
  93.         Case 4
  94.             hsb~& = _RGBA32(imd, imn, imx, A)
  95.         Case 5
  96.             hsb~& = _RGBA32(imx, imn, imd, A)
  97.         Case Else
  98.             hsb~& = _RGBA32(imx, imd, imn, A)
  99.     End Select
  100.  
  101.  
  102.  
  103. 'from p5js.bas
  104. Function map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)
  105.     map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!
  106.  
  107.  


 [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: Colorful Triangle Geometry
Post by: johnno56 on May 04, 2021, 08:10:15 am
I was all set to ask, "Does it come in blue?".... Never mind.... Bonus: I like it...
Title: Re: Colorful Triangle Geometry
Post by: _vince on May 05, 2021, 01:45:12 am
nice use of recursion, reminds me of

Code: QB64: [Select]
  1. pi = 4*atn(1)
  2. c = 2*sqr(3)/9
  3. cc = sqr(12) / 6
  4.  
  5. sw = 1024
  6. sh = 768
  7.  
  8. screen _newimage(sw, sh, 12)
  9. tri sw/2, sh/2, 600, 0
  10. tri sw/2, sh/2, 600, pi
  11. kock sw/2, sh/2, 600, 3
  12.  
  13. sub kock(x, y, s, i)
  14.         if i = 0 then exit sub
  15.         for a = pi/6 to 2*pi + pi/6 step pi/3
  16.                 xx = s*c*cos(a) + x
  17.                 yy = s*c*sin(a) + y
  18.        
  19.                 tri xx, yy, s/3, a+pi/6
  20.                 tri xx, yy, s/3, a+pi/6+pi
  21.  
  22.                 kock xx, yy, s/3, i - 1
  23.         next
  24.  
  25. sub tri(x, y, s, a)
  26.         line (x,y)-(x+s*cc*cos(pi/6 + a),y+s*cc*sin(pi/6 + a)),8
  27.         line (x,y)-(x+s*cc*cos(5*pi/6 + a),y+s*cc*sin(5*pi/6 + a)),8
  28.         line (x,y)-(x-s*cc*cos(pi/2 + a),y-s*cc*sin(pi/2 + a)),8
  29.  
  30.         line (x+s*cc*cos(pi/6 + a),y+s*cc*sin(pi/6 + a))-(x+s*cc*cos(5*pi/6 + a),y+s*cc*sin(5*pi/6 + a))
  31.         line-(x-s*cc*cos(pi/2 + a),y-s*cc*sin(pi/2 + a))
  32.         line-(x+s*cc*cos(pi/6 + a),y+s*cc*sin(pi/6 + a))
  33.  
Title: Re: Colorful Triangle Geometry
Post by: Ashish on May 05, 2021, 02:22:35 am
Thank you Johnno and Vince!
I like that program Vince!, Thanks for sharing
Title: Re: Colorful Triangle Geometry
Post by: TempodiBasic on May 07, 2021, 01:34:16 pm
@Ashish
cool ! speedy maptriangles colors.
I find it very good.
Just a feedback....
 it sometimes uses color very near in the spectrum of visible and my old eyes cannot distinguish them
 like in this screenshot
  [ This attachment cannot be displayed inline in 'Print Page' view ]  
Title: Re: Colorful Triangle Geometry
Post by: TempodiBasic on May 07, 2021, 01:39:10 pm
@vince
hey man with your math geometry I'm loosing my mind in its different prospectives
se here
  [ This attachment cannot be displayed inline in 'Print Page' view ]  

... I'm thinking how it can appear if it uses  many colors
Title: Re: Colorful Triangle Geometry
Post by: Ashish on May 09, 2021, 01:13:55 am
@TempodiBasic
Thanks! I have updated the code now... I hope it works fine for you now
Title: Re: Colorful Triangle Geometry
Post by: Ashish on May 09, 2021, 01:17:24 am
Here's a little modification I made to this -

Code: QB64: [Select]
  1. 'Coded By Ashish
  2. '4 may, 2021
  3. 'edited : 9 may,2021
  4. _Title "Triangular Geometry"
  5. Screen _NewImage(800, 600, 32)
  6. '404 pattern 400, 0, 0, 600, 800, 600, 600, Int(Rnd * 255), 50 + Int(Rnd * 205)
  7. Dim vx(2), vy(2)
  8. Dim ox, oy, r, start_ang, h, clr_start, clr_width
  9.     'creating new set of vertices of equilateral triangle
  10.     ox = Int(Rnd * 800): oy = Int(Rnd * 600)
  11.     r = 50 + Int(Rnd * 200)
  12.     start_ang = Rnd * _Pi(2)
  13.     n = 0
  14.     'Print start_ang, start_ang + _Pi(2)
  15.     For i = start_ang To start_ang + _Pi(2) Step _Pi(0.67)
  16.         'Print i
  17.         vx(n) = ox + r * Cos(i): vy(n) = oy + r * Sin(i)
  18.         n = n + 1
  19.     Next
  20.     h = r * 1.5
  21.     'color settings
  22.     clr_start = Int(Rnd * 255): clr_width = 50 + Int(Rnd * 255)
  23.     pattern vx(0), vy(0), vx(1), vy(1), vx(2), vy(2), h, clr_start, clr_width
  24.     _Display
  25.     _Limit 10
  26. '_Display
  27. '_Delay 0.25
  28. 'GoTo 404
  29. Sub pattern (x0, y0, x1, y1, x2, y2, d_max, s_min, s_width)
  30.     mx = (x1 + x2) / 2: my = (y1 + y2) / 2
  31.     d = Int(Sqr((mx - x0) ^ 2 + (my - y0) ^ 2))
  32.     drawTriangleSolid x0, y0, x1, y1, x2, y2, hsb(map(d, 10, d_max, s_min, (s_max + s_width) Mod 255), 255, 128, map(d, 10, d_max, 50, 255))
  33.     If d > 10 Then
  34.         If d >= d_max Then
  35.             pattern mx, my, x0, y0, x1, y1, d_max, s_min, s_width
  36.             pattern mx, my, x0, y0, x2, y2, d_max, s_min, s_width
  37.  
  38.         Else
  39.             If Rnd > 0.5 Then pattern mx, my, x0, y0, x1, y1, d_max, s_min, s_width Else pattern mx, my, x0, y0, x2, y2, d_max, s_min, s_width
  40.         End If
  41.     End If
  42.  
  43. Sub drawTriangleSolid (x1, y1, x2, y2, x3, y3, c~&)
  44.     Static temp_color_img As Long, drawTriangle_init As _Byte
  45.     If drawTriangle_init = 0 Then
  46.         temp_color_img = _NewImage(1, 1, 32)
  47.         drawTriangle_init = 1
  48.     End If
  49.     preDest = _Dest
  50.     _Dest temp_color_img
  51.     PSet (0, 0), c~&
  52.     _Dest preDest
  53.  
  54.     _MapTriangle (0, 0)-(0, 0)-(0, 0), temp_color_img To(x1, y1)-(x2, y2)-(x3, y3), 0, _Smooth
  55.  
  56.  
  57. Sub drawTriangle (x1, y1, x2, y2, x3, y3, c~&)
  58.     Line (x1, y1)-(x2, y2), c~&
  59.     Line (x2, y2)-(x3, y3), c~&
  60.     Line (x3, y3)-(x1, y1), c~&
  61.  
  62. 'method adapted form http://stackoverflow.com/questions/4106363/converting-rgb-to-hsb-colors
  63. Function hsb~& (__H As _Float, __S As _Float, __B As _Float, A As _Float)
  64.     Dim H As _Float, S As _Float, B As _Float
  65.  
  66.     H = map(__H, 0, 255, 0, 360)
  67.     S = map(__S, 0, 255, 0, 1)
  68.     B = map(__B, 0, 255, 0, 1)
  69.  
  70.     If S = 0 Then
  71.         hsb~& = _RGBA32(B * 255, B * 255, B * 255, A)
  72.         Exit Function
  73.     End If
  74.  
  75.     Dim fmx As _Float, fmn As _Float
  76.     Dim fmd As _Float, iSextant As Integer
  77.     Dim imx As Integer, imd As Integer, imn As Integer
  78.  
  79.     If B > .5 Then
  80.         fmx = B - (B * S) + S
  81.         fmn = B + (B * S) - S
  82.     Else
  83.         fmx = B + (B * S)
  84.         fmn = B - (B * S)
  85.     End If
  86.  
  87.     iSextant = Int(H / 60)
  88.  
  89.     If H >= 300 Then
  90.         H = H - 360
  91.     End If
  92.  
  93.     H = H / 60
  94.     H = H - (2 * Int(((iSextant + 1) Mod 6) / 2))
  95.  
  96.     If iSextant Mod 2 = 0 Then
  97.         fmd = (H * (fmx - fmn)) + fmn
  98.     Else
  99.         fmd = fmn - (H * (fmx - fmn))
  100.     End If
  101.  
  102.     imx = _Round(fmx * 255)
  103.     imd = _Round(fmd * 255)
  104.     imn = _Round(fmn * 255)
  105.  
  106.     Select Case Int(iSextant)
  107.         Case 1
  108.             hsb~& = _RGBA32(imd, imx, imn, A)
  109.         Case 2
  110.             hsb~& = _RGBA32(imn, imx, imd, A)
  111.         Case 3
  112.             hsb~& = _RGBA32(imn, imd, imx, A)
  113.         Case 4
  114.             hsb~& = _RGBA32(imd, imn, imx, A)
  115.         Case 5
  116.             hsb~& = _RGBA32(imx, imn, imd, A)
  117.         Case Else
  118.             hsb~& = _RGBA32(imx, imd, imn, A)
  119.     End Select
  120.  
  121.  
  122.  
  123. 'from p5js.bas
  124. Function map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)
  125.     map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!
  126.  
  127.  
Title: Re: Colorful Triangle Geometry
Post by: TempodiBasic on May 09, 2021, 11:54:27 am
@Ashish
very funny!
It works well.
Title: Re: Colorful Triangle Geometry
Post by: bplus on May 11, 2021, 12:49:19 am
Well @Ashish color and recursive subs, you know I had to join the fun!

Here is my rendition:
Code: QB64: [Select]
  1. _Title "Recursively Divide a Triangle into 2" 'b+ 2021-05-11
  2. ' inspired by Ashish post here:  https://www.qb64.org/forum/index.php?topic=3867.msg132129#msg132129
  3. ' Find the longest side middle point and draw line from that to angle point opposite that side.
  4. ' Then pass the 2 new tri's back to recursive sub until the longest side < 20, not 10
  5. ' See what happens... Ok way way to boring we need random filling and color!
  6. Screen _NewImage(1200, 600, 32)
  7. _Delay .25
  8.     Cls
  9.     DivideTriTo2 600, 0, 0, 600, 1200, 600
  10.     _Delay 2
  11.  
  12. Sub DivideTriTo2 (x1, y1, x2, y2, x3, y3)
  13.     s1 = _Hypot(x1 - x2, y1 - y2)
  14.     s2 = _Hypot(x3 - x2, y3 - y2)
  15.     s3 = _Hypot(x1 - x3, y1 - y3)
  16.     ftri x1, y1, x2, y2, x3, y3, _RGB32(Rnd * 255, Rnd * 255, Rnd * 255, Rnd * 255)
  17.     _Delay .002
  18.     If s1 >= s2 And s1 >= s3 And s1 > 20 Then
  19.         ptx = x3: pty = y3
  20.         mx = (x1 + x2) / 2: my = (y1 + y2) / 2
  21.         If Rnd < .75 Then DivideTriTo2 mx, my, ptx, pty, x1, y1
  22.         If Rnd < .75 Then DivideTriTo2 mx, my, ptx, pty, x2, y2
  23.     ElseIf s2 >= s1 And s2 >= s3 And s2 > 20 Then
  24.         ptx = x1: pty = y1
  25.         mx = (x3 + x2) / 2: my = (y3 + y2) / 2
  26.         If Rnd < .75 Then DivideTriTo2 mx, my, ptx, pty, x2, y2
  27.         If Rnd < .75 Then DivideTriTo2 mx, my, ptx, pty, x3, y3
  28.     ElseIf s3 >= s1 And s3 >= s2 And s3 > 20 Then
  29.         ptx = x2: pty = y2
  30.         mx = (x1 + x3) / 2: my = (y1 + y3) / 2
  31.         If Rnd < .75 Then DivideTriTo2 mx, my, ptx, pty, x1, y1
  32.         If Rnd < .75 Then DivideTriTo2 mx, my, ptx, pty, x3, y3
  33.     End If
  34.  
  35. '2019-12-16 fix by Steve saves some time with STATIC and saves and restores last dest
  36. Sub ftri (x1, y1, x2, y2, x3, y3, K As _Unsigned Long)
  37.     Dim D As Long
  38.     Static a&
  39.     D = _Dest
  40.     If a& = 0 Then a& = _NewImage(1, 1, 32)
  41.     _Dest a&
  42.     _DontBlend a& '  '<<<< new 2019-12-16 fix
  43.     PSet (0, 0), K
  44.     _Blend a& '<<<< new 2019-12-16 fix
  45.     _Dest D
  46.     _MapTriangle _Seamless(0, 0)-(0, 0)-(0, 0), a& To(x1, y1)-(x2, y2)-(x3, y3)
  47.  

  [ This attachment cannot be displayed inline in 'Print Page' view ]