Автор работы: Пользователь скрыл имя, 07 Декабря 2010 в 15:19, Не определен
Программа реализована на языке “Assembler”. Для вывода графики на экран используется прямое обращение к видеобуферу. Для достижения плавности прорисовки изображения применяется синхронизация с вертикальной развёрткой монитора.
mov si, 0
DRC:
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
add si, 6
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
add si, 6
CALL LINE
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
add si, 6
CALL LINE
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
add si, 6
CALL LINE
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
add si, 6
CALL LINE
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
add si, 6
CALL LINE
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
add si, 6
CALL LINE
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
add si, 6
CALL LINE
mov si, 12
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
CALL LINE
mov si, 24
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
mov si, 0
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
mov si, 30
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
CALL LINE
mov si, 18
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
CALL LINE
mov si, 6
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
mov si, 36
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
CALL LINE
mov si, 42
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X1, ax
mov Y1, bx
mov si, 24
mov ax, CUBE[si]
mov bx, CUBE[si+2]
mov dx, CUBE[si+4]
mov X, ax
mov Y, bx
mov Z, dx
CALL ROTX
CALL ROTY
CALL ROTZ
CALL PROJECT
mov ax, X2D
mov bx, Y2D
mov X2, ax
mov Y2, bx
CALL LINE
pop dx
pop bx
pop ax
pop cx
ret
ENDP DRAWCUBE
;Алгоритм Брезенхэма для линии.
;Суть
алгоритма заключается в том,
что мы на каждом шаге ;увеличиваем координату
X на единицу, и прибавляем к так ;называемой
«Ошибке» значение DelY, которое равно “Y2
– Y1. Если ;ошибка превышает LenX, то увеличиваем
координату Y (X) на ;единицу. Данный алгоритм
пригоден только в том случае, если
;X2 > X1 и расстояние по горизонтали (X2
– X1) больше расстояния ;по вертикали (Y2
– Y1). Иначе же, если X2 < X1, то к координате
;X не прибавляем единицу, а наоборот, отнимаем.
Если ;вертикальное расстояние больше
горизонтального, то переменные ;X и Y меняются
ролями: на каждом шаге увеличиваем Y на
единицу, ;а X увеличивается в зависимости
от «Ошибки».
LINE PROC
push cx
push ax
push bx
push dx
mov DelX, 1 ;Приращение X = 1
mov DelY, 1 ;Приращение Y = 1
mov ax, x2
cmp ax, x1
jge X2GX1 ;если X2 < X1
neg DelX ;DelX = -1
X2GX1:
mov ax, Y2
cmp ax, Y1
jge Y2GY1 ;Если Y2 < Y1
neg DelY ;DelY = -1
Y2GY1:
mov ax, X2
sub ax, x1
jns LENXG0
neg ax
LENXG0:
mov LenX, ax
mov ax, Y2
sub ax, Y1
jns LENYG0
neg ax
LENYG0:
mov LenY, ax
mov bx, LenX
cmp ax, bx
jg LenYGLenX
mov Leng, bx
jmp C1
LenYGLenX:
mov Leng, ax
C1:
cmp ax, bx
jg LYGLX ;Если ABS(X2-X1) > ABS(Y2-Y1)
mov ax, X1
mov bx, Y1
mov dx, LenX
neg dx
inc Leng
mov cx, Leng
shl LenX, 1
shl LenY, 1
CYCLE1:
mov X2D, ax ;X = X1
mov Y2D, bx ;Y = Y1
CALL PUTPIXEL ;Рисуем точку
add ax, DelX ;X = X + DelX
add dx, LenY ;D = D + 2*(Y2-Y1)
cmp dx, 0 ;Если D > 0
jle DL01 ;
sub dx, LenX ;D = D - 2*(X2-X1)
add bx, DelY ;Y = Y + DelY
DL01:
loop CYCLE1
jmp EXITLINE
LYGLX: ;Если ABS(X2-X1) <= ABS(Y2-Y1)
mov ax, X1
mov bx, Y1
mov dx, LenY
neg dx
inc Leng
mov cx, Leng
shl LenX, 1
shl LenY, 1
CYCLE2:
mov X2D, ax ;X = X1
mov Y2D, bx ;Y = Y1
CALL PUTPIXEL ;Рисуем точку
add bx, DelY ;Y = Y + DelY
add dx, LenX ;D = D + 2*(X2-X1)
cmp dx, 0 ;Если D > 0
jle DL02
sub dx, LenY ;D = D - 2*(Y2-Y1)
add ax, DelX ;X = X + DelX
DL02:
loop CYCLE2
EXITLINE:
pop dx
pop bx
pop ax
pop cx
ret