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 YZC%) EXIT IF NOT((XESTZC%) 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