Брезенхем: Алгоритм построения окружности

Материал из SpeccyWiki
Перейти к: навигация, поиск

Процедура использует дополнительные данные, расположенные по адресу #6000-#63FF.Данные предназначены для построения точек. Перед использованием алгоритма необходимо вызвать mkbod. Входные параметры:,BC=YX координаты центра радиуса, A-радиус. Автор алгоритма-Busy.

пример вызова процедуры:

        ORG #8000

tabbod  =  #6000

begin
run  call  mkbod
  xor  a;радиус =0
slucka  push  af  
  ld  bc,#6080; координаты центра  
  call  circle  
  pop  af  
  add  a,#03;увеличим радиус на 3
  cp  #60  
  jr  c,slucka
stu jr stu
  ret
mkbod  ld  ix,tabbod  
  ld  hl,#4000  
mkbb1  ld  (ix+#00),h  
  inc  xh  
  ld  (ix+#00),l  
  dec  xh  
  call  dole  
  inc  xl  
  jr  nz,mkbb1  
  inc  xh  
  inc  xh  
mkbb2  ld  a,xl  
  rrca    
  rrca    
  rrca    
  and  #1f  
  ld  (ix+#00),a  
  ld  a,xl  
  cpl    
  add  a,a  
  add  a,a  
  add  a,a  
  or  #c7  
  ld  (mkbb3+1),a  
  xor  a  
mkbb3  set  1,a  
  inc  xh  
  ld  (ix+#00),a  
  dec  xh  
  inc  xl  
  jr  nz,mkbb2  
  ret    
      
dole  inc  h  
  ld  a,h  
  and  #07  
  ret  nz  
  ld  a,#20  
  add  a,l  
  ld  l,a  
  ret  c  
  ld  a,#f8  
  add  a,h  
  ld  h,a  
  ret  

процедура рисования окружности

circle  ld  d,a  
  or  a  
  jp  z,bod  
  inc  a  
  ld  h,b  
  ld  l,c  
  ld  (xy14+1),hl  
  ld  (xy15+1),hl  
  ld  (xy16+1),hl  
  ld  (xy17+1),hl  
  ld  xl,a  
  dec  a  
  ld  e,a  
  ld  a,d  
  add  a,b  
  ld  b,a  
  push  de  
  call  bod  
  pop  de  
  ld  a,b  
  sub  d  
  sub  d  
  ld  b,a  
  push  de  
  call  bod  
  pop  de  
  ld  a,b  
  add  a,d  
  ld  b,a  
  ld  a,c  
  add  a,e  
  ld  c,a  
  push  de  
  call  bod  
  pop  de  
  ld  a,c  
  sub  e  
  sub  e  
  ld  c,a  
  call  bod  
  ld  d,#00  
  ld  h,d  
  ld  l,d  
  ld  e,xl  
  ld  ix,#ff  
e130  inc  d  
  ld  c,d  
  ld  b,#00  
  add  hl,bc  
      
  ld  a,h  
  add  a,a  
  jr  nz,e130  
  push  hl  
  add  hl,hl  
  add  hl,hl  
  xor  a  
  ld  b,a  
  ld  c,e  
  sbc  hl,bc  
  pop  hl  
  jr  c,e130  
      
  ld  b,#00  
  ld  c,e  
  sbc  hl,bc  
  dec  e  
  push  hl  
  call  eelin  
  pop  hl  
  ld  xl,d  
  xor  a  
  xor  xh  
  jr  z,e130  
  ret    
      
eelin  inc  xl  
  ld  a,xl  
  cp  e  
  jr  z,eeln1  
  ld  a,e  
  cp  d  
  jr  nc,eeln1  
  ld  xh,d  
  ret    
eeln1  push  de  
  push  ix  
xy14  ld  bc,#5555  
  ld  a,b  
  add  a,e  
  ld  b,a  
  push  de  
  call  ccnn1  
  pop  de  
xy15  ld  bc,#5555  
  ld  a,b  
  sub  e  
  ld  b,a  
  call  ccnn1  
  pop  ix  
  pop  de  
  ld  a,d  
  cp  e  
  jr  nz,eeln2  
  cp  xl  
  ret  z  
eeln2  push  de  
  push  ix  
xy16  ld  bc,#5555  
  ld  a,c  
  add  a,e  
  ld  c,a  
  push  de  
  call  ccnn2  
  pop  de  
xy17  ld  bc,#5555  
  ld  a,c  
  sub  e  
  ld  c,a  
  call  ccnn2  
  pop  ix  
  pop  de  
  ret    
      
ccnn1  push  bc  
  push  de  
  ld  a,c  
  sub  d  
  ex  af,af  
  ld  a,c  
  sub  xl  
  ld  d,a  
  ex  af,af  
  ld  c,a  
  call  rovno  
  pop  de  
  pop  bc  
  ld  a,c  
  add  a,d  
  ld  d,a  
  ld  a,c  
  add  a,xl  
  ld  c,a  
  jp  rovno  

ccnn2  push  bc  
  push  de  
  ld  a,b  
  sub  d  
  ex  af,af  
  ld  a,b  
  sub  xl  
  ld  d,a  
  ex  af,af  
  ld  b,a  
  call  zvislo  
  pop  de  
  pop  bc  
  ld  a,b  
  add  a,d  
  ld  d,a  
  ld  a,b  
  add  a,xl  
  ld  b,a  
  jp  zvislo
;----------------------построение точки по координатам BC
bod  ld  h, #60;!------high tabbod;>
  ld  l,b  
  ld  d,(hl)  
  inc  h  
  ld  a,(hl)  
  inc  h  
  ld  l,c  
  or  (hl)  
  ld  e,a  
  inc  h  
  ld  a,(de)  
bodset  xor  (hl)  
  ld  (de),a  
  ret  

ссылки: http://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма http://www.codenet.ru/progr/video/alg/alg4.php