汇编语言实现图形绘制——矩形、三角形等

汇编语言实现图形绘制

一、准备工作

1.INT 10H的功能

INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序。使用 INT 10H 中断服务程序时,先指定 AH 寄存器编,该编号表示欲调用的功用,然后再定义其它寄存器内容,当一切设定好之后再调用 INT 10H。下面是我们在程序中用到的指令:

AH=00H

AH=00/INT 10H 是用来设定显示模式的服务程序,AL 寄存器表示欲设定的模式

;AL部分模式说明
mov al,12h          ;640*480 256的图形模式:            
mov al,13h          ;320*200 256色的图形模式:;完整调用
mov al,13h          ;320*200 256色的图形模式:
mov ah,0            ;是用来设定显示模式的服务程序
int 10h

AH=0CH

AH=0Ch/INT 10H 是在绘图模式中显示一点 ( 也就是写入点像),而 AH=0DH/INT 10H 则是读取点像。

写入时,要写入位置 X 坐标存于 CX 寄存器,Y 坐标存于 DX 寄存器,颜色存于 AL 寄存器。对于汇编的显示窗口,左上角为原点,向右为X轴,越往右X数值越大;向下为Y轴,越往下Y数值越大。X、Y坐标的边界以及颜色的种类则和之前定义的显示模式相关。

显示模式X 座标Y 座标颜色
40~3190~1990、1
50~3190~1990~3
60~6390~1990、1

AH=0DH/INT 10H 则是读取某一位置之点像,您必须指定 CX、DX,而 INT 10H 会传回该位置点像之颜色。

;完整调用
mov cx,10             ;x坐标
mov dx,10             ;y坐标
mov al,1100b          ;淡红色
mov ah,0ch            ;写入点像
int 10h               ;调用中断
二进制数颜色例子二进制数颜色例子
0000黑色black1000灰色gray
0001蓝色blue1001淡蓝色light blue
0010绿色green1010淡绿色light green
0011青色cyan1000淡青色light cyan
0100红色red1100淡红色light red
0101紫红色magenta1101淡紫红色light magenta
0110棕色brown1110黄色yellow
0111银色light gray1111白色white

2.Bresenham直线算法

对于直线、竖线的绘制,方法比较简单

而对于斜线的绘制,则存在一些问题。因为我们的屏幕是由像素点构成,而像素点的坐标都是整数,但是在直线上每一点的坐标不一定是整数,所以我们将要对该点进行近似处理,选取屏幕上最接近该点的像素点进行绘制。

Bresenham直线算法就是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。

我们以0

若图,该算法的核心思想:

当前点为A(X,Y),由于K的限制性,下一个绘制的点为B(X+1,Y)或者C(X+1,Y+1)。而直线上的点为C点,该点介于B点和D点之间,所以我么就要判断C点是偏向于B点还是D点。其中一种方法是将(X+1,Y+1/2)带入直线方程F中:

若F(X+1,Y+1/2)> 0,则证明B、D之间的中点在直线上方,则选取B点为下一个绘制的像素点。

若F(X+1,Y+1/2)< 0,则证明B、D之间的中点在直线下方,则选取D点为下一个绘制的像素点。

在知道核心思想之后,为了提高运行效率,该算法通过一系列复杂的数学公式简化了运算方式(有兴趣的同学可以去了解一下),只会用到较为快速的整数加法、减法和位元移位就能完成上述操作,最终运算结果如下:

对于直线y=kx+b(已知两点(x1,y1)(x2,y2),设y2>y1,△y=y2-y1,△x=|x2-x1|)

推导过程:

P=△y-1/2 = f(x+1)-f(x)-1/2= kx+k-kx-1/2=k-1/2=△y/△x - 1/2   为了简化运算,两边同乘2△x,由于我们只需要看左边符号,所以忽略△x,最终结果如下:

P=2△y-△x

1、0

Pn=2△y-△x

若Pn < 0,下一个绘制点为(X+1,Y),Pn+1=Pn+2△y

若Pn >= 0,下一个绘制点为(X+1,Y+1),Pn+1=Pn+2(△y-△x)

2、K>1(Y+1,判断X)

Pn=2△y-△x

若Pn < 0,下一个绘制点为(X,Y+1),Pn+1=Pn+2△x

若Pn >= 0,下一个绘制点为(X+1,Y+1),Pn+1=Pn+2(△x-△y)

3、-1

Pn=2△y-△x

若Pn < 0,下一个绘制点为(X-1,Y),Pn+1=Pn+2△y

若Pn >= 0,下一个绘制点为(X-1,Y+1),Pn+1=Pn+2(△y-△x)

4、K<-1(Y+1(y2>y1),判断X)

Pn=2△y-△x

若Pn < 0,下一个绘制点为(X,Y+1),Pn+1=Pn+2△x

若Pn >= 0,下一个绘制点为(X-1,Y+1),Pn+1=Pn+2(△x-△y)

二、代码实现

1、直线

    ;横线            ;mov al,12h         ;640*480 256的图形模式:            mov al,13h          ;320*200 256色的图形模式:mov ah,0            ;是用来设定显示模式的服务程序mov cx,10           ;x坐标mov bx,100          ;终止x坐标mov dx,10           ;y坐标int 10hpheng:mov al,1100b     ;淡红色mov ah,0ch       ;写入点像inc cxcmp cx,bxint 10hjne pheng

运行结果:

2、竖线

    ;竖线;mov al,13h         ;320*200 256色的图形模式:;mov ah,0           ;是用来设定显示模式的服务程序mov cx,10           ;x坐标mov bx,100          ;终止x坐标mov dx,10           ;y坐标;int 10hpshu:mov al,1100b    ;淡红色mov ah,0ch      ;写入点像inc dxcmp dx,bxint 10hjne pshu

运行结果:

3、斜线

    mov al,13h          ;320*200 256色的图形模式:mov ah,0             ;是用来设定显示模式的服务程序   int 10hmov x1,20mov x2,70mov y1,10mov y2,200  mov ax,x2mov bx,x1cmp ax,bxjae dpos1sub bx,axmov s1,-1mov xd,bxjmp d1
dpos1:sub ax,bxmov s1,1mov xd,ax   
d1: mov ax,y2mov bx,y1cmp ax,bxjae dpos2    	;y2>=y1sub bx,ax    	;y2=0jl pneg         ;p<0ppos:   mov ax,xdmov bx,ydcmp ax,bxja ddpos1       ;xd>ydjbe ddneg1      ;xd<=ydddpos1: 		;0=0mov ax,x1		;x=x+1mov bx,s1add ax,s1mov x1,axmov ax,s2		;y=y+1mov bx,y1add bx,axmov y1,bxmov ax,p		;Pn+1=Pn+2(dy-dx)mov bx,xdmov cx,ydadd bx,bxadd cx,cxsub cx,bxadd ax,cxmov p,axjmp plotddneg1:			;k>1  或者  k<-1   同时  p>=0mov ax,y1 		;y=y+1inc axmov y1,axmov ax,s1		;x=x+1  或者  x=x-1mov bx,x1add bx,axmov x1,bxmov ax,p		;Pn+1=Pn+2(dx-dy)mov bx,xdmov cx,ydadd bx,bxadd cx,cxsub bx,cxadd ax,bxmov p,axjmp plotpneg:mov ax,xdmov bx,ydcmp ax,bxja ddpos2       ;xd>ydjbe ddneg2      ;xd<=yd   ddpos2:			;01  或者  k<-1   同时  p<0mov ax,y1 		;y=y+1inc axmov y1,axmov ax,p		;Pn+1=Pn+2dxmov bx,xdadd bx,bxadd ax,bxmov p,axjmp plotplot:mov cx,x1		;X坐标mov dx,y1		;Y坐标cmp cx,x2		;是否绘图完毕jne pxie

运行结果:

由于分辨率较低,所以斜线比较粗糙

根据上述程序即可完成三角形、矩形等图形的绘制:

将上述程序封装为子程序,三角形即可调用两次斜线子程序,一次横线子程序完成绘制;矩形可调用两次横线、两次竖线子程序完成绘制。

在绘制等边三角形时,由于等边三角形具有其特殊性,所以在代码方面可存在一定优化,如果感兴趣可看下篇文章。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部