Move #08
18 июля 1997

Алгоритм - Алгоритм рисования линий.

<b>Алгоритм</b> - Алгоритм рисования линий.
                АЛГОРИТМЫ
──────────────────────────────────────────
         Алгоритм рисования линии
(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  не  должен
находиться на границе двух секторов!



Другие статьи номера:

Вступление - ZXNet в Минске.

Событие - О втором Минском сисипнике.

Письмо - Творческому коллективу газеты MOVE.

Взгляд - Вымирает ли Спектрум ? О возможных путях дальнейшего развития.

Хакерам - О строении стандартной дорожки дисковода.

Алгоритм - Алгоритм рисования линий.

Железо - Настройка сигнала INT.

Реклама - Реклама и объявления.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Разное - о хулиганских звонках.
Афоризмы - 10 лучших цитат из компьютерной прессы.
Introduction - Несколько авторских слов.
Застрял ? - Вторая часть "подсказок из подземелья" (The Bards of Tale).
Шутка - Снегопад был таким, что за два часа окно снаружи сплошь залепило снегом.

В этот день...   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