home *** CD-ROM | disk | FTP | other *** search
- (*-----------------------------------------------------------------*)
- (* FLOODFIL.PAS *)
- (* Rekursives Flaechenfuellen aus PASCAL 5/87 mit Apple-Grafik *)
-
- (*$A-*) (* Rekursiven Code auf CP/M-Rechnern erlauben *)
- PROGRAM FillDemo;
-
- TYPE x_Koord_Sys = INTEGER;
- y_Koord_Sys = INTEGER;
-
- (*$I IGrafik *)
- (*$I IMemDisk *)
-
- VAR i: INTEGER;
-
- FUNCTION Adressenvergleich(k, g: INTEGER): BOOLEAN;
- BEGIN
- IF ((k >= 0) AND (g >= 0)) OR ((k <= 0) AND (g <= 0)) THEN
- Adressenvergleich := k < g
- ELSE
- Adressenvergleich := (k >= 0) AND (g < 0)
- END;
-
- PROCEDURE Fill(x: x_Koord_Sys; y: y_Koord_Sys);
- BEGIN
- (* Rekursionstiefe mit Heapueberpruefung beschraenken *)
- IF Adressenvergleich(HeapPtr + 50,RecurPtr) THEN BEGIN
- IF NOT Screenbit(x, y) THEN BEGIN
- Point_System(x, y);
- IF Succ(x) <= ScreenXmax_Sys THEN Fill(Succ(x),y);
- IF Pred(x) >= ScreenXmin_Sys THEN Fill(Pred(x),y);
- IF Succ(y) <= ScreenYmax_Sys THEN Fill(x, Succ(y));
- IF Pred(y) >= ScreenYmin_Sys THEN Fill(x, Pred(y));
- END
- END
- ELSE BEGIN
- SystemZurueckbringen;
- WriteLn(HeapPtr, RecurPtr, StackPtr);
- Halt
- END;
- END;
-
-
- PROCEDURE Fill2(x: x_Koord_Sys; y: y_Koord_Sys);
-
- CONST Stacksize = 5;
-
- VAR Stack: ARRAY(.1..Stacksize.) OF RECORD
- x, y:INTEGER;
- END;
- StackPointer: BYTE;
- oben_frei, unten_frei: BOOLEAN;
- xAnfang: x_Koord_Sys;
-
- PROCEDURE StackZuweisung(y: y_Koord_Sys; VAR Zustand: BOOLEAN);
-
- VAR vorher: BOOLEAN;
-
- BEGIN
- vorher := Zustand;
- Zustand := NOT Screenbit(x, y);
- IF NOT vorher AND Zustand
- AND (StackPointer <= Stacksize) THEN BEGIN
- Stack(.StackPointer.).x := x;
- Stack(.StackPointer.).y := y;
- StackPointer := Succ(StackPointer);
- END;
- END;
-
- BEGIN
- StackPointer := 1;
- REPEAT
- WHILE NOT Screenbit(x, y) AND (x > 0) DO x := Pred(x);
- x := Succ(x);
- xAnfang := x;
- oben_frei := FALSE; unten_frei := FALSE;
- WHILE NOT Screenbit(x, y) AND (x < ScreenXmax_Sys) DO BEGIN
- IF (y > 0) THEN StackZuweisung(Pred(y), oben_frei);
- IF (y < ScreenXmax_Sys) THEN StackZuweisung(Succ(y), unten_frei);
- x := Succ(x);
- END;
- Point_System(xAnfang, y);
- PlotLine(Pred(x), y);
- StackPointer := Pred(StackPointer);
- IF StackPointer > 0 THEN BEGIN
- x := Stack(.StackPointer.).x;
- y := Stack(.StackPointer.).y;
- END;
- UNTIL StackPointer < 1;
- END;
-
- BEGIN
- HeapzeigerSetzen;
- ClrScr; GotoXY(10,10);
- WriteLn('Es wird im Vordergrund gezeichnet!');
- SystemSicherstellen;
- GrafikEin;
- Position(80, 89); PlotLine(130, 89); PlotLine(130, 20);
- PlotLine( 80, 20); PlotLine( 80, 89);
- Position(99, 89); PlotLine( 99, 20);
- Fill(90, 60);
- Fill2(110,60);
- SystemZurueckbringen;
- END.
-