微机原理课程设计制作奥运五环效果Word下载.docx
《微机原理课程设计制作奥运五环效果Word下载.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计制作奥运五环效果Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
为了简便起见,考虑一个圆心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。
圆有“八对称性”,如下图所示。
显然,我们只需要知道了圆上的一个点的坐标(x,y),利用八对称性,我们马上就能得到另外七个对称点的坐标。
给出圆心的坐标(0,0)和半径R,求圆图像的最佳逼近点。
我们求的八分之一圆孤为(0,R)-(R√2,R√2),可知最大位移方向是x方向,x0=0,y0=R,每次对x自增,然后判断y是否减1,直到x>
=y为止(从点(0,R)到圆的八分之一处就有这种情况)。
误差量由F(x,y)=x^2+y^2-R^2给出。
先找递推关系,若当前d=F(x+1,y-0.5)>
0,则y须减1,则下一d值为
d=F(x+2,y-1.5)
=(x+2)^2+(y-1.5)^2-R^2
=d+2x-2y+5,
若当前d=F(x+1,y-0.5)<
0,则y不变,只有x增1,则下一d值为
d=F(x+2,y-0.5)
=d+2x+3。
d的初值,d0=F(1,R-0.5)=1.25-R,则可以对d-0.25进行判断,因为递推关系中只有整数运算,所以d-0.25>
0即d>
0.25,这和d>
0等价,所以d取初值1-R。
1.4程序流程图与程序代码
1.4.1流程图
1.4.2程序源代码
datasegment
mdw?
ndb?
;
像素颜色值
rdw30;
五环半径
x1dw80;
第一个圆的圆心
y1dw80
x2dw?
y2dw?
x3dw?
y3dw?
x4dw?
y4dw?
xdw?
ydw?
ddw?
adw?
bdw?
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
start:
movax,data
movds,ax;
movsi,0
movdi,0
movsi,x1
movx3,si
movsi,y1
movy3,si
callcircul
mainendp
;
*************五环绘制子程序***********
circulprocnear
pushsi
movah,0
moval,0dh
int10h
*************依次绘制正面五环***********
front:
movn,0eh;
第一个环,黄色
movx,0
movbx,r
movy,bx
movsi,x3
movx1,si
movsi,y3
movy1,si
callsingle_circle
movn,0ah;
第二个环,绿色
addy1,bx
shrbx,1
movn,04h;
第三个环,红色
movn,09h;
第四个环,蓝色
addx1,bx
movn,08h;
第五个环,灰色
jmpback
*********绘制背面面各环**********
back:
第一个环,红色
movn,08;
第二个环,灰色
第三个环,蓝色
第四个环,绿色
第五个环,黄色
popsi
calldelay
jmpfront
circulendp
*********逐步进给调整坐标,单环绘制**********
single_circleprocnear
movsi,1
subsi,r
movd,si;
d=1-r,x=0
lin3:
movsi,x;
si=x
movdi,y;
di=y=r
addsi,x1
adddi,y1
movdx,si;
dx=si+x1
movcx,di;
cx=di+y1
movsi,x;
movdi,y
cmpsi,di;
比较x与y,x>
y则八分之一圆弧绘制结束
jglin
callhua;
x<
y
cmpd,0;
jgelin1;
movsi,2
movax,0
movAX,SI
imulx
movsi,ax
addsi,3
addd,si
lin2:
incx
jmplin3
lin1:
movsi,2
movax,si
movdi,x
subdi,y
imuldi
addsi,5
decy
jmplin2
lin:
ret
single_circleendp
huadianprocnear;
写像素,al=颜色值,bh=页号
movah,0CH
moval,n
movbh,0
huadianendp
*********八分法绘制圆环**********
huaprocnear
callhuadian;
画第一点(x,y)
movx2,dx
movy2,cx
subdx,x1
subcx,y1
xchgdx,cx
adddx,x1
addcx,y1
画对称点(y,x)
movdx,x2
movcx,y2
movm,dx
addm,dx
subdx,m
画点(-y,x)
movm,cx
addm,cx
subcx,m
画点(-y,-x)
画点(x,-y)
画点(-x,-y)
画点(-x,y)
画点(y,-x)
calldelay
huaendp
***********延时***************
delayprocnear
pushdx
pushcx
movdx,2000
d1:
movcx,3000
d2:
loopd2
decdx
jnzd1
popcx
popdx
delayendp
codeends
endstart