Page 1 of 1

2D aleatory coral growing & gradient

Posted: Sat Mar 06, 2004 12:20 am
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

Posted: Sat Mar 06, 2004 1:20 am
by Dare2
hehe. That is a neat efect.

Posted: Sat Apr 08, 2006 12:47 am
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 

Posted: Sat Apr 08, 2006 6:26 pm
by einander
Thanks Fred !!

Posted: Sat Apr 08, 2006 10:20 pm
by va!n
Very nice work! ;-)

Posted: Tue Apr 11, 2006 4:55 pm
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:

Posted: Tue Apr 11, 2006 5:58 pm
by einander
Yeah. Viewing coral reefs at home is not so exciting.8)
Image