compiler/src/test/X11/tetris/Linie.Mod
Norayr Chilingarian 4b4c2c1454 tetris example added
Former-commit-id: ec7a685466
2014-02-03 17:01:10 +04:00

234 lines
4.8 KiB
Modula-2

MODULE Linie;
IMPORT XYplane := oocXYplane, In := compatIn;
VAR abbruch: BOOLEAN;
Zaehler,Wert1, Wert2, Wert3, Wert4,Wert5, Wert6, Wert7, Wert8,Ende: INTEGER;
(* Version 1.0 / 6.April 96 / Peter Brantschen *)
PROCEDURE Linie*(StartX,StartY,EndeX,EndeY: INTEGER);
VAR i,x,y,LaengeX,LaengeY: INTEGER;
BEGIN
LaengeX:=EndeX-StartX;
LaengeY:=EndeY-StartY;
IF LaengeX>=0 THEN
IF LaengeY>=0 THEN
FOR i:=0 TO LaengeX DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,1);
END;
END;
FOR i:=0 TO LaengeY DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,1);
END;
END;
ELSE
FOR i:=0 TO LaengeX DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,1);
END;
END;
FOR i:=LaengeY TO 0 DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,1);
END;
END;
END;
ELSE
IF LaengeY>=0 THEN
FOR i:=LaengeX TO 0 DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,1);
END;
END;
FOR i:=0 TO LaengeY DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,1);
END;
END;
ELSE
FOR i:=LaengeX TO 0 DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,1);
END;
END;
FOR i:=LaengeY TO 0 DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,1);
END;
END;
END;
END;
END Linie;
PROCEDURE LoescheLinie*(StartX,StartY,EndeX,EndeY: INTEGER);
VAR i,x,y,LaengeX,LaengeY: INTEGER;
BEGIN
LaengeX:=EndeX-StartX;
LaengeY:=EndeY-StartY;
IF LaengeX>=0 THEN
IF LaengeY>=0 THEN
FOR i:=0 TO LaengeX DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,0);
END;
END;
FOR i:=0 TO LaengeY DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,0);
END;
END;
ELSE
FOR i:=0 TO LaengeX DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,0);
END;
END;
FOR i:=LaengeY TO 0 DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,0);
END;
END;
END;
ELSE
IF LaengeY>=0 THEN
FOR i:=LaengeX TO 0 DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,0);
END;
END;
FOR i:=0 TO LaengeY DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,0);
END;
END;
ELSE
FOR i:=LaengeX TO 0 DO;
IF LaengeX#0 THEN
x:=StartX+i;
y:=StartY + (i*LaengeY)DIV LaengeX;
XYplane.Dot(x,y,0);
END;
END;
FOR i:=LaengeY TO 0 DO;
IF LaengeY#0 THEN
x:=StartX + (i*LaengeX) DIV LaengeY;
y:=StartY + i;
XYplane.Dot(x,y,0);
END;
END;
END;
END;
END LoescheLinie;
PROCEDURE Linie2(x1,y1,x2,y2: INTEGER);
VAR dx,dy,sx,sy,d,x,y: INTEGER;
BEGIN
dx:=ABS(x2-x1); IF (x2-x1)#0 THEN sx:=(x2-x1)DIV ABS(x2-x1); ELSE sx:=0; END;
dy:=ABS(y2-y1); IF (y2-y1)#0 THEN sy:=(y2-y1) DIV ABS(y2-y1); ELSE sy:=0; END;
d:=2*dy-dx; x:=x1; y:=y1;
XYplane.Dot(x,y,1);
WHILE x#x2 DO
IF (d>0) OR ((d=0)&(sy=1)) THEN
y:=y+sy; d:=d-2*dx;
END;
x:=x+sx; d:=d+2*dy;
XYplane.Dot(x,y,1);
END;
END Linie2;
PROCEDURE Fraktal(x1,y1,x2,y2: INTEGER);
BEGIN;
IF ~abbruch THEN
INC(Zaehler);
IF Zaehler>Ende THEN abbruch:=TRUE; END;
Linie2(x1,y1,x2,y2);
Fraktal(x1+ Wert1,y1+Wert2,x2+Wert3,y2+Wert4);
END;
END Fraktal;
PROCEDURE Fraktal4Eck(x1,y1,x2,y2,x3,y3,x4,y4: INTEGER);
BEGIN
IF ~abbruch THEN
INC(Zaehler);
IF Zaehler>Ende THEN abbruch:=TRUE; END;
Linie2(x1,y1,x2,y2);
Linie2(x2,y2,x3,y3);
Linie2(x3,y3,x4,y4);
Linie2(x4,y4,x1,y1);
Fraktal4Eck(x1+ Wert1,y1+Wert2,x2+Wert3,y2+Wert4,x3+ Wert5,y3+Wert6,x4+Wert7,y4+Wert8);
END;
END Fraktal4Eck;
PROCEDURE Start*;
BEGIN
XYplane.Open;
In.Open;
In.Int(Wert1); In.Int(Wert2); In.Int(Wert3); In.Int(Wert4);In.Int(Ende);
abbruch:=FALSE;
Zaehler:=0;
Fraktal(150,150,250,250);
END Start;
PROCEDURE Start4Eck*;
BEGIN
XYplane.Open;
In.Open;
In.Int(Wert1); In.Int(Wert2); In.Int(Wert3); In.Int(Wert4);
In.Int(Wert5); In.Int(Wert6); In.Int(Wert7); In.Int(Wert8);In.Int(Ende);
abbruch:=FALSE;
Zaehler:=0;
Fraktal4Eck(150,150,150,250,250,250,250,150);
END Start4Eck;
END Linie.