|
Move
#08
18 июля 1997 |
|
Алгоритм - Алгоритм рисования линий.

АЛГОРИТМЫ
──────────────────────────────────────────
Алгоритм рисования линии
(c) Ars
Для вывода прямой линии, соединяющей
любые две точки можно использовать
алгоритм Брезенхема. Смысл его состоит в
следующем: линия рассматривается как набор
сегментов двух типов: тех, которые
расположены диагонально, и тех, которые
расположены горизонтально или вертикально.
Для линий с наклоном больше 1 прямые
сегменты вертикальны, в противном случае
они горизонтальны. Первая задача алгоритма
состоит в определении наклона. Затем
рассчитывается выравнивающий фактор,
который следит, чтобы некоторое число
прямых сегментов имело большую длину, чем
остальные. И наконец, в цикле поочередно
выводятся диагональные и прямые сегменты.
Выравнивающий фактор поочередно принимает
то положительные, то отрицательные
значения, отмечая какой тип сегмента
выводится.
Процедура LINE выводит прямую линию
через 2 точки, координаты которых заданы в
регистрах DE (начало) и BC (конец).
Процедура PIXEL выводит точку с
координатами в рег. DE (D-Y, E-X).
LM1 LD H,E
JR PM1
LM2 LD L,C
JR PM2
LM3 LD H,A ;dY=0, т.е. прямые
LD (ST_XY),HL ;сегменты горизон-
EXX ;тальные
LD C,L ;большее расстояние
LD L,H ;в рег.C, меньшее в
JR PM3 ;рег. L
LINE EXX
LD DE,#1514 ;коды DEC D и INC D
LD BC,#1D1C ;коды DEC E и INC E
EXX
LD A,B
SUB D ;проверка Yк > Yн ?
EXX ;если да, то берем
JR NC,LM1 ;код INC D, иначе
NEG ;берем модуль расс-
LD H,D ;тояния и код DEC D
PM1 EXX
LD H,A ;получили │Yк-Yн│
LD A,C
SUB E ;проверка Xк > Xн ?
EXX ;если да, то берем
JR NC,LM2 ;код INC E, иначе
NEG ;берем модуль расс-
LD L,B ;тояния и код DEC E
PM2 LD (DI_XY),HL ;запись кодов
EXX
LD L,A ;получили │Xк-Xн│
SUB H ;определяем тип
EXX ;прямых сегментов
LD A,0
JR NC,LM3
LD L,A ;dX=0, т.е. прямые
PM0 LD (ST_XY),HL ;сегменты верти-
EXX ;кальные
LD C,H ;см. прим. к LM3
PM3 LD B,A ;A=0!
LD H,A ;A=0!
ADD HL,HL ;удваиваем меньшее
LD (ST_CO+1),HL ;расстояние
SBC HL,BC ;вычисляем:
OR A ;2 x меньшее минус
SBC HL,BC ;2 x большее
LD (DI_CO+1),HL
ADD HL,BC ;счетчик цикла в
LD A,C ;рег. A=большему
PIXEL PUSH HL ;расстояию
BIT 7,H ;HL-фактор вырав-
PUSH DE ;нивания, если
EX AF,AF' ;Н<0 (т.e H>127)
EX DE,HL ;то сегмент пря-
LD A,H ;мой, иначе -
AND 7 ;диагональный
OR #40 ;в регистре DE -
LD D,A ;текущие коорди-
RR H ;наты
RR H
RR H
LD A,H
AND #18
OR D
LD D,A
LD A,H
AND 7
RRCA
RRCA
RRCA
LD E,A ;расчет байта
LD A,L ;на экране, куда
AND 7 ;будет выводить-
LD C,A ;ся текущая точка
LD A,L
SRL A
SRL A
SRL A
OR E
LD E,A
LD HL,DATA_P ;расчет пикселя
LD A,L ;для текущей точки
ADD A,C
LD L,A
LD A,(DE)
OR (HL)
LD (DE),A ;рисуем точку
EX AF,AF'
POP DE
POP HL
JR Z,DI_XY ;вывод прямых
ST_XY DW 0 ;сегментов и
ST_CO LD BC,0 ;пересчет фактора
JR DECDIST ;выравнивания
DI_XY DW 0 ;вывод диагональных
DI_CO LD BC,0 ;сегментов и
DECDIST ADD HL,BC ;пересчет фактора
DEC A
JP P,PIXEL ;следующая точка
RET
DATA_P DB 128,64,32,16,8,4,2,1
Недостатком данной процедуры является то,
что max длина рассчитываемой линии - 127
точек. Блок данных DATA_P не должен
находиться на границе двух секторов!
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3