Quantcast
Channel: Small Basic
Viewing all articles
Browse latest Browse all 669

Small Basic - Flood Fill

$
0
0

A recent Small Basic post about filling a region left by Turtle trails revived an old flood fill program I wrote a while ago.

This is the forum thread, turtle small basic.

And this is the program to flood fill regions.

'FloodFill example - for some theory see http://en.wikipedia.org/wiki/Flood_fill
'Draw regions with left mouse button and fill with right mouse button
 
gw = GraphicsWindow.Width
gh = GraphicsWindow.Height
GraphicsWindow.MouseMove = OnMouseMove
GraphicsWindow.MouseDown = OnMouseDown
GraphicsWindow.MouseUp = OnMouseUp
 
mouseMove = 0
mouseDown = 0
rightClick = 0
 
While ("True")
  If (mouseDown = 1 And mouseMove = 1) Then
    xM = GraphicsWindow.MouseX
    yM = GraphicsWindow.MouseY
    GraphicsWindow.DrawLine(xMLast,yMLast,xM,yM)
    xMLast = xM
    yMLast = yM
    mouseMove = 0
  ElseIf (rightClick = 1) Then
    fillRegion()
    rightClick = 0
  EndIf
  Program.Delay(20)
EndWhile
 
Sub fillRegion
  Stack.PushValue("X",xMLast)
  Stack.PushValue("Y",yMLast)
  colOld = GraphicsWindow.GetPixel(xMLast,yMLast)
  colFill = GraphicsWindow.PenColor
  While (Stack.GetCount("X") > 0)
    x = Stack.PopValue("X")
    y = Stack.PopValue("Y")
    If (GraphicsWindow.GetPixel(x,y) <> colFill) Then 'We could have multiple entries in the stack at x,y so only process those we haven't dealt with
      GraphicsWindow.SetPixel(x,y,colFill)
      If (x > 0) Then
        If (GraphicsWindow.GetPixel(x-1,y) = colOld) Then
          Stack.PushValue("X",x-1)
          Stack.PushValue("Y",y)
        EndIf
      EndIf
      If (x < gw-1) Then 'X pixels go from 0 to gw-1
        If (GraphicsWindow.GetPixel(x+1,y) = colOld) Then
          Stack.PushValue("X",x+1)
          Stack.PushValue("Y",y)
        EndIf
      EndIf
      If (y > 0) Then
        If (GraphicsWindow.GetPixel(x,y-1) = colOld) Then
          Stack.PushValue("X",x)
          Stack.PushValue("Y",y-1)
        EndIf
      EndIf
      If (y < gh-1) Then ''Y pixels go from 0 to gh-1
        If (GraphicsWindow.GetPixel(x,y+1) = colOld) Then
          Stack.PushValue("X",x)
          Stack.PushValue("Y",y+1)
        EndIf
      EndIf
    EndIf
  EndWhile
EndSub
 
Sub OnMouseMove
  mouseMove = 1
EndSub
 
Sub OnMouseDown
  GraphicsWindow.PenColor = GraphicsWindow.GetRandomColor()
  xMLast = GraphicsWindow.MouseX
  yMLast = GraphicsWindow.MouseY
  If (Mouse.IsLeftButtonDown) Then
    mouseDown = 1
  ElseIf (Mouse.IsRightButtonDown) Then
    rightClick = 1
  EndIf
EndSub
 
Sub OnMouseUp
  mouseDown = 0
EndSub

 

While this program works fine, it is slow.

I added a new method to the LitDev extension to do a 'flood fill' quicker.  Internally it uses exactly the same method, but doesn't have to load the drawing bitmap and other over-heads for each end every pixel check or change.

The new command is about 100 times faster and replaces fillRegion() with LDGraphicsWindow.FloodFill(GraphicsWindow.MouseX,GraphicsWindow.MouseY,GraphicsWindow.PenColor) in the code sample.


Viewing all articles
Browse latest Browse all 669

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>