	subroutine ring
#
# generiert einen Ring um den Mittelpunkt (x0,y0) mit dem Aussenradius r
# und dem Innenradius r-1.
# Das Grauwertbild steht in Bank 1 ab Adresse adrb. xanz und yanz sind
# die Bildgrenzen (s. Common Block bild).
# Die Punkte im Bild bekommen den Grauwert g.
#
# Verfahren nach: M.Doros  Algorithms for Generation of Discrete Circles,
#                 Rings, and Disks  CGIP 10 (1979) p.366-371
#
# Externe Routinen, die nicht in FORLIB sind:
# Name		File,Bibliothek
# storeb	BANKLIB		schreibt ein Byte in Bank 1
#				(verwendet in Subroutine plot)
#
# Entwurf und Programmierung	A.Herrmann	28.12.83
#
byte	g		# Grauwert
#
integer	r,s		# Radius, Fehler
integer	octant		# Oktant-Kennziffer
integer	x0,y0		# Mittelpunkt
integer	x,y		# Punktkoord.
#
common	/algor/r,g,s,octant,x0,y0,x,y
#
x=r ; y=0 ; s=r
call plot(x,y)
do octant=1,8
[	if (mod(octant,2)==1) call rfsec
	else call rbsec
]
return
end


	subroutine rfsec
#
byte	g		# Grauwert
#
integer	r,s		# Radius, Fehler
integer	octant		# Oktant-Kennziffer
integer	x0,y0		# Mittelpunkt
integer	x,y		# Punktkoord.
#
common	/algor/r,g,s,octant,x0,y0,x,y
#
s=s-2*x
repeat
[	s=s+2*y+1 ; y=y+1
	if (s>=0) [ s=s-2*x+2 ; x=x-1 ]
	if (s+2*r+1-2*x >= 0) call plot(x-1,y)
	call plot(x,y)
] until (y>>x)
return
end


	subroutine rbsec
#
byte	g		# Grauwert
#
integer	r,s		# Radius, Fehler
integer	octant		# Oktant-Kennziffer
integer	x0,y0		# Mittelpunkt
integer	x,y		# Punktkoord.
#
common	/algor/r,g,s,octant,x0,y0,x,y
#
s=s+2*x
repeat
[	s=s-2*y+1 ; y=y-1
	if (s<<0) [ s=s+2*x+2 ; x=x+1 ]
	if (x<>y) if (s+2*r+1-4*x >= 0) call plot(x-1,y)
	call plot(x,y)
] until (y<<0)
return
end


	subroutine plot(x,y)
#
byte	g		# Grauwert
#
integer	adrb,adr	# Adresse in Bank 1
integer	xanz,yanz	# Bildgrenzen
integer r,s		# Radius, Fehler
integer	octant		# Oktant-Kennziffer
integer	x0,y0		# Mittelpunkt
integer	x,y		# Punktkoord.
integer xp,yp
#
common	/bild/adrb,xanz,yanz
common	/algor/r,g,s,octant,x0,y0
#
     if (octant==1) [ xp=x0+x ; yp=y0+y ]
else if (octant==2) [ xp=x0+y ; yp=y0+x ]
else if (octant==3) [ xp=x0-y ; yp=y0+x ]
else if (octant==4) [ xp=x0-x ; yp=y0+y ]
else if (octant==5) [ xp=x0-x ; yp=y0-y ]
else if (octant==6) [ xp=x0-y ; yp=y0-x ]
else if (octant==7) [ xp=x0+y ; yp=y0-x ]
else if (octant==8) [ xp=x0+x ; yp=y0-y ]
adr=adrb+(xp-1)*yanz+yp-1
call storeb(g,adr)
return
end
