Код:
MODULE Circl;
IMPORT G := Graph, Basic;
VAR
KD, MD, x0, y0, R, i: INTEGER;
PROCEDURE Circ (x, y, Radius: INTEGER);
VAR
X,Y,A:INTEGER;
PROCEDURE Plot4;
VAR
ty:INTEGER;
BEGIN
ty:=(y+Y);
IF ty<0 THEN ty:=0 ELSIF ty>G.GetMaxY() THEN ty:=G.GetMaxY() END;
G.PutPixel(x +X,ty);
IF X#0 THEN G.PutPixel(x -X,ty); END;
ty:=(y-Y);
IF ty<0 THEN ty:=0 ELSIF ty>G.GetMaxY() THEN ty:=G.GetMaxY() END;
G.PutPixel(x +X,ty);
IF X#0 THEN G.PutPixel(x -X,ty); END;
END Plot4;
BEGIN
(*This is the entire algorithm:*)
Y:= Radius;
X:=0;
A := Radius DIV 2;
REPEAT
(*;Could just use Plot8*)
Plot4;X := X + 1;
A := A - X;
IF A<0 THEN A:=A+Y ; Y:=Y-1 END;
UNTIL X >= Y;
(*; Now more or less reverse the above to get the other eighth*)
A := -(Radius DIV 2) - 1;
Plot4;
REPEAT
A := A + Y;
Y := Y - 1;
IF A>0 THEN X:=X+1;A:=A-X;Plot4; END;
UNTIL ~(Y>=0);
END Circ;
BEGIN (*$MAIN*)
KD := G.ZX;
MD := G.ZXMono;
G.InitGraph(KD, MD, "");
G.SetBkColor(G.Green); G.SetColor(G.Black); G.ClearDevice;
Basic.OVER(1);
(* x0 := (G.GetMaxX() + 1) DIV 2;
y0 := (G.GetMaxY() + 1) DIV 2;*)
FOR i:=0 TO 20 DO
x0 := Basic.RND(-60,G.GetMaxX()+60);
y0 := Basic.RND(-60,G.GetMaxY()+60);
FOR R:=20 TO 60 BY 20 DO
Circ(x0, y0, R);
END;
END;
(*Flower(x0, y0, y0 DIV 2 * 3, 5, 1.0, 0.25, 0.1);*)
Basic.PAUSE(0);
G.EORFill;
G.CloseGraph
END Circl.
Код:
/*--------------------------------- Cut here ---------------------------------*/
export void Graph_EORFill (void)
{
__asm
LD L,#0X20
loop1$:
DEC L
LD H,#0X40
XOR A
LD C,#3
loop2$:
LD B,#8
LD DE,#32-7*256
loop3$:
XOR (HL)
LD (HL),A
INC H
XOR (HL)
LD (HL),A
INC H
XOR (HL)
LD (HL),A
INC H
XOR (HL)
LD (HL),A
INC H
XOR (HL)
LD (HL),A
INC H
XOR (HL)
LD (HL),A
INC H
XOR (HL)
LD (HL),A
INC H
XOR (HL)
LD (HL),A
ADD HL,DE
DJNZ loop3$
LD DE,#8*256-8*32
ADD HL,DE
DEC C
JR NZ,loop2$
DEC L
INC L
JR NZ,loop1$
RET
__endasm;
} //Graph_EORFill