热度 140|
data segment
m dw ?
n db ? ;像素颜色值
r dw 30 ;半径
x1 dw 80 ;圆的圆心
y1 dw 80
x2 dw ?
y2 dw ?
x3 dw ?
y3 dw ?
x4 dw ?
y4 dw ?
x dw ?
y dw ?
d dw ?
a dw ?
b dw ?
data ends
code segment
assume cs:code,ds:data
main proc far
start: mov ax,data
mov ds,ax ;
mov si,0
mov di,0
mov si,x1
mov x3,si
mov si,y1
mov y3,si
mov si,0
call circul
main endp
;*************五环绘制子程序***********
circul proc near
push si
mov ah,0
mov al,0dh
int 10h
;*************依次绘制正面五环***********
front:
mov n,0eh;第一个环,黄色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
call single_circle
mov n,0ah;第二个环,绿色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add y1,bx
add y1,bx
shr bx,1
add y1,bx
call single_circle
mov n,04h;第三个环,红色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add y1,bx
add y1,bx
add y1,bx
add y1,bx
add y1,bx
call single_circle
mov n,09h;第四个环,蓝色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add x1,bx
add y1,bx
shr bx,1
shr bx,1
add y1,bx
call single_circle
mov n,08h; 第五个环,灰色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add x1,bx
add y1,bx
add y1,bx
add y1,bx
shr bx,1
add y1,bx
shr bx,1
add y1,bx
call single_circle
jmp back
;*********绘制背面面各环**********
back:
mov n,04h;第一个环,红色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
call single_circle
mov n,08;第二个环,灰色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add y1,bx
add y1,bx
shr bx,1
add y1,bx
call single_circle
mov n,09h;第三个环,蓝色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add y1,bx
add y1,bx
add y1,bx
add y1,bx
add y1,bx
call single_circle
mov n,0ah;第四个环,绿色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add x1,bx
add y1,bx
shr bx,1
shr bx,1
add y1,bx
call single_circle
mov n,0eh; 第五个环,黄色
mov x,0
mov bx,r
mov y,bx
mov si,x3
mov x1,si
mov si,y3
mov y1,si
add x1,bx
add y1,bx
add y1,bx
add y1,bx
shr bx,1
add y1,bx
shr bx,1
add y1,bx
call single_circle
pop si
call delay
jmp front
circul endp
;*********逐步进给调整坐标,单环绘制**********
single_circle proc near
mov si,1
sub si,r
mov d,si ;d=1-r,x=0
lin3: mov si,x ;si=x
mov di,y ;di=y=r
add si,x1
add di,y1
mov dx,si ;dx=si+x1
mov cx,di ;cx=di+y1
mov si,x ;
mov di,y
cmp si,di ;比较x与y,x>y则八分之一圆弧绘制结束
jg lin
call hua ;x<y
cmp d,0 ;
jge lin1 ;
mov si,2
mov ax,0
mov AX,SI
imul x
mov si,ax
add si,3
add d,si
lin2: inc x
jmp lin3
lin1: mov si,2
mov ax,0
mov ax,si
mov di,x
sub di,y
imul di
mov si,ax
add si,5
add d,si
dec y
jmp lin2
lin:
ret
single_circle endp
huadian proc near ;写像素,al=颜色值,bh=页号
mov ah,0CH
mov al,n
mov bh,0
int 10h
ret
huadian endp
;*********八分法绘制圆环**********
hua proc near
call huadian ;画第一点 (x,y)
mov x2,dx
mov y2,cx
sub dx,x1
sub cx,y1
xchg dx,cx
add dx,x1
add cx,y1
call huadian ;画对称点(y,x)
mov dx,x2
mov cx,y2
sub cx,y1
sub dx,x1
xchg dx,cx
mov m,dx
add m,dx
sub dx,m
add dx,x1
add cx,y1
call huadian ;画点(-y,x)
sub cx,y1
mov m,cx
add m,cx
sub cx,m
add cx,y1
call huadian ;画点(-y,-x)
mov dx,x2
mov cx,y2
sub dx,x1
sub cx,y1
mov m,cx
add m,cx
sub cx,m
add cx,y1
add dx,x1
call huadian ;画点 (x,-y)
sub dx,x1
mov m,dx
add m,dx
sub dx,m
add dx,x1
call huadian ;画点(-x,-y)
mov dx,x2
mov cx,y2
sub dx,x1
sub cx,y1
mov m,dx
add m,dx
sub dx,m
add dx,x1
add cx,y1
call huadian ;画点 (-x,y)
mov dx,x2
mov cx,y2
sub dx,x1
sub cx,y1
xchg dx,cx
mov m,cx
add m,cx
sub cx,m
add dx,x1
add cx,y1
call huadian ;画点 (y,-x)
call delay
ret
hua endp
;***********延时***************
delay proc near
push dx
push cx
mov dx,2000
d1: mov cx,3000
d2: loop d2
dec dx
jnz d1
pop cx
pop dx
ret
delay endp
code ends
end start
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-5-4 03:11
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.