buggy flood fill

This commit is contained in:
visionmercer 2026-05-01 13:58:36 +02:00
commit 218e54ce70
2 changed files with 120 additions and 7 deletions

View file

@ -1,6 +1,6 @@
sub filledPolygon (Points() as single, col as long)
sub filledPolygon (Points() as long, col as long)
dim i as integer, j as integer
dim x1 as single, y1 as single, x2 as single, y2 as single
dim intersectX as single
@ -67,8 +67,9 @@ Sub polygon (pa() As Long,col as long)
For i = 2 To UBound(pa) Step 2
thickLine pa(i - 2), pa(i - 1),pa(i), pa(i + 1),col
Next i
thickLine pa(i - 1), pa(i - 2),pa(0), pa(1),col
thickLine pa(ubound(pa)-1), pa(ubound(pa)),pa(0), pa(1),col
End Sub
sub thickcircle(x, y, r, col as long)
if state.brushsize <= 1 then
circle (x, y), r, col
@ -143,3 +144,100 @@ sub filledcircle(x,y,r,col as long)
line (x-tx,y+ty)-(x+tx,y+ty),col
wend
end sub
sub floodfill (x as integer, y as integer, fillcolor as long)
dim as integer leftx, rightx, currenty
dim as integer arrsize, stackptr
' Create a stack for storing coordinates
arrsize = 1000 ' Adjust based on expected complexity
redim stack(1 to arrsize, 1 to 2) as integer
stackptr = 0
' Get the color at starting point
dim startcolor as long
startcolor = point(x, y)
' If starting on boundary color or fill color, exit
if startcolor = fillcolor then exit sub
' Push starting point to stack
stackptr = stackptr + 1
stack(stackptr, 1) = x
stack(stackptr, 2) = y
' Process until stack is empty
do while stackptr > 0
' Pop a point from stack
x = stack(stackptr, 1)
y = stack(stackptr, 2)
stackptr = stackptr - 1
' Skip if current point is not startcolor
if point(x, y) <> startcolor then _continue
' Find leftmost point on this scanline
leftx = x
do while leftx > 0 and point(leftx - 1, y) = startcolor
leftx = leftx - 1
loop
' Find rightmost point on this scanline
rightx = x
do while rightx < _width - 1 and point(rightx + 1, y) = startcolor
rightx = rightx + 1
loop
' Fill the scanline
line (leftx, y)-(rightx, y), fillcolor
' Check scanline above
currenty = y - 1
if currenty >= 0 then
for x = leftx to rightx
if point(x, currenty) = startcolor then
' Push seed point to stack
stackptr = stackptr + 1
if stackptr > arrsize then
' Resize stack if needed
arrsize = arrsize * 2
redim _preserve stack(1 to arrsize, 1 to 2) as integer
end if
stack(stackptr, 1) = x
stack(stackptr, 2) = currenty
' Skip adjacent pixels of same color
do while x <= rightx and point(x, currenty) = startcolor
x = x + 1
loop
x = x - 1 ' Adjust for loop increment
end if
next x
end if
' Check scanline below
currenty = y + 1
if currenty < _height then
for x = leftx to rightx
if point(x, currenty) = startcolor then
' Push seed point to stack
stackptr = stackptr + 1
if stackptr > arrsize then
' Resize stack if needed
arrsize = arrsize * 2
redim _preserve stack(1 to arrsize, 1 to 2) as integer
end if
stack(stackptr, 1) = x
stack(stackptr, 2) = currenty
' Skip adjacent pixels of same color
do while x <= rightx and point(x, currenty) = startcolor
x = x + 1
loop
x = x - 1 ' Adjust for loop increment
end if
next x
end if
loop
end sub