2D aleatory coral growing & gradient

Share your advanced PureBasic knowledge/code with the community.
User avatar
einander
Enthusiast
Enthusiast
Posts: 744
Joined: Thu Jun 26, 2003 2:09 am
Location: Spain (Galicia)

2D aleatory coral growing & gradient

Post by einander »

Code updated for 5.20+

Hi @all:
Here is a simple example for color gradient and 2D aleatory coral growing.

Code: Select all

; CoralReef
; simple color Gradient and aleatory growing
; by einander
; march 5 -2004 - PB 3.81

Global Xmin, Ymin, Xmax, Ymax, Gradient
Gradient = 8 ; try different values

Procedure ChangeColor(COLOR)
    R = Red(COLOR) : G = Green(COLOR) : B = Blue(COLOR)
    G2 = Gradient * 2
    Select Random(2)
        Case 0
            If R > 255 - G2 : R - Gradient
            ElseIf R < G2 : R + Gradient
            Else : R + Random(Gradient * 2) - Gradient
            EndIf
        Case 1
            If G > 255 - G2 : G - Gradient
            ElseIf G < G2 : G + Gradient
            Else : G + Random(Gradient * 2) - Gradient
            EndIf
        Case 2
            If B > 255 - G2 : B - Gradient
            ElseIf B < G2 : B + Gradient
            Else : B + Random(Gradient * 2) - Gradient
            EndIf
    EndSelect
    ProcedureReturn RGB(R, G, B)
EndProcedure

Procedure Grow()
    Select Random(3) ; search first pixel <> Black , starting on aleatory window margin
        Case 0
            Y = Random(Ymax - Ymin) + Ymin
            For x = Xmin To Xmax
                If Point(x, y)
                    Circle(X, Y, 2, ChangeColor(Point(X, Y)))
                    If Xmin >= x : Xmin = x - 1 : EndIf
                    Break
                EndIf
            Next
        Case 1
            Y = Random(Ymax - Ymin) + Ymin
            For x = Xmax To Xmin Step - 1
                If Point(x, y)
                    Circle(X + 1, Y, 2, ChangeColor(Point(X, Y)))
                    If Xmax <= x : Xmax = x + 1 : EndIf
                    Break
                EndIf
            Next
        Case 2
            X = Random(Xmax - Xmin) + Xmin
            For y = Ymin To Ymax
                If Point(x, y)
                    Circle(X, Y, 2, ChangeColor(Point(X, Y)))
                    If Ymin >= y : Ymin = y - 1 : EndIf
                    Break
                EndIf
            Next
        Case 3
            X = Random(Xmax - Xmin) + Xmin
            For y = Ymax To Ymin Step - 1
                If Point(x, y)
                    Circle(X, Y + 1, 2, ChangeColor(Point(X, Y)))
                    If Ymax <= y : Ymax = y + 1 : EndIf
                    Break
                EndIf
            Next
    EndSelect
EndProcedure
; ____________________________________________________________________________________-
_X = GetSystemMetrics_(#SM_CXSCREEN) - 8 : _Y = GetSystemMetrics_(#SM_CYSCREEN) - 68
OpenWindow(0, 0, 0, _X, _Y, "", #WS_OVERLAPPEDWINDOW | #WS_MAXIMIZE)
StartDrawing(WindowOutput(0))
    DrawingMode(0)
    
    Xmin = _x / 2 - 1 : Ymin = _y / 2 - 1 : Xmax = Xmin + 2 : Ymax = Ymin + 2
    Box(0, 0, WindowWidth(0), WindowHeight(0), #Black)
    Plot(_x / 2, _y / 2, Random($FFFFFF)) ; aleatory color starting point
    Repeat
        Select WindowEvent()
            Case #PB_Event_CloseWindow : End
            Case #WM_KEYDOWN : If EventwParam() = 27 : End : EndIf
        EndSelect
        If Xmin > 10 And Ymin > 40 And Xmax < _x - 10 And Ymax < _y - 60
            Grow()
        EndIf
    ForEver
End
Best Regards
Dare2
Moderator
Moderator
Posts: 3321
Joined: Sat Dec 27, 2003 3:55 am
Location: Great Southern Land

Post by Dare2 »

hehe. That is a neat efect.
Fred
Administrator
Administrator
Posts: 18237
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

Code for v4:

Code: Select all

; CoralReef
; simple color Gradient and aleatory growing
; by einander
; march 5 -2004 - PB 3.81
; april 7 -2006 - PB 4.0 Beta 9

Global Xmin, Ymin, Xmax, Ymax, Gradient
Gradient = 8 ; try different values

Procedure ChangeColor(COLOR)
  R = Red(COLOR) : G = Green(COLOR) : b = Blue(COLOR)
  G2 = Gradient * 2
  Select Random(2)
    Case 0
      If R > 255 - G2 : R - Gradient
      ElseIf R < G2 : R + Gradient
      Else : R + Random(Gradient * 2) - Gradient
      EndIf
    Case 1
      If G > 255 - G2 : G - Gradient
      ElseIf G < G2 : G + Gradient
      Else : G + Random(Gradient * 2) - Gradient
      EndIf
    Case 2
      If b > 255 - G2 : b - Gradient
      ElseIf b < G2 : b + Gradient
      Else : b + Random(Gradient * 2) - Gradient
      EndIf
  EndSelect
  ProcedureReturn RGB(R, G, b)
EndProcedure

Procedure Grow()
  Select Random(3) ; search first pixel <> Black , starting on aleatory window margin
    Case 0
      Y = Random(Ymax - Ymin) + Ymin
      For x = Xmin To Xmax
        If Point(x, Y)
          Circle(x, Y, 2, ChangeColor(Point(x, Y)))
          If Xmin >= x : Xmin = x - 1 : EndIf
          Break
        EndIf
      Next
    Case 1
      Y = Random(Ymax - Ymin) + Ymin
      For x = Xmax To Xmin Step - 1
        If Point(x, Y)
          Circle(x + 1, Y, 2, ChangeColor(Point(x, Y)))
          If Xmax <= x : Xmax = x + 1 : EndIf
          Break
        EndIf
      Next
    Case 2
      x = Random(Xmax - Xmin) + Xmin
      For Y = Ymin To Ymax
        If Point(x, Y)
          Circle(x, Y, 2, ChangeColor(Point(x, Y)))
          If Ymin >= Y : Ymin = Y - 1 : EndIf
          Break
        EndIf
      Next
    Case 3
      x = Random(Xmax - Xmin) + Xmin
      For Y = Ymax To Ymin Step - 1
        If Point(x, Y)
          Circle(x, Y + 1, 2, ChangeColor(Point(x, Y)))
          If Ymax <= Y : Ymax = Y + 1 : EndIf
          Break
        EndIf
      Next
  EndSelect
EndProcedure
; ____________________________________________________________________________________-
_X = GetSystemMetrics_(#SM_CXSCREEN) - 8 : _Y = GetSystemMetrics_(#SM_CYSCREEN) - 68
OpenWindow(0, 0, 0, _X, _Y, "", #WS_OVERLAPPEDWINDOW | #WS_MAXIMIZE)
StartDrawing(WindowOutput(0))
DrawingMode(0)
   
Xmin = _X / 2 - 1 : Ymin = _Y / 2 - 1 : Xmax = Xmin + 2 : Ymax = Ymin + 2
Box(0, 0, WindowWidth(0), WindowHeight(0), #black)
Plot(_X / 2, _Y / 2, Random($FFFFFF)) ; aleatory color starting point
Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow : End
    Case #WM_KEYDOWN : If EventwParam() = 27 : End : EndIf
  EndSelect
  If Xmin > 10 And Ymin > 40 And Xmax < _X - 10 And Ymax < _Y - 60
    Grow()
  EndIf
ForEver
End 
User avatar
einander
Enthusiast
Enthusiast
Posts: 744
Joined: Thu Jun 26, 2003 2:09 am
Location: Spain (Galicia)

Post by einander »

Thanks Fred !!
va!n
Addict
Addict
Posts: 1104
Joined: Wed Apr 20, 2005 12:48 pm

Post by va!n »

Very nice work! ;-)
va!n aka Thorsten

Intel i7-980X Extreme Edition, 12 GB DDR3, Radeon 5870 2GB, Windows7 x64,
User avatar
Psychophanta
Always Here
Always Here
Posts: 5153
Joined: Wed Jun 11, 2003 9:33 pm
Location: Anare
Contact:

Post by Psychophanta »

Hi, Einander, nice effect.
Sure you are dreaming with diving again this summer, that's why this coral effect came to your mind, ehh!?? :wink:
http://www.zeitgeistmovie.com

while (world==business) world+=mafia;
User avatar
einander
Enthusiast
Enthusiast
Posts: 744
Joined: Thu Jun 26, 2003 2:09 am
Location: Spain (Galicia)

Post by einander »

Yeah. Viewing coral reefs at home is not so exciting.8)
Image
Post Reply