Растолкуйте пожалуйста, почему в алгоритме Брезенхема для рисования линии (http://www.kgraph.narod.ru/lectures/2_4.htm) идет проверка только на Х<Х2 ? Если у меня по оси Y расстояние больше чем по Х, то линия рисуется только до точки Х2 и все. А дальше......?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Stoune 29 июля 2004 г. 13:52

Вот текст програмки на Бейсике в которой я попытался это реализовать.

------------------------ LINEBRES.BAS ------------------
SCREEN 9
x1 = 0: y1 = 0: x2 = 50: y2 = 180

5 dx = x2 - x1: dy = y2 - y1
d = 2 * dx - dy: x = x1: y = y1
10 PSET (x, y), 3
IF d < 0 THEN w = 2 * dy: GOTO 20
w = 2 * (dy - dx): y = y + 1
20 d = d + w: x = x + 1
IF x > x2 THEN END
GOTO 10
----------------------------------------------------------
Все хорошо работет при условии X2>Y2
Может я чего-то не так сделал?


Вот этот же алгоритм на Ассемблере для PIC16F84

----------------------------------------------------------
clrf d_sign
; Dx=X2-X1, x=X1
movf X1,w
movwf x
subwf X2,w
movwf Dx

; Dy=Y2-Y1, y=Y1
movf Y1,w
movwf y
subwf Y2,w
movwf Dy

; d=2Dx-Dy
bcf STATUS,C
rlf Dx,w
movwf d ; 2*Dx
movf Dy,w
subwf d,f ; 2Dx-Dy
btfss STATUS,C
bsf d_sign,7 ; -

M call Drive

;
btfsc d_sign,7
goto M1 ; if d<0 goto M1

movf Dx,w ; if d>0 v=2(Dy-Dx)
subwf Dy,w
movwf TEMP ; Dy - Dx
bcf STATUS,C
rlf TEMP,w ; 2 * ( )
movwf v
incf y,f ; y=y+1
goto M2

M1 bcf STATUS,C ; if d<0 v=2Dy
rlf Dy,w
movwf v

M2 addwf d,f ; d=d+v
incf x,f ; x=x+1
MOVF X2,w
SUBWF x,w
BTFSC STATUS,C
return ; если x > X2
goto M

Drive bcf PB,0
bsf PB,0
return
-----------------------------------------------------------
Подпрограмма Drive тестовая, но все равно линия ограничивается осью Х

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru