RosettaCodeData/Task/Bitmap-Flood-fill/ERRE/bitmap-flood-fill.erre
2016-12-05 23:44:36 +01:00

87 lines
1.5 KiB
Text

PROGRAM MYFILL_DEMO
!VAR SP%
!$INTEGER
CONST IMAGE_WIDTH=320,IMAGE_HEIGHT=200
DIM STACK[6000,1]
FUNCTION QUEUE_COUNT(X)
QUEUE_COUNT=SP
END FUNCTION
!$INCLUDE="PC.LIB"
PROCEDURE QUEUE_INIT
SP=0
END PROCEDURE
PROCEDURE QUEUE_POP(->XX,YY)
XX=STACK[SP,0]
YY=STACK[SP,1]
SP=SP-1
END PROCEDURE
PROCEDURE QUEUE_PUSH(XX,YY)
SP=SP+1
STACK[SP,0]=XX
STACK[SP,1]=YY
END PROCEDURE
PROCEDURE FLOOD_FILL(XSTART,YSTART,COLORE_PRIMA,COLORE_RIEMP)
LOCAL XEST,XWEST,YNORD,YSUD,X,Y
QUEUE_INIT
QUEUE_PUSH(XSTART,YSTART)
WHILE (QUEUE_COUNT(0)>0) DO
QUEUE_POP(->X,Y)
XWEST=X
XEST=X
IF Y>0 THEN
YNORD=Y-1
ELSE
YNORD=-1
END IF
IF Y<IMAGE_HEIGHT-1 THEN
YSUD=Y+1
ELSE
YSUD=-1
END IF
LOOP
POINT(XEST+1,Y->ZC%)
EXIT IF NOT((XEST<IMAGE_WIDTH-1) AND (ZC%=COLORE_PRIMA))
XEST=XEST+1
END LOOP
LOOP
POINT(XWEST-1,Y->ZC%)
EXIT IF NOT((XWEST>0) AND (ZC%=COLORE_PRIMA))
XWEST=XWEST-1
END LOOP
FOR X=XWEST TO XEST DO
PSET(X,Y,COLORE_RIEMP)
POINT(X,YNORD->ZC%)
IF YNORD>=0 AND ZC%=COLORE_PRIMA THEN
QUEUE_PUSH(X,YNORD)
END IF
POINT(X,YSUD->ZC%)
IF YSUD>=0 AND ZC%=COLORE_PRIMA THEN
QUEUE_PUSH(X,YSUD)
END IF
END FOR
END WHILE
END PROCEDURE ! Flood_Fill
BEGIN
SCREEN(1)
CIRCLE(100,100,75,2)
CIRCLE(120,120,20,2)
CIRCLE(80,80,15,2)
CIRCLE(120,80,10,2)
FLOOD_FILL(100,100,0,1)
END PROGRAM