Брезенхем: Алгоритм построения окружности — различия между версиями
Материал из SpeccyWiki
Goblinish (обсуждение | вклад) (Содержимое страницы заменено на «Статья удаленна из-за самоуправства рязанского пидора Димачки Быстров…») |
NMI (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | + | Процедура использует дополнительные данные, расположенные по адресу '''#6000-#63FF'''.Данные предназначены для построения точек. Перед использованием алгоритма необходимо вызвать '''mkbod'''. Входные параметры:,BC=YX координаты центра радиуса, A-радиус. | |
+ | Автор алгоритма-Busy. | ||
+ | |||
+ | пример вызова процедуры: | ||
+ | <code><pre> | ||
+ | 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 | ||
+ | |||
+ | </pre></code> | ||
+ | |||
+ | процедура рисования окружности | ||
+ | |||
+ | <code><pre> | ||
+ | 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 | ||
+ | </pre></code> | ||
+ | |||
+ | ссылки: | ||
+ | http://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма | ||
+ | http://www.codenet.ru/progr/video/alg/alg4.php | ||
+ | |||
+ | [[Категория:Программирование графики]] |
Текущая версия на 16:02, 2 сентября 2015
Процедура использует дополнительные данные, расположенные по адресу #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