Брезенхем: Алгоритм построения окружности
Материал из SpeccyWiki
Версия от 16:02, 2 сентября 2015; NMI (обсуждение | вклад)
Процедура использует дополнительные данные, расположенные по адресу #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