ИФК.: Евгений и Алексей Федяевы представили на рассмотрение читателей ZX РЕВЮ процедуру, взятую из boot REAL MASTER, и свою процедуру рисования круга.
КОРР.: В boote красиво горит надпись в верхней части экра
на. Формат картинки: справо побайтно, сверху вниз по 1 пиксельной строчке, без атрибутов.
Если IX указывает на пустую область памяти, то вся заданная область экрана сгорает.
|
ORG |
40000 |
GGG |
CALL |
FIRE |
|
CALL |
OG1 |
|
LD |
A, 127 |
|
IN |
A,(#FE) |
|
BIT |
0,A |
|
,RET |
Z |
|
JR |
GGG |
OG1 |
LD |
A,R |
; п.п. случайных |
|
LD |
L,A |
чисел |
|
|
LD |
A,R |
|
AND |
7 |
|
LD |
H,A |
|
PUSH |
HL |
|
POP |
IY |
|
RET |
|
FIRE LD IX.50000 ; адрес картинки
LD С,64 ; ее высота в PIX
LD HL,#4000 ; адрес вывода в экране LD E.L LD D.H OG2 PUSH HL
LD В, 14 ; ширина в байтах OG3 XOR (IY+0) OR (IY+1) если убрать эту команду,
AND (HL) то высота огня уменьшится.
OR (IX+1) если заменить на OR 0,
LD (DE),A то все по точкам сгорит. INC L INC Е INC IY
ШШШШШШШ
INC |
IX |
DJNZ |
OG3 |
POP |
HL |
LD |
E.L |
LD |
D.H |
CALL |
DAD1 |
DEC |
С |
JR |
NZ.OG2 |
RET |
|
DAD1 INC |
H |
; п.п. расчета адреса в |
LD |
A.H |
; дисплейном файле |
AND |
7 |
на PIX ниже |
|
RET |
NZ |
LD |
A.L |
ADD |
A,32 |
LD |
L.A |
RET |
С |
LD |
A,H |
SUB |
8 |
LD |
H,A |
RET
Теперь программа рисования круга без использования вычислений с плавающей точкой.
Алгоритм рисования круга взят из книги Роджерса Д. "Алгоритмические основы машинной графики" Перевод с англ. Москва, издательство "Мир", 1989.
В этой реализации алгоритма Брезенхема радиус круга ограничен 49-ю точками. При желании можно доработать программу как для работы с большим радиусом, так и для одновременного рисования восьми частей круга (здесь реализован вариант рисования одновременно 4 четвертей круга).
Теперь описание алгоритма. Основные положения: 1) круг находится в своей системе отсчета - его центр в координатах (0,0);
1) 2)
3)
4)
5)
6)
7)
8) 9)
строится он от координат (0,-R) до (R,0), т.е. дуга; остальные 3 дуги получаются отражением от координатных осей;
при расчетах следует выбрать
1 из 3 случаев: увеличивается только X, только Y, увеличиваются и X и Y;
этот алгоритм основывается на приближенности точки к идеалу. Для этого введем величину С. Возьмем, к примеру, смещение точки по диагонали, тогда: С=(Х+1)Ж2+(У+1Г2-КЛ2. начальное значение: С=(0+1Г2+(У+1Г2-КА2=2*(1-
R)
величины для горизонтального и .вертикального смещения: CG=(X+in+YA2-RA2=C-(2*Y+1);
(Y+1)A2-R~2=C-(2*X+1) выбирается, какая из них ближе к 0, т.е. наименьшую по абсолютной величине, т.к. по построению Х>0, Y<0 видно, что при C<=Y ближе будет CG, т.е. выбирается горизонтальное направление ОХ ближе CV, т.е. вертикальное, в остальных случаях диагональное.
Теперь сам алгоритм: X=0,Y=-R,C=2*(1-R)=2*(Y+1) PLOT (+-X,+-Y) ЕСЛИ Y=0 ТО ВЫХОД С1=С
ЕСЛИ С1>Х ТО НА ПУНКТ 8 Х=Х+1, С=С+2*Х+1 ЕСЛИ C1<=Y ТО НА ПУНКТ
2
Y=Y+1, C=C+2*Y+1 НА ПУНКТ 2
ритм
этом в следующий раз.