mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-07 01:02:24 +00:00
234 lines
4.8 KiB
Modula-2
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.
|
|
|
|
|
|
|